Пересечение двух параллельных отрезков - PullRequest
5 голосов
/ 11 мая 2010

Я знаю, что есть много алгоритмов, чтобы проверить, пересекаются ли два отрезка.

Сегменты, о которых я говорю, - это длина линии, построенная из 2 конечных точек.

Но как только они сталкиваются с параллельным условием, они просто говорят пользователю большое «Нет» и
Притворяться, что нет перекрытия, совместного использования конечной точки или сговора конечной точки.

Я знаю, что могу рассчитать расстояние между двумя отрезками.
Если расстояние равно 0, проверьте конечные точки, расположенные на других отрезках или нет.
А это значит, что я должен использовать много if else и && || условия.

Это не сложно, но мой вопрос

«Есть ли метод уловки (или математика) для вычисления этого особого параллельного случая?»

Надеюсь, эта картина прояснит мой вопрос
http://judark.myweb.hinet.net/parallel.JPG

Ответы [ 5 ]

4 голосов
/ 11 мая 2010

Да, учитывая формулы для обеих линий, проверьте, равны ли их наклоны. Если они есть, линии параллельны и никогда не пересекаются.

Если у вас есть точки на каждой из линий, вы можете использовать формулу наклона .

Если оба перпендикулярны оси X, у них будет бесконечный уклон, но они будут параллельными. Все точки на каждой линии будут иметь равные координаты x.

Для работы с отрезками линии рассчитайте точку пересечения, а затем определите, существует ли эта точка пересечения для обоих отрезков.

0 голосов
/ 11 июня 2012

У меня возникла та же проблема: самый простой способ, который я нашел, - просто проверить, перекрываются ли строки: Предполагая, что сегменты коллинеарны (параллельны и имеют одинаковое пересечение с осью x). Возьмите одну точку A из более длинного сегмента (A, B) в качестве отправной точки. Теперь найдите точку среди других трех точек, которая имеет минимальное расстояние до точки A (квадратное расстояние лучше, даже длина Манхэттена может работать тоже), измеряя расстояние в направлении B. Если ближайшая точка к A - B, линии не пересекаются. Если это принадлежит другому сегменту, они делают. Возможно, вам нужно проверить наличие особых случаев, таких как линии нулевой длины или идентичные линии, но это должно быть легко.

0 голосов
/ 31 июля 2010

я нашел это (немного измененный мной, чтобы удовлетворить) он вернет перехват x, y иначе, если перехват не найден, он вернет -1, -1

    Public Function intercetion(ByVal ax As Integer, ByVal ay As Integer, ByVal bx As Integer, ByVal by As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal dx As Integer, ByVal dy As Integer) As Point
    '//  Determines the intersection point of the line segment defined by points A and B
    '//  with the line segment defined by points C and D.
    '//
    '//  Returns YES if the intersection point was found, and stores that point in X,Y.
    '//  Returns NO if there is no determinable intersection point, in which case X,Y will
    '//  be unmodified.

    Dim distAB, theCos, theSin, newX, ABpos As Double

    '//  Fail if either line segment is zero-length.
    If ax = bx And ay = by Or cx = dx And cy = dy Then Return New Point(-1, -1)

    '//  Fail if the segments share an end-point.
    If ax = cx And ay = cy Or bx = cx And by = cy Or ax = dx And ay = dy Or bx = dx And by = dy Then Return New Point(-1, -1)

    '//  (1) Translate the system so that point A is on the origin.
    bx -= ax
    by -= ay
    cx -= ax
    cy -= ay
    dx -= ax
    dy -= ay

    '//  Discover the length of segment A-B.
    distAB = Math.Sqrt(bx * bx + by * by)

    '//  (2) Rotate the system so that point B is on the positive X axis.
    theCos = bx / distAB
    theSin = by / distAB
    newX = cx * theCos + cy * theSin
    cy = cy * theCos - cx * theSin
    cx = newX
    newX = dx * theCos + dy * theSin
    dy = dy * theCos - dx * theSin
    dx = newX

    '//  Fail if segment C-D doesn't cross line A-B.
    If cy < 0 And dy < 0 Or cy >= 0 And dy >= 0 Then Return New Point(-1, -1)

    '//  (3) Discover the position of the intersection point along line A-B.
    ABpos = dx + (cx - dx) * dy / (dy - cy)

    '//  Fail if segment C-D crosses line A-B outside of segment A-B.
    If ABpos < 0 Or ABpos > distAB Then Return New Point(-1, -1)

    '//  (4) Apply the discovered position to line A-B in the original coordinate system.
    '*X=Ax+ABpos*theCos
    '*Y=Ay+ABpos*theSin

    '//  Success.
    Return New Point(ax + ABpos * theCos, ay + ABpos * theSin)
End Function

Origin

0 голосов
/ 11 мая 2010

Предположим, у вас есть две строки, описываемые формулами a.x + b.y + c = 0 и d.x + e.y + f = 0. Две линии параллельны, когда a = 0 and d = 0 или b/a = e/d. Возможно, вместо деления просто убедитесь, что b.d = a.e.

0 голосов
/ 11 мая 2010

Я предполагаю, что интересующий вас случай состоит в том, что два отрезка линии параллельны (как определено проверкой наклона, как говорит Вихрь), и вы пытаетесь определить, перекрываются ли эти два отрезка.

Вместо того, чтобы беспокоиться о расстоянии между линиями, я думаю, что самый простой способ сделать это, если одна конечная точка одного сегмента находится внутри другого:

if (segment_contains_point(segment_A, segment_B.start) || 
    segment_contains_point(segment_A, segment_B.end)) {
        // lines overlap
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...