Задать вопрос
@Timak31
студент

Как узнать пересечение линий?

Пишу код на с++. Вводятся точки х, у и последовательно они соедены(выходит ламаная линия). Нужно узнать сколько раз она сама себя пересекает.
87b257513497425f96f4c49e65a8029a.jpg
В коде я нахожу уравнения линии (например) АВ и потом для CD (например первая с второй не сравниваються, только после). Нахожу определитель и т.д. пока не нахожу точки пересечения линий.
Проблема в том что EF не пересекает CD и CB, но она как бы продолжает сама себя, а если продолжает то пересекнет.
Как это исправить? Может нужно найти её длину ? Предложения можно своими словами или математически, кодом не нужно, сам напишу. Заранье спасибо.
  • Вопрос задан
  • 3285 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@abcd0x00
Вот тебе псевдокод для определения, пересекаются ли отрезки.
Код
программа пересечение двух отрезков <вх:ax,ay,bx,by,cx,cy,dx,dy:R>:Q
 дано    : | концы первого отрезка (ax, ay) и (bx, by)
           | концы второго отрезка (cx, cy) и (dx, dy)
 получить: | ответ = отрезки пересекаются да/нет
 ____________
  | A(ax, bx) B(bx, by) C(cx, cy) D(dx, dy)
  v1x := bx - ax | вектор AB
  v1y := by - ay
  v2x := cx - ax | вектор AC
  v2y := cy - ay
  v3x := dx - ax | вектор AD
  v3y := dy - ay
  v4x := dx - cx | вектор CD
  v4y := dy - cy
  v5x := bx - cx | вектор CB
  v5y := by - cy
  v6x := ax - cx | вектор CA
  v6y := ay - cy
  coord1 := v1x * v2y - v1y * v2x | [AB, AC]
  coord2 := v1x * v3y - v1y * v3x | [AB, AD]
  coord3 := v4x * v5y - v4y * v5x | [CD, CB]
  coord4 := v4x * v6y - v4y * v6x | [CD, CA]
  ответ := (coord1 * coord2 <= 0 и coord3 * coord4 <= 0)
конец программы

Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Верно мыслите. Находите точки пересечения прямых. А затем проверяете эти точки на принадлежность отрезку. Т.е. координаты точки должны принадлежать диапазону координат отрезка. min(A.x, B.x) <= x <= max(A.x, B.x). Для ординаты аналогично.
Ответ написан
Ocelot
@Ocelot
Есть способ проще: e-maxx.ru/algo/segments_intersection_checking (через ориентированные площади треугольников), но он не находит саму точку пересечения, только говорит, пересекаются отрезки или нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы