Найти пересечение двух ОТРЕЗКОВ каждый из которых ограничен двумя точками - 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.