Определить, имеют ли отрезки общие точки - 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");
        }

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

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

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы