Пересечение отрезков на плоскости - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Подскажите, пожалуйста, нужно определить пересекаются ли отрезки, если да, то не наложены ли они друг на друга (хотя бы частично). В моем коде не предусмотрено только наложение, ибо не знаю как его сделать
Листинг программы
  1. var
  2. k1,k2: real;
  3. x1,y1,x2,y2,x3,y3,x4,y4: real;
  4. x,y: real;
  5. function per(): boolean;
  6. var
  7. k1, k2, k3, k4: real;
  8. begin
  9. k1 := (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
  10. k2 := (x4 - x3) * (y2 - y3) - (y4 - y3) * (x2 - x3);
  11. k3 := (x2 - x1) * (y1 - y1) - (y2 - y1) * (x3 - x1);
  12. k4 := (x2 - x1) * (y2 - y1) - (y2 - y1) * (x4 - x1);
  13. per := (k1 * k2 <= 0) and (k3 * k4 <= 0);
  14. end;
  15. begin
  16. readln(x1,y1,x2,y2);
  17. readln(x3,y3,x4,y4);
  18. if(per)then
  19. writeln(2)
  20. else if (((x1<=x)and(x2>=x)and(x3<=x)and(x4>=x))or((y1<=y)and(y2>=y)and(y3<=y)and(y4>=y))) then
  21. writeln(1)
  22. else
  23. writeln(0);
  24. readln;
  25. end.

Решение задачи: «Пересечение отрезков на плоскости»

textual
Листинг программы
  1. type
  2.   point = record
  3.     x, y: integer;
  4.   end;
  5.   otr = record
  6.     x, y: point;
  7.   end;
  8.  
  9. var
  10.   a,b,c,d: point;
  11.  
  12. function bts(a,b,c: point): boolean;
  13. var
  14.   x1, x2,x3,y1,y2,y3: integer;
  15.   a1, b1: real;
  16. begin
  17.   x1 := a.x;
  18.   y1 := a.y;
  19.   x2 := b.x;
  20.   y2 := b.y;
  21.   x3 := c.x;
  22.   y3 := c.y;
  23.   if(x1=x2)then begin
  24.     writeln(x1, x2);
  25.     if((y3>=y1)and(y3<=y2)) or((y3<=y1)and(y3>=y2)) then bts := true
  26.       else bts := false
  27.   end
  28.     else begin
  29.       a1:=(y1-y2)/(x1-x2);
  30.       b1:=((y1+y2)-a1*(x1+x2))/2;
  31.       if (y3 = a1*x3+b1) and (x3 > x1) and (x3 < x2) or (y3 = a1*x3+b1) and (x2 > x1) and (x3 < x1)then bts := true
  32.         else bts := false;
  33.     end;
  34.   end;
  35.  
  36. function sign(n: real): integer;
  37. begin
  38.   if(n > 0) then sign := 1
  39.     else if(n < 0) then sign := -1
  40.       else sign := 0;
  41. end;
  42.  
  43. function cp(a, b, c, d: point): integer;
  44.  
  45.   var
  46.     vec1, vec2: point;
  47.   begin
  48.     vec1.x := (b.x -a.x);
  49.     vec1.y := (b.y -a.y);
  50.     vec2.x := (d.x -c.x);
  51.     vec2.y := (d.y -c.y);
  52.     cp := vec1.x * vec2.y - vec1.y * vec2.x;
  53.   end;
  54.  
  55. begin
  56.   read(a.x, a.y, b.x, b.y);
  57.   read(c.x, c.y, d.x, d.y);
  58.   if (cp(a, b, c, d) <> 0) and (sign(cp(a, b, a, c)) <> sign(cp(a, b, a, d))) and (sign(cp(c, d, c, a)) <> sign(cp(c, d, c, b))) then
  59.     writeln(1)
  60.   else if   (bts(a, c, d)) or (bts(b, c, d)) or (bts(c, a, b)) or (bts(d, a, b))   then
  61.     writeln(2)
  62.   else
  63.     writeln(0);
  64.   readln;
  65.   readln;
  66. end.

Объяснение кода листинга программы

  1. Переменные типа point используются для представления точек на плоскости и содержат значения координат x и y.
  2. Переменные типа otr используются для представления отрезков на плоскости и содержат значения координат точек начала и конца отрезка.
  3. В функции bts(a,b,c: point): boolean; происходит проверка, пересекаются ли отрезки a-b и b-c. Если пересекаются, то функция возвращает true, иначе - false.
  4. В функции sign(n: real): integer; определяется знак числа n.
  5. В функции cp(a, b, c, d: point): integer; вычисляется скалярное произведение векторов ab и cd, которое используется для определения, являются ли отрезки a-b и c-d параллельными или пересекающимися.
  6. В основной части программы считываются координаты точек a, b, c и d, затем вызывается функция cp(a, b, c, d) для вычисления скалярного произведения векторов ab и cd.
  7. Если скалярное произведение не равно нулю и знаки скалярных произведений векторов ab и cd с векторами ca и cb соответственно различны, то это означает, что отрезки a-b и c-d пересекаются.
  8. Если условие из пункта 7 выполняется, то выводится сообщение 1, иначе проверяется, пересекаются ли отрезки a-b и c-d с помощью функции bts(a, c, d) или bts(b, c, d).
  9. Если условие из пункта 8 выполняется, то выводится сообщение 2, иначе выводится сообщение 0, что означает, что отрезки не пересекаются.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы