Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2023, 22:43   #1
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию Определить есть ли у двух отрезков общие точки или нет. Си

Даны вещественные числа x1, y1, x2, y2, x3, y3, x4, y4.
Определите, имеет ли отрезок с концами (x1, y1) и (x2, y2)
общие точки с отрезком с концами (x3, y3) и (x4, y4).

Ввод
В первой строке содержатся вещественные числа x1, y1, x2, y2, x3, y3, x4, y4 – координаты концов отрезков.

Вывод
Вывести "Yes", если отрезки имеют общие точки, и "No" в противном случае.

Подскажите пожалуйста, где я ошибся.
Код:
#include <stdio.h>

int main()
{float x1, y1,x2, y2,x3, y3,x4, y4,x,y;
scanf("%f %f %f %f %f %f %f %f", &x1, &y1,&x2, &y2,&x3, &y3,&x4, &y4);
x=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
if (((x1<=x)&&(x2>=x)&&(x3<=x)&&(x4 >=x))||((y1<=y)&&(y2>=y)&&(y3<=y) &&(y4>=y))){
    printf("Yes");
}
else{
    printf("No");
}
return 0;
}
Faserty вне форума Ответить с цитированием
Старый 12.10.2023, 08:52   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Тут есть готовая формула для координат точки пересечения.
https://ru.wikipedia.org/wiki/Пересечение_прямых

Подумал, что этого будет достаточно, но осознал, что надо проверить не только ситуацию с пересечением, но и совпадение отрезков и их параллельность.
Но по ссылке эти замечания есть.

Добавил:
Решил разобраться подробнее и натолкнулся на вопросы.
На этом сайте есть некоторое решение:
https://www.interestprograms.ru/sour...-dvuh-otrezkov
Подумалось, что через параметрическое уравнение прямой будет лучше , но ...
Но решения с вертикальным отрезком тут нет (там деление на ноль).
Необходимо проверять более корректно координаты отрезков.

На Python написал скрипт
Код:
a = (y2 - y1)/(x2 - x1); c = y1 - a*x1
b = (y4 - y3)/(x4 - x3); d = y3 - b*x3
if abs((a-b)) < 1e-10:                          # Параллельны
    if abs(c - d) > 1e-10:                      # и Не совпадают
        print('N')                              # Общих точек нет
    elif min(x3, x4) <= x1 <= max(x3,x4) or min(x3,x4) <= x2 <= max(x3,x4):
        print('Y')        # Совпадают, есть общие точки
    else:
        print('N')        # Совпадают, общих точек нет
else:                     # Пересекаются
    x = (d - c)/(a - b)
    y = a*x + c
    if (min(x1,x2) <= x <= max(x1,x2) and min(y1,y2) <= y <= max(y1,y2) and
        min(x3,x4) <= x <= max(x3,x4) and min(y3,y4) <= y <= max(y3,y4)):
        print('Y')        # Есть общая точка
    else:
        print('N')        # Нет общей точки
Но и тут проблема вертикальных отрезков так же не решена.

PS: Варианты, которые следует рассматривать:
1. Отрезки пересекаются
2. Отрезки параллельные и накладываются полностью или частично
3. Отрезки не пересекаются
4. Отрезки параллельные
5. Отрезки параллельные и не накладываются (типа штрихов)

Как вариант, посмотреть в сторону векторного умножения, но хз...
Как-то так, ...

Последний раз редактировалось ViktorR; 12.10.2023 в 18:26.
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точка пересечения двух отрезков lostwarrior99 Общие вопросы C/C++ 3 27.12.2016 17:57
Нахождение точки пересечения двух отрезков [Паскаль] bnoazx005 Помощь студентам 0 18.12.2012 21:39
Определить имеют ли общие точки две плоские фигуры JL25A Помощь студентам 10 25.09.2011 02:26
определить общие символы двух строк helena91 Общие вопросы Delphi 5 23.02.2011 02:00
Нужно найти координаты точки пересечения двух отрезков в пространстве... Dima6120 Мультимедиа в Delphi 2 30.07.2010 13:36