¿Cómo encuentro los puntos más cercanos (formando así un polígono) que encierran un punto en particular? (Ver imagen)


8

Estoy trabajando con un motor de juego, y mi tarea es agregar código para simular la fractura de mallas rígidas.

En este momento solo estoy trabajando en romper un cubo.

Estoy usando el algoritmo de Voronoi para hacer un fragmento fracturado (realista) y estoy usando el método de medio plano para generar una celda de Voronoi.

para encontrar los puntos más cercanos (encerrados en rojo) alrededor del Voronoi (punto morado)

Ahora, la forma en que hago esto es para cada punto inicial, hago planos que son planos bisectores perpendiculares (las líneas negras rectas en la imagen) con el resto de los puntos iniciales y calculo las intersecciones de todos estos planos para darme puntos distintos ( todos los puntos naranjas).

He llegado hasta aquí.

De todos estos puntos de intersección calculados, solo necesito los que están más cerca y que encierran el punto inicial (los puntos encerrados en rojo) y necesito descartar todo el resto.

Información que tengo:

1) Ecuaciones planas de todos los planos (definidas por vectores normales normalizados y su distancia desde el origen)

2) Puntos de intersección (que he calculado)

¿Alguien puede ayudarme a descubrir cómo puedo encontrar los puntos encerrados en rojo?


No hay respuesta, ¡pero ese es un problema interesante!
Tim Holt

Respuestas:


4

Siguiendo el método de medio plano , habrá encontrado los segmentos de línea en cada otro punto y las bisectrices perpendiculares de cada uno de esos

paso 1: segmentos de línea Paso 2: bisectrices perpendiculares

que luego cruzaste para encontrar vértices potenciales de la célula Voronoi.

Ahora, desea excluir los que intersecan cualquiera de los semiplanos "distantes" formados por las bisectrices.

Dos intersecciones coincidentes, una inigualable

Coloreé los semiplanos "distantes" en azul translúcido para mayor claridad.

Aquí, los dos puntos rojos marcados pasan la prueba: no están dentro de ningún semiplano. El punto rojo no circulado no pasa, ya que está dentro del semiplano formado hacia el punto en la esquina superior derecha.

Esto efectivamente significa probar si cada punto está en el otro lado de cada línea bisectriz (en relación con el sitio Voronoi) y descartar los que están. (Tenga cuidado con los errores de redondeo).


Esta respuesta fue muy útil. Para verificar si ambos puntos se encuentran en el mismo lado del plano, sustituí los vectores en ecuaciones planas y busqué sus signos. Si ambos fueron positivos / negativos, entonces están del mismo lado. De lo contrario, están en el lado opuesto. ¡Esto funciona! ¡Mi código parece estar produciendo vértices correctos para los fragmentos Voronoi por fin!
nilspin

¿Qué programa usaste para generar esas imágenes en tu respuesta?
nilspin

@nilspin Inkscape .
Anko

3

Simplemente puede iterar sobre los bordes y filtrar todos los vértices que no están en el mismo semiplano con el punto de interés.

Como optimización, itere desde los bordes más cercanos hasta los más lejanos. Creo que incluso puede filtrar vértices mientras genera cortes.

Es como cortar el pastel con un cuchillo sin fin, hasta que solo quede un pequeño pedazo con cereza. Si te gustan las analogías. Simplemente corte y vea qué parte se tomará y cuál se descartará.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.