Cómo colocar rayos en los bordes de un polígono para que apunten

Comencemos con los vectores ortogonales. Dos vectores son ortogonales entre sí si y solo si su producto interno es cero.

El producto punto o producto interno de [math] a = (x_a, y_a) [/ math] y [math] b = (x_b, y_b) [/ math] es el número:

[matemáticas] a \ cdot b = x_ax_b + y_ay_b [/ matemáticas]

[matemática] p_1 [/ matemática] y [matemática] p_2 [/ matemática] son ​​ortogonales a [matemática] p [/ matemática]. Elegimos el vector en el sentido de las agujas del reloj desde [math] p [/ math], es decir [math] p_1 [/ math] (como desea señalar lejos del polígono … como notará más adelante).

El polígono P es un conjunto de [matemática] p_i [/ ​​matemática] puntos [matemática] (x_i, y_i) [/ matemática], y supongo que los puntos están ordenados en sentido antihorario en su matriz

Entonces, todo lo que tiene que hacer es comenzar calculando el vector ortogonal en sentido horario desde [math] (p_1, p_0) [/ math]:

[matemáticas] (p_1-p_0) = (x_1-x_0, y_1-y_0) [/ matemáticas]

Entonces, el vector ortogonal en el sentido de las agujas del reloj desde [math] (p_1-p_0) [/ math] es el vector con origen [math] (0,0) [/ math] y punto final [math] (y_1-y_0, -x_1 + x_0) [/matemáticas]

El vector ortogonal en sentido horario desde [math] (p_2-p_1) [/ math] es el vector con origen [math] (0,0) [/ math] y punto final [math] (y_2-y_1, -x_2 + x_1) [/ matemáticas]

[matemáticas] \ puntos [/ matemáticas]

[matemáticas] \ puntos [/ matemáticas]

Vector ortogonal en sentido horario desde [math] (p_n-p_ {n-1}) [/ math]

Vector ortogonal en sentido horario desde [math] (p_0-p_n) [/ math]

En el polígono de arriba tenemos:

En el segmento [math] p_op_1 [/ math]:

(3-3, -4 + 1) = (0, -3). y <0, entonces baja

En el segmento [matemáticas] p_1p_2 [/ matemáticas]:

(1-3, -5 + 4) = (-2, -1). x <0, luego va a la izquierda. y <0, entonces baja

[matemáticas] \ puntos [/ matemáticas]

En el segmento [matemáticas] p_7p_8 [/ matemáticas]:

(13-9, -7 + 9) = (4,2). x> 0, entonces va a la derecha. y> 0, entonces sube

Primero, necesita los vértices enumerados en orden alrededor del polígono … digamos, en sentido horario. Para cualquier par de vértices consecutivos, digamos [math] (x_1, y_1) [/ math] y [math] (x_2, y_2) [/ math], el vector hacia adelante entre ellos es [math] (x_2-x_1, y_2- y_1) [/ matemáticas]. También puede pensar en este vector como el número complejo [matemáticas] (x_2-x_1) + (y_2-y_1) i [/ matemáticas]. Para girar esta cosa 90 ° a la izquierda, multiplíquela por [matemáticas] i [/ matemáticas] para obtener [matemáticas] (x_2-x_1) i- (y_2-y_1) [/ matemáticas]. En forma vectorial, eso es [matemática] (y_1-y_2, x_2-x_1) [/ matemática]. Este vector se enfrenta a “fuera”, suponiendo que lo coloquemos correctamente.

Tal vez lo colocamos en el punto medio del borde del que se supone que debe señalar. Si es así, entonces su vector comenzará en el punto [matemáticas] \ izquierda (\ frac {x_1 + x_2} {2}, \ frac {y_1 + y_2} {2} \ derecha) [/ matemáticas] y finalizará en el punto [matemática] \ left (\ frac {x_1 + x_2} {2} + y_1-y_2, \ frac {y_1 + y_2} {2} + x_2-x_1 \ right) [/ math].

Mejoras:

Si desea un pequeño espacio entre el lado del polígono y el vector que apunta hacia afuera, agregue una fracción de [matemáticas] (y_1-y_2, x_2-x_1) [/ matemáticas] al punto inicial (y, opcionalmente, el segundo punto).

Si desea que todos los vectores que apuntan hacia afuera tengan la misma longitud, puede normalizarlos a la longitud 1 dividiendo cada uno por su propia longitud.

La suma de los ángulos en el exterior del polígono será mayor que la suma de los ángulos en el interior. Elija un segmento de línea y una dirección para comenzar un recorrido del perímetro, observando los ángulos a la izquierda y derecha de sus segmentos. Cuando regresas a tu punto de partida, sabes por la suma de los ángulos, si el interior está a la derecha o a la izquierda.

Al atravesar el perímetro, ensambló su representación de izquierda y derecha, para cada segmento. Use esa información para calcular la perpendicular y la dirección.

Como muestran algunas de las flechas en su ejemplo, el rayo perpendicular puede apuntar hacia atrás a través de otra península del polígono. Pero algunos polígonos irregulares pueden hacer esto inevitable.

¿No podrías usar partes de algoritmos de trazado de rayos para hacerlo? Estoy seguro de que hay algunos de código abierto que puedes buscar.