Tengo un sistema donde puedes hacer clic una vez para colocar un nodo en una escena. Cuando coloca 3 nodos, forma un triángulo. Cuando coloca nodos futuros, crea un nuevo triángulo uniendo ese nodo a los 2 nodos existentes más cercanos.
Esto funciona bien la mayor parte del tiempo, pero es defectuoso cuando se usa cerca de triángulos con ángulos muy agudos, porque uno de los 2 nodos más cercanos a menudo no es uno que deba usarse.
Por ejemplo, vea la imagen a continuación. El triángulo magenta es el primero colocado. Si luego hago clic en la posición marcada como X, lo que obtengo es un nuevo triángulo donde está la superposición azul. Lo que quiero es un nuevo triángulo donde esté la superposición verde. (es decir, simétrico al magenta, en este ejemplo. Aclaración: los triángulos verde y magenta no se superponen; el verde se extiende debajo del azul hasta el nodo más a la izquierda)
¿Cómo puedo determinar qué 2 vértices existentes usar al crear nuevos triángulos para que los triángulos no se superpongan de esta manera?
EDITAR : Buscar el borde más cercano da mejores resultados, pero no los perfectos. Considere esta situación:
La prueba del "borde más cercano" es ambigua y puede devolver AB o AC (ya que el punto más cercano a X para ambos está en A). El resultado deseado sería AC, para formar el triángulo ACX sin bordes superpuestos. ¿Cómo podría asegurar este resultado? (Preferiría no tener que realizar pruebas de superposición de bordes individuales como un desempate si es posible, ya que me preocupa que la prueba de borde más cercana no necesariamente detecte que los 2 son exactamente equidistantes, dados los problemas de precisión de coma flotante).
Respuestas:
En lugar de encontrar la distancia mínima a los nodos, encuentre la distancia mínima al borde (es decir, el segmento de línea definido por los nodos).
Luego, si el punto más cercano es un vértice (que tendrá que usar una prueba epsilon ** de coma flotante), compare el ángulo entre la línea desde el nuevo punto hasta el vértice y cada uno de los bordes conectados a ese vértice. Elija el que tenga el ángulo absoluto mínimo:
** Para evitar agregar triángulos degenerados, que podrían interrumpir la prueba de épsilon, es posible que desee colocar una región alrededor de cada vértice donde no se permiten agregar puntos (algo así como no permitir puntos dentro de algún múltiplo del épsilon utilizado anteriormente).
fuente
Después de colocar el primer triángulo, al colocar un nuevo vértice, siempre generará dos bordes nuevos. El tercer borde para el nuevo triángulo siempre será un borde compartido con un triángulo anterior. Si pudiera encontrar una manera de determinar el borde compartido, sabría a qué vértices conectarse, pero esa es la parte difícil. Creo que de una manera puedes hacer esto dibujando una línea desde tu nuevo vértice hasta el centro de cada uno de los últimos tres bordes generados (o probablemente los 3 bordes más cercanos).
Si la línea desde su vértice hasta el centro del borde no cruza ninguno de los otros dos bordes, tiene su borde compartido. El borde compartido le dirá a qué dos vértices conectar su nuevo vértice.
Jimmy planteó el caso por un punto que es ambiguo en cuanto a dónde iría el nuevo triángulo así:
Eso le daría la oportunidad de elegir entre dos triángulos válidos. Quizás el desempate sea cuál es el punto central más cercano.
Teniendo en cuenta su actualización, aunque es más compleja, mi solución solo resultará en un empate cuando tenga dos triángulos válidos. Usando este método, su segunda imagen de ejemplo produciría el resultado que desea.
fuente
Con tu triángulo magenta ABC, incorporas un nuevo vértice X. Creo que es obvio que habrá dos líneas que comienzan en D que no se intersecarán entre ninguno de los bordes del triángulo ABC.
Estas dos líneas pueden ser AX y BX, BX y CX o AX y CX. Entonces puede tratar su problema como el problema clásico de "¿se cruzan dos líneas"? Luego puede verificar cuál de estos pares de líneas no se cruza con ninguno de los bordes del triángulo ABC siguiendo, por ejemplo, cualquiera de los métodos de esta pregunta . Por lo tanto, tendrá los dos nuevos bordes del nuevo triángulo.
fuente
Averiguar si estás en una de las regiones inequívocas (1, 2, 3 a continuación) es bastante fácil: trata cada borde de tu triángulo como un plano 2D y prueba en qué lado del plano está tu nuevo punto. Si estás dentro de dos de ellos pero fuera de uno, ese corresponde al borde del triángulo que aporta dos vértices a tu nuevo triángulo.
Si estás dentro de uno y fuera de dos, estás en el caso ambiguo donde la parte más cercana del triángulo a tu nuevo punto es una esquina. En ese caso, puede formar un plano 2D desde el punto medio del borde opuesto (el que está dentro) y el vértice más cercano (el que comparten los dos planos fuera del que está). Puede elegir una arista dependiendo de qué lado de este plano esté su nuevo punto.
Tenga en cuenta que una prueba de plano en 2D funciona de la misma manera que en 3D: puntee un vector desde cualquier parte del plano hasta su punto con la normal del plano (en 2D, esta es la línea perpendicular).
(Por cierto, las regiones delimitadas por magenta en esta imagen se denominan regiones de Voronoi; son las áreas del espacio que contienen puntos que están más cerca de una característica particular (borde o vértice) del triángulo. Editar: Mi terminología aquí no es realmente bastante correcto, estas no son exactamente regiones de Voronoi).
fuente