2010-05-11 2 views
5

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

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

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

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

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

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

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

+0

Что именно вы пытаетесь найти? По определению параллельные линии никогда не пересекаются. – Tyler

+0

Параллельные линии никогда не пересекаются, если расстояние не равно 0. Но так как их расстояние равно 0, они перекрываются. Однако мой вопрос касается сегментов линии. Натянутые линии перекрываются, но сегменты линии остаются неизвестными. Итак, я пытаюсь попросить решение раскрыть нечестные. – Judarkness

+0

Judarkness, вам, вероятно, нужно немного уточнить свой вопрос. Какое это имеет значение, если они являются сегментом линии или нет, если мы проверяем параллелизм? – WhirlWind

ответ

4

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

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

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

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

+0

О, мой. Наверное, я лучше заполню требование персонажа. Я ошибался. = P –

+0

Ха-ха ... * перетасовывает ноги * =) –

+0

@ Крис ах, ну, я тоже это сделал;) – WhirlWind

0

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

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

if (segment_contains_point(segment_A, segment_B.start) || 
    segment_contains_point(segment_A, segment_B.end)) { 
     // lines overlap 
} 
+1

Это именно то, что я хочу, у меня есть свой собственный segment_contains_points() (от другого имени) Но это слишком неэффективно. И я должен назвать это три раза, потому что сегмент В может быть больше и содержит весь сегмент А. И я хочу знать, есть ли лучшее решение? – Judarkness

0

Давайте предположим, что у вас есть две строки описанных формулами 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

я нашел это (измененная немного от меня, чтобы удовлетворить) он возвращает intercetion х, у другого, если нет intercetion не найден, он будет возвращать -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

Это не решает вопрос о том, чтобы определить, перекрываются ли коллинеарные сегменты линии - на самом деле в комментариях к этому коду он конкретно говорит, что он потерпит неудачу для коллинеарных (и параллельных) строк: // Ошибка, если сегментный CD не пересекает линию AB –

0

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

Смежные вопросы