2010-05-11 14 views
5

Sé que hay muchos algoritmos para verificar si dos segmentos de línea se cruzan.Dos segmentos de línea paralela intersección

Los segmentos de línea a los que me refiero son líneas de longitud construidas por 2 puntos finales.

Pero una vez que encontraron una condición en paralelo, simplemente le dicen al usuario un gran "No" y
fingen que no hay superposición, punto final compartido o colusión de punto final.

Sé que puedo calcular la distancia entre segmentos de 2 líneas.
Si la distancia es 0, verifique los puntos finales ubicados en los otros segmentos de línea o no.
Y esto significa que tengo que usar un montón de if else y & & || condiciones

Esto no es difícil, pero mi pregunta es

"¿Hay un método truco (o matemáticas) para calcular este caso paralelo especial?"

espero esta imagen aclarar mi pregunta
http://judark.myweb.hinet.net/parallel.JPG

+0

¿Qué estás tratando de encontrar exactamente? Por definición, las líneas paralelas nunca se cruzan. – Tyler

+0

Las líneas paralelas nunca se cruzan a menos que la distancia sea 0. Pero dado que su distancia es 0, están superpuestas. Sin embargo, mi pregunta es acerca de los segmentos de línea. Las líneas estiradas están superpuestas, pero los segmentos de línea siguen siendo desconocidos. Así que trato de pedir una solución para revelar lo desconocido. – Judarkness

+0

Judarkness probablemente necesite refinar su pregunta un poco. ¿Qué importa si son segmentos de línea o no si estamos buscando paralelismo? – WhirlWind

Respuesta

4

Sí, dadas las fórmulas de las dos líneas, la prueba si sus pendientes son iguales. Si lo son, las líneas son paralelas y nunca se cruzan.

Si tiene puntos en cada una de las líneas, puede usar el slope formula.

Si ambos son perpendiculares al eje x, ambos tendrán pendientes infinitas, pero serán paralelos. Todos los puntos en cada línea tendrán las mismas coordenadas x.

Para tratar segmentos de línea, calcule el punto de intersección, luego determine si ese punto de intersección existe para ambos segmentos.

+0

Oh mi. Creo que será mejor que complete el requisito de personaje. Estaba equivocado. = P –

+0

Jaja ... * mezcla los pies * =) –

+0

@Chris ahh, bueno, yo también lo he hecho;) – WhirlWind

0

Supongo que el caso que le interesa es donde los dos segmentos de línea son paralelos (según se determina al comprobar la pendiente, como dice Whirlwind), y está tratando de determinar si los dos segmentos se superponen.

lugar de preocuparse por la distancia entre las líneas, yo creo que la manera más fácil de hacer que TO Si los puntos finales de un segmento se encuentra dentro de la otra:

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

Esto es justo lo que quiero, tengo mi propio segment_contains_points() (en otro nombre) Pero es demasiado ineficiente. Y tengo que llamarlo tres veces porque el segmento B podría ser más grande y contiene todo el segmento A. Y quiero saber si hay una solución mejor? – Judarkness

0

Vamos a suponer que usted tiene dos líneas descrito por las fórmulas a.x + b.y + c = 0 y d.x + e.y + f = 0. Las dos líneas son paralelas cuando a = 0 and d = 0 o b/a = e/d. Tal vez en lugar de hacer la división solo asegúrese de que b.d = a.e.

0

encontré este (modificado un poco por mí para que se adapte) devolverá el intercetion x, y más si hay intercetion encontró que devolverá -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

Esto no resuelve la cuestión de determinar si los segmentos de líneas colineales se superponen; de hecho, en los comentarios de este código dice específicamente que fallará en líneas colineales (y paralelas): // Fallar si el segmento CD no cruza la línea AB –

0

Acabo de recibir el mismo problema: la forma más fácil que he encontrado para comprobar si las líneas se superponen: Suponiendo que los segmentos son colineales (paralelos y tienen la misma intersección con el eje x). Tome un punto A del segmento más largo (A, B) como punto de partida. Ahora encuentre el punto entre los otros tres puntos que tiene la distancia mínima al punto A (la distancia al cuadrado es mejor, incluso la longitud de manhattan podría funcionar también) midiendo la distancia en la dirección de B. Si el punto más cercano a A es B, el las líneas no se cruzan. Si pertenece al otro segmento, lo hacen. Quizás tenga que verificar casos especiales como líneas de longitud cero o líneas idénticas, pero esto debería ser fácil.

Cuestiones relacionadas