Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 12

Напечатать координаты всех точек пересечения отрезков

17.04.2011, 13:33. Показов 1831. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны четыре отрезка a, b, c, d, заданные координатами их концов. Напечатать координаты всех точек пересечения этих отрезков. Вычисление координат пересечения двух отрезков оформить в виде процедуры.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.04.2011, 13:33
Ответы с готовыми решениями:

Найти координаты точек пересечения прямой и окружности
1) на цикл if Найти координаты точек пересечения прямой y=kx+b и окружности радиусом R и с центром в начале координат. В каких...

Напечатать координаты точки пересечения прямых
4.Две прямые описываются уравнениями a1x+b1y+c1=0, a2x+b2y+c2+0. Напечатать координаты точки пересечения этих прямых либо сообщить, что эти...

Определить, пересекаются ли окружности, в этом случае вычислить координаты точек их пересечения
Даны две окружности одинакового радиуса R , заданные координатами их центров (X1Y1) (X2Y2) -целыми числами. Определить пересекаются ли они,...

8
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.04.2011, 15:33
Примерно так, потестируй....

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
uses crt;
type point=record{точка с координатами}
           x,y:real;
           end;
     otr=record{отрезок с 2 концами}
         k1,k2:point;
         end;
{проверяем пересекаются ли 2 отрезка}
function Peres(o1,o2:otr):boolean;
var v1,v2,v3,v4:real;
begin
v1:=(o2.k2.x-o2.k1.x)*(o1.k1.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k1.x-o2.k1.x);
v2:=(o2.k2.x-o2.k1.x)*(o1.k2.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k2.x-o2.k1.x);
v3:=(o1.k2.x-o1.k1.x)*(o2.k1.y-o1.k1.y)-(o1.k1.y-o1.k1.y)*(o2.k1.x-o1.k1.x);
v4:=(o1.k2.x-o1.k1.x)*(o2.k2.y-o1.k1.y)-(o1.k2.y-o1.k1.y)*(o2.k2.x-o1.k1.x);
Peres:=(v1*v2<0) and (v3*v4<0);
end;
{Точка пересечения}
procedure Tochka(o1,o2:otr);
var x,y:real;
begin
x:=-((o1.k1.x*o1.k2.y-o1.k2.x*o1.k1.y)*(o2.k2.x-o2.k1.x)
   -(o2.k1.x*o2.k2.x-o2.k2.x*o2.k1.y)*(o1.k2.x-o1.k1.x))/
   ((o1.k1.y-o1.k2.y)*(o2.k2.x-o2.k1.x)-(o2.k1.y-o2.k2.y)*(o1.k2.x-o1.k1.x));
y:=((o2.k1.y-o2.k2.y)*(-x)-(o2.k1.x*o2.k2.y-o2.k2.x*o2.k1.y))/(o2.k2.x-o2.k1.x);
writeln('x=',x:5:2,' y=',y:5:2);
end;
var t:array[1..4] of otr;
    n,i,j,k:byte;
begin
clrscr;
writeln('Введите координаты концов 4х отрезков:');
for i:=1 to 4 do
 begin
  writeln('Отрезок ',chr(i+96));
  write('x1=');readln(t[i].k1.x);
  write('y1=');readln(t[i].k1.y);
  write('x2=');readln(t[i].k2.x);
  write('y2=');readln(t[i].k2.y);
 end;
writeln('Точки пересечения отрезков:');
k:=0;
for i:=1 to 3 do
for j:=i+1 to 4 do
if Peres(t[i],t[j]) then
 begin
  k:=1;
  Tochka(t[i],t[j]);
 end;
if k=0 then write('Точек пересечения нет');
readln
end.
1
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 12
17.04.2011, 16:36  [ТС]
написано очень хорошо ,
но есть ошибка при выводе точек пересечения.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.04.2011, 16:59
Забыл про горизонтальные и вертикальные отрезки, все остальное вроде по формуле, но нужно проверить на всяких косых отрезках, на параллельных осям считает правильно.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
uses crt;
const e=0.001;
type point=record
           x,y:real;
           end;
     otr=record
         k1,k2:point;
         end;
{проверяем пересекаются ли 2 отрезка}
function Peres(o1,o2:otr):boolean;
var v1,v2,v3,v4:real;
begin
v1:=(o2.k2.x-o2.k1.x)*(o1.k1.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k1.x-o2.k1.x);
v2:=(o2.k2.x-o2.k1.x)*(o1.k2.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k2.x-o2.k1.x);
v3:=(o1.k2.x-o1.k1.x)*(o2.k1.y-o1.k1.y)-(o1.k1.y-o1.k1.y)*(o2.k1.x-o1.k1.x);
v4:=(o1.k2.x-o1.k1.x)*(o2.k2.y-o1.k1.y)-(o1.k2.y-o1.k1.y)*(o2.k2.x-o1.k1.x);
Peres:=(v1*v2<0) and (v3*v4<0);
end;
{Точка пересечения}
procedure Tochka(o1,o2:otr);
var x,y:real;
begin
if(abs(o1.k1.x-o1.k2.x)<e)and(abs(o2.k1.y-o2.k2.y)<e)then
   begin
    x:=o1.k1.x;
    y:=o2.k1.y;
   end
  else if(abs(o2.k1.x-o2.k2.x)<e)and(abs(o1.k1.y-o1.k2.y)<e)then
   begin
    x:=o2.k1.x;
    y:=o1.k1.y;
   end
  else
   begin
    x:=-((o1.k1.x*o1.k2.y-o1.k2.x*o1.k1.y)*(o2.k2.x-o2.k1.x)
       -(o2.k1.x*o2.k2.x-o2.k2.x*o2.k1.y)*(o1.k2.x-o1.k1.x))/
       ((o1.k1.y-o1.k2.y)*(o2.k2.x-o2.k1.x)-(o2.k1.y-o2.k2.y)*(o1.k2.x-o1.k1.x));
    y:=((o2.k1.y-o2.k2.y)*(-x)-(o2.k1.x*o2.k2.y-o2.k2.x*o2.k1.y))/(o2.k2.x-o2.k1.x);
   end;
writeln('x=',x:5:2,' y=',y:5:2);
end;
var t:array[1..4] of otr;
    n,i,j,k:byte;
begin
clrscr;
writeln('Введите координаты концов 4х отрезков:');
for i:=1 to 4 do
 begin
  writeln('Отрезок ',chr(i+96));
  write('x1=');readln(t[i].k1.x);
  write('y1=');readln(t[i].k1.y);
  write('x2=');readln(t[i].k2.x);
  write('y2=');readln(t[i].k2.y);
 end;
writeln('Точки пересечения отрезков:');
k:=0;
for i:=1 to 3 do
for j:=i+1 to 4 do
if Peres(t[i],t[j]) then
 begin
  k:=1;
  Tochka(t[i],t[j]);
 end;
if k=0 then write('Точек пересечения нет');
readln
end.
1
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 12
17.04.2011, 17:51  [ТС]
У тебя получилось прога супер , но правда есть замечания при пересечении косых отрезков .
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.04.2011, 18:28
Приведи пример вводимых координат и какие должны быть координаты точек пересечения, где неправильно.
0
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 12
17.04.2011, 19:42  [ТС]
вот например a(2,6,4,6) b(3,4,6,4) c(5,2,8,2) d(1,8,8,1) и вроде точки пересечения должны
быть (3,6) (5,4) (7,2).....это я на бумажке набросал....
а выводит : (2,7) (6,3)
может это у меня что-то неправильно ...
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.04.2011, 19:54
Вот так еще попробуйте, разложил на действия, а то что-то запутался.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
uses crt;
type point=record
           x,y:real;
           end;
     otr=record
         k1,k2:point;
         end;
{проверяем пересекаются ли 2 отрезка}
function Peres(o1,o2:otr):boolean;
var v1,v2,v3,v4:real;
begin
v1:=(o2.k2.x-o2.k1.x)*(o1.k1.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k1.x-o2.k1.x);
v2:=(o2.k2.x-o2.k1.x)*(o1.k2.y-o2.k1.y)-(o2.k2.y-o2.k1.y)*(o1.k2.x-o2.k1.x);
v3:=(o1.k2.x-o1.k1.x)*(o2.k1.y-o1.k1.y)-(o1.k1.y-o1.k1.y)*(o2.k1.x-o1.k1.x);
v4:=(o1.k2.x-o1.k1.x)*(o2.k2.y-o1.k1.y)-(o1.k2.y-o1.k1.y)*(o2.k2.x-o1.k1.x);
Peres:=(v1*v2<0) and (v3*v4<0);
end;
{Точка пересечения}
procedure Tochka(o1,o2:otr);
var a,b,c,d,e,f,
    dt,ds,det,t,s: real;
begin 
a:=o1.k2.x-o1.k1.x;
b:=o2.k1.x-o2.k2.x;
c:=o2.k1.x-o1.k1.x;
d:=o1.k2.y-o1.k1.y;
e:=o2.k1.y-o2.k2.y;
f:=o2.k1.y-o1.k1.y;
 
det:=a*e-b*d;
dt:=c*e-f*b;
ds:=a*f-c*d;
t:=dt/det; 
s:=ds/det; 
writeln('x=',o1.k1.x*(1-t)+o1.k2.x*t:0:2,'  y=', o1.k1.y*(1-t)+o1.k2.y*t:0:2);
end;
var t:array[1..4] of otr;
    n,i,j,k:byte;
begin
clrscr;
writeln('Введите координаты концов 4х отрезков:');
for i:=1 to 4 do
 begin
  writeln('Отрезок ',chr(i+96));
  write('x1=');readln(t[i].k1.x);
  write('y1=');readln(t[i].k1.y);
  write('x2=');readln(t[i].k2.x);
  write('y2=');readln(t[i].k2.y);
 end;
writeln('Точки пересечения отрезков:');
k:=0;
for i:=1 to 3 do
for j:=i+1 to 4 do
if Peres(t[i],t[j]) then
 begin
  k:=1;
  Tochka(t[i],t[j]);
 end;
if k=0 then write('Точек пересечения нет');
readln
end.
Добавлено через 1 минуту
Сейчас вроде сходится...
1
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 12
17.04.2011, 19:59  [ТС]
Puporev, написано гениально , всё сходится , большое спасибо !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2011, 19:59
Помогаю со студенческими работами здесь

Нужна формула координат точек пересечения отрезков
Напишите пожалуйста формулу нахождения координат точек пересечения отрезков с заданными координатами их концов

Найти координаты точек пересечения
1 Даны координаты двух точек A(x1,y1) и B(x2,y2) в прямоугольной системе координат. Какая из этих точек находится дальше: а) от начала...

В одномерных массивах X и Y хранятся соответствующие координаты N точек плоскости. Напечатать номера точек в порядке их удаления от (0,0)
В одномерных массивах X и Y хранятся соответствующие координаты N точек плоскости. Напечатать номера точек в порядке их удаления от начала...

Найти координаты точек пересечения прямой.
Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром в начале координат. В каких координатных четвертях...

Найти координаты точек пересечения прямой
Помогите пожалуйста) Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром в начале координат. Если точек...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru