Определить, имеют ли отрезки общие точки - C (СИ)
Формулировка задачи:
Условие:
Посмотрите все ли я предусмотрел? Может, что-то можно изменить
Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки.
Листинг программы
- /*Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки.*/
- #include <stdio.h>
- #include <locale.h>
- int main()
- {
- setlocale(LC_ALL, "");
- int x1, y1, x2, y2,
- x3, y3, x4, y4;
- printf("Координаты первой прямой (x1, y1, x2, y2): ");
- scanf("%d%d%d%d%*c", &x1, &y1, &x2, &y2);
- printf("Координаты второй прямой (x1, y1, x2, y2): ");
- scanf("%d%d%d%d%*c", &x3, &y3, &x4, &y4);
- if ((x1==x2 && x1==x3 && x1==x4) ||
- (y1==y2 && y1==y3 && y1==y4))
- {
- printf("Отрезки лежат на одной прямой.\n");
- getchar();
- return 0;
- }
- double k1 = (x2-x1)/(double)(y2-y1),
- k2 = (x4-x3)/(double)(y4-y3);
- if (k1 == k2) //параллельность отрезков при помощи угловых коэффициентов
- {
- printf("Отрезки параллельны.\n");
- getchar();
- return 0;
- }
- else
- {
- int a = x2 - x1,
- b = y2 - y1,
- c = x4 - x3,
- d = y4 - y3;
- if (c == 0 && x3>=x1 && x3<=x2 && (y3<=y1 || y3<=y2)) //Если второй отрезок перпендикулярен ОХ получаем деление на 0
- {
- printf("Пересекаются.\n");
- }
- else
- {
- double x = (b*c*x1 - a*c*y1 - a*d*x3+a*c*y3) / (double)(b*c - a*d),
- y = ((d*x-d*x3)+c*y3) / (double)c;
- //(x, y) точка пересечения прямых
- //проверяем принадлежит ли пересечение нашим отрезкам
- if ((x>=x1 && x<=x2 && x>=x3 && x<=x4) &&
- (((y>=y1 && y<=y2) || (y<=y1 && y>=y2)) && ((y>=y3 && y<=y4) || (y<=y3 && y>=y4))))
- {
- printf("Пересекаются.\n");
- }
- else
- {
- printf("Не пересекаются.\n");
- }
- }
- }
- getchar();
- return 0;
- }
Решение задачи: «Определить, имеют ли отрезки общие точки»
textual
Листинг программы
- if (c == 0 && x3>=x1 && x3<=x2 && (y3<=y1 || y3<=y2)) //Если второй отрезок перпендикулярен ОХ получаем деление на 0
- {
- printf("Пересекаются.\n");
- }
Объяснение кода листинга программы
- Проверяется, является ли второй отрезок перпендикулярным оси ОХ. Для этого проверяется, что x3 больше или равно x1 и меньше или равно x2.
- Если второй отрезок перпендикулярен оси ОХ, то проверяется, что y3 меньше или равно y1 или меньше или равно y2.
- Если выполняются оба условия, то выводится сообщение
Пересекаются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д