Определить, имеют ли отрезки общие точки - C (СИ)

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

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

Условие:
Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки.
Посмотрите все ли я предусмотрел? Может, что-то можно изменить
Листинг программы
  1. /*Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки.*/
  2. #include <stdio.h>
  3. #include <locale.h>
  4. int main()
  5. {
  6. setlocale(LC_ALL, "");
  7. int x1, y1, x2, y2,
  8. x3, y3, x4, y4;
  9. printf("Координаты первой прямой (x1, y1, x2, y2): ");
  10. scanf("%d%d%d%d%*c", &x1, &y1, &x2, &y2);
  11. printf("Координаты второй прямой (x1, y1, x2, y2): ");
  12. scanf("%d%d%d%d%*c", &x3, &y3, &x4, &y4);
  13.  
  14. if ((x1==x2 && x1==x3 && x1==x4) ||
  15. (y1==y2 && y1==y3 && y1==y4))
  16. {
  17. printf("Отрезки лежат на одной прямой.\n");
  18. getchar();
  19. return 0;
  20. }
  21. double k1 = (x2-x1)/(double)(y2-y1),
  22. k2 = (x4-x3)/(double)(y4-y3);
  23. if (k1 == k2) //параллельность отрезков при помощи угловых коэффициентов
  24. {
  25. printf("Отрезки параллельны.\n");
  26. getchar();
  27. return 0;
  28. }
  29. else
  30. {
  31. int a = x2 - x1,
  32. b = y2 - y1,
  33. c = x4 - x3,
  34. d = y4 - y3;
  35. if (c == 0 && x3>=x1 && x3<=x2 && (y3<=y1 || y3<=y2)) //Если второй отрезок перпендикулярен ОХ получаем деление на 0
  36. {
  37. printf("Пересекаются.\n");
  38. }
  39. else
  40. {
  41. double x = (b*c*x1 - a*c*y1 - a*d*x3+a*c*y3) / (double)(b*c - a*d),
  42. y = ((d*x-d*x3)+c*y3) / (double)c;
  43. //(x, y) точка пересечения прямых
  44. //проверяем принадлежит ли пересечение нашим отрезкам
  45. if ((x>=x1 && x<=x2 && x>=x3 && x<=x4) &&
  46. (((y>=y1 && y<=y2) || (y<=y1 && y>=y2)) && ((y>=y3 && y<=y4) || (y<=y3 && y>=y4))))
  47. {
  48. printf("Пересекаются.\n");
  49. }
  50. else
  51. {
  52. printf("Не пересекаются.\n");
  53. }
  54. }
  55. }
  56. getchar();
  57. return 0;
  58. }

Решение задачи: «Определить, имеют ли отрезки общие точки»

textual
Листинг программы
  1.         if (c == 0 && x3>=x1 && x3<=x2 && (y3<=y1 || y3<=y2)) //Если второй отрезок перпендикулярен ОХ получаем деление на 0
  2.         {
  3.             printf("Пересекаются.\n");
  4.         }

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

  1. Проверяется, является ли второй отрезок перпендикулярным оси ОХ. Для этого проверяется, что x3 больше или равно x1 и меньше или равно x2.
  2. Если второй отрезок перпендикулярен оси ОХ, то проверяется, что y3 меньше или равно y1 или меньше или равно y2.
  3. Если выполняются оба условия, то выводится сообщение Пересекаются.

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


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

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

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

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

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

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