Processing math: 100%

2 votos

Encontrar la arista de salida con los ángulos más pequeños, dada una arista incidente y múltiples aristas de salida

Tengo una arista incidente y múltiples aristas salientes, para las que quiero elegir una arista saliente tal que los ángulos entre la arista saliente y la arista entrante sean los más pequeños de todos. Conocemos las coordenadas del vértice V .

El ángulo debe partir de la arista entrante ( e1 ) y termina en otro borde ( e2 , e3 , e4 ).

Además, el ángulo debe formarse de tal manera que la cara construida de e1 a e2 debe estar en dirección contraria a la del cierre. En otras palabras, la cara que se construye al unir todos los vértices V en e1 y ei juntos, debe ser un ciclo en sentido contrario a las agujas del reloj.

Así, en el caso siguiente, el borde e2 debe ser elegido porque el θ es el más pequeño.

¿Existe un algoritmo que lo haga con elegancia? Los pocos algoritmos que ideo son simplemente feos y requieren muchos hacks.

Actualización: Un método que se me ocurre ( y propuesto a continuación ) es utilizar el producto cruzado de cada arista contra la arista entrante e1 y obtener el mínimo θi es decir,

e1×ei=|e1||ei|sinθi

Pero el problema de esto es que no funciona realmente. Considere los siguientes casos de prueba: e1=(1,0) e2=(1/(2),1/(2)) e3=(1/(2),1/(2))

Uno se daría cuenta de que

θ2=45o θ3=45o

Ambos son iguales aunque sabemos que e2 debe ser seleccionado.

2voto

Simon Nickerson Puntos 17147

Suponiendo que encontrar las coordenadas (de sus vectores) no sea demasiado difícil.

Puedes utilizar la definición de los productos punto y o cruz, y luego resolver los ángulos.

Así, por ejemplo, puede utilizar |a×b|=|a||b|sinθ

0voto

Brad Larson Puntos 411

Si intentas poner esto en código puedes considerar la función atan2(y,x), está disponible en la mayoría de los lenguajes. Ten en cuenta que toma la coordenada y como primer parámetro. Dado que atan2 toma dos parámetros, puede averiguar en qué cuadrante se encuentra tu vector, y puede mostrar el ángulo en el rango π a π .

Aquí hay un fragmento de perl para demostrar cómo funciona para sus dos ángulos:

#!/usr/bin/perl

use Math::Trig;

$t_rad = atan2(1/sqrt(2),-1/sqrt(2));
$t_deg = $t_rad * 180 / pi;
print "theta_2 = $t_deg\n";

$t_rad = atan2(-1/sqrt(2),1/sqrt(2));
$t_deg = $t_rad * 180 / pi;
print "theta_3 = $t_deg\n";

Y aquí está la salida cuando se ejecuta para los dos ejemplos anteriores:

theta_2 = 135
theta_3 = -45

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X