Editar: Cambió el título. Estoy menos interesado en que los dos segmentos sean iguales, sino más bien, si son colineales entre sí, dentro de cierta tolerancia. Si es así, entonces las líneas deben agruparse juntas como un solo segmento.¿Cuál es la manera más eficiente de determinar si dos segmentos de línea son parte del mismo segmento, dentro de una tolerancia?
Edit: Supongo que una forma breve de decir esto: Estoy tratando de agrupar segmentos de líneas similares juntos de una manera eficiente.
Decir que tengo segmentos de línea f
(fx0, fy0)
y (fx1, fy1)
y g
(gx0, gy0)
y (gx1, gy1)
Estos provienen de algo así como un detector de bordes algoritmo de visión por ordenador, y en algunos casos, las dos líneas son básicamente los mismos, pero se contados como dos líneas distintas debido a las tolerancias de píxeles.
Hay varios escenarios
f
yg
comparten exactamente los mismos puntos finales, por ejemplo:f = (0,0), (10,10) g = (0,0), (10,10)
f
yg
comparten aproximadamente los mismos puntos finales, y aproximadamente la misma longitud, por ejemplo:f = (0,0.01), (9.95,10) g = (0,0), (10,10)
f
es un subconjunto deg
, lo que significa que sus puntos finales se encuentran dentro del segmentog
y comparten el sam e slope como el segmentog
. Piense en una línea más o menos dibujada en la que el bolígrafo ha ido y venido para hacerla más gruesa. por ejemplo:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)
lo siguiente sería no ser considerado el mismo:
f
yg
tienen una diferencia de pendiente más allá de ciertotolerance
f
yg
pueden tener la misma pendiente pero son separados por una distancia más allá detolerance
, es decir, líneas paralelasf
yg
están en el mismo plano y en la misma pendiente, pero no se superponen en absoluto ... es decir. un conjunto de segmentos dentro de una línea punteada.
La forma más sencilla de saber si son lo mismo es si gx1 - fx1 <= tolerance
(repetir para los otros tres puntos), pero en algunos casos, la línea f
puede ser más corta que la línea g
(de nuevo, debido a las diferencias de píxeles y/o escaneo de fotos pobre).
Entonces, ¿es mejor convertir los dos segmentos en coordenadas polares y comparar los ángulos? En ese caso, las dos rho estarían dentro de una tolerancia. Pero luego debes asegurarte de que los dos segmentos de línea tengan la misma "dirección", lo cual es trivial para calcular en coordenadas cartesianas o polares.
Así que esto es fácil de encontrar una manera, pero me pregunto si hay una manera mucho más limpia, basada en el álgebra lineal que he olvidado hace tiempo.
Creo que debe ser más claro. Especificar un segmento de línea requiere cuatro números, para las coordenadas del comienzo y el final de la línea, mientras que parece que se han dado dos para cada línea. Además, ¿considerarías que la línea de (0,0) a (1,1) es "la misma" que la línea de (0,0) a (10,10)? Claramente, ambos están en la misma dirección, pero uno es mucho más largo que el otro. –
Oof, buena llamada. He agregado algunos términos aclaratorios y circunstancias de aprobación/rechazo. Gracias. Y sí, consideraría (0,0) a (1,1) (o una ligera variación, como [0, 0] a [1, 1,02]) lo mismo que (0,0) a (10,10), para los propósitos de este ejercicio. – Zando