Пересечение отрезков на плоскости - Free Pascal
Формулировка задачи:
Подскажите, пожалуйста, нужно определить пересекаются ли отрезки, если да, то не наложены ли они друг на друга (хотя бы частично). В моем коде не предусмотрено только наложение, ибо не знаю как его сделать
Листинг программы
- var
- k1,k2: real;
- x1,y1,x2,y2,x3,y3,x4,y4: real;
- x,y: real;
- function per(): boolean;
- var
- k1, k2, k3, k4: real;
- begin
- k1 := (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
- k2 := (x4 - x3) * (y2 - y3) - (y4 - y3) * (x2 - x3);
- k3 := (x2 - x1) * (y1 - y1) - (y2 - y1) * (x3 - x1);
- k4 := (x2 - x1) * (y2 - y1) - (y2 - y1) * (x4 - x1);
- per := (k1 * k2 <= 0) and (k3 * k4 <= 0);
- end;
- begin
- readln(x1,y1,x2,y2);
- readln(x3,y3,x4,y4);
- if(per)then
- writeln(2)
- 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
- writeln(1)
- else
- writeln(0);
- readln;
- end.
Решение задачи: «Пересечение отрезков на плоскости»
textual
Листинг программы
- type
- point = record
- x, y: integer;
- end;
- otr = record
- x, y: point;
- end;
- var
- a,b,c,d: point;
- function bts(a,b,c: point): boolean;
- var
- x1, x2,x3,y1,y2,y3: integer;
- a1, b1: real;
- begin
- x1 := a.x;
- y1 := a.y;
- x2 := b.x;
- y2 := b.y;
- x3 := c.x;
- y3 := c.y;
- if(x1=x2)then begin
- writeln(x1, x2);
- if((y3>=y1)and(y3<=y2)) or((y3<=y1)and(y3>=y2)) then bts := true
- else bts := false
- end
- else begin
- a1:=(y1-y2)/(x1-x2);
- b1:=((y1+y2)-a1*(x1+x2))/2;
- 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
- else bts := false;
- end;
- end;
- function sign(n: real): integer;
- begin
- if(n > 0) then sign := 1
- else if(n < 0) then sign := -1
- else sign := 0;
- end;
- function cp(a, b, c, d: point): integer;
- var
- vec1, vec2: point;
- begin
- vec1.x := (b.x -a.x);
- vec1.y := (b.y -a.y);
- vec2.x := (d.x -c.x);
- vec2.y := (d.y -c.y);
- cp := vec1.x * vec2.y - vec1.y * vec2.x;
- end;
- begin
- read(a.x, a.y, b.x, b.y);
- read(c.x, c.y, d.x, d.y);
- 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
- writeln(1)
- else if (bts(a, c, d)) or (bts(b, c, d)) or (bts(c, a, b)) or (bts(d, a, b)) then
- writeln(2)
- else
- writeln(0);
- readln;
- readln;
- end.
Объяснение кода листинга программы
- Переменные типа point используются для представления точек на плоскости и содержат значения координат x и y.
- Переменные типа otr используются для представления отрезков на плоскости и содержат значения координат точек начала и конца отрезка.
- В функции bts(a,b,c: point): boolean; происходит проверка, пересекаются ли отрезки a-b и b-c. Если пересекаются, то функция возвращает true, иначе - false.
- В функции sign(n: real): integer; определяется знак числа n.
- В функции cp(a, b, c, d: point): integer; вычисляется скалярное произведение векторов ab и cd, которое используется для определения, являются ли отрезки a-b и c-d параллельными или пересекающимися.
- В основной части программы считываются координаты точек a, b, c и d, затем вызывается функция cp(a, b, c, d) для вычисления скалярного произведения векторов ab и cd.
- Если скалярное произведение не равно нулю и знаки скалярных произведений векторов ab и cd с векторами ca и cb соответственно различны, то это означает, что отрезки a-b и c-d пересекаются.
- Если условие из пункта 7 выполняется, то выводится сообщение
1
, иначе проверяется, пересекаются ли отрезки a-b и c-d с помощью функции bts(a, c, d) или bts(b, c, d). - Если условие из пункта 8 выполняется, то выводится сообщение
2
, иначе выводится сообщение0
, что означает, что отрезки не пересекаются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д