Найти пересечение двух ОТРЕЗКОВ каждый из которых ограничен двумя точками - C (СИ)
Формулировка задачи:
Написал подобную программу для нахождения пересечения прямых а для пересечения отрезков не понимаю как сделать.буду признателен если подскажете как изменить мою прогу для нахождения пересечения.
#include <stdio.h> #include <stdlib.h> #include <locale.h> int main() { setlocale(LC_ALL, "rus"); double x1,y1,x2,y2,x3,y3,x4,y4; double a1, b1, c1,a2,b2,c2; double x,y; printf("введите координаты начала и конца отрезка\n"); scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); printf("второго отрезка\n"); scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4); /*коэффициэнты первой прямой*/ a1=y1-y2; b1=x2-x1; c1=x1*y2-y1*x2; printf("%lf %lf %lf\n",a1,b1,c1); /*коэффициэнты второй прямой*/ a2=y3-y4; b2=x4-x3; c2=x3*y4-y3*x4; printf("%lf %lf %lf\n",a2,b2,c2); x=-(c1*b2 - b1*c2)/(a1*b2 - b1*a2); y=-(a1*c2 - c1*a2)/(a1*b2 - b1*a2); printf("%lf %lf",x,y); system("PAUSE"); return 0; }
Решение задачи: «Найти пересечение двух ОТРЕЗКОВ каждый из которых ограничен двумя точками»
textual
Листинг программы
#include <stdio.h> #include <math.h> float line_equation_x(float x1, float x2,float x3, float x4, float y1, float y2, float y3, float y4){ return -((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1)); } float line_equation_y(float x3, float x4, float y3, float y4, float x){ return (x*(y4-y3)-(x3*y4-x4*y3))/(x4-x3); } float factor(float x1, float x2, float y1, float y2){ return (x2-x1)/(y2-y1); } int check_dot(float x, float y , float x1 , float y1 , float x2 , float y2){ return ((y-y1)*(x2-x1)-(x-x1)*(y2-y1)); } main() { float x,y,x1,x2,x3,x4,y1,y2,y3,y4; printf("Insert X1="); scanf("%f",&x1); printf("Insert Y1="); scanf("%f",&y1); printf("Insert X2="); scanf("%f",&x2); printf("Insert Y2="); scanf("%f",&y2); printf("Insert X3="); scanf("%f",&x3); printf("Insert Y3="); scanf("%f",&y3); printf("Insert X4="); scanf("%f",&x4); printf("Insert Y4="); scanf("%f",&y4); if (factor(x1,x2,y1,y2) == factor(x3,x4,y3,y4)){ printf("Lines are parallel"); return 0; } else{ x = line_equation_x(x1,x2,x3,x4,y1,y2,y3,y4); y = line_equation_y(x3,x4,y3,y4,x); printf("Lines Intersect in X=%.1f Y=%.1f\n",x,y); if ((check_dot(x,y,x1,y1,x2,y2)-check_dot(x,y,x3,y3,x4,y4)) < 0.2)// 0.2 - погрешность (большая, ну это на скорую руку и на глаз поставил) printf("This segments are intersected"); else printf("This segments are not intersected"); } }
Объяснение кода листинга программы
Код выполняет следующие действия:
- Определяет функцию
line_equation_x
, которая вычисляет уравнение прямой по координатам четырех точек. - Определяет функцию
line_equation_y
, которая вычисляет уравнение прямой по координатам четырех точек. - Определяет функцию
factor
, которая вычисляет коэффициент наклона прямой, проходящей через две точки. - Определяет функцию
check_dot
, которая проверяет, являются ли две прямые параллельными, используя метод векторного произведения. - В функции
main
считывает координаты четырех точек с помощью функцииscanf
. - Проверяет, являются ли две прямые параллельными, используя функцию
factor
. Если да, выводит сообщениеLines are parallel
и завершает выполнение программы. - Если прямые не параллельны, вычисляет точку пересечения с помощью функций
line_equation_x
иline_equation_y
. - Проверяет, является ли точка пересечения близкой к одной из точек сегмента, используя функцию
check_dot
и сравнивая результат с заданной погрешностью. - Если точка пересечения близка к одной из точек сегмента, выводит сообщение
This segments are intersected
. В противном случае выводит сообщениеThis segments are not intersected
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д