c# - para - suma de angulos interiores de un poligono
Cálculo de suma de ángulo relativa 3D (2)
Tengo un objeto 3D con rotación r1 en forma de cuaternión. Lo giro con ángulos euler locales:
transform.Rotate(new Vector3(0f, 15f, 0f), relativeTo: Space.Self); // right
transform.Rotate(new Vector3(-10f, -5f, 0f), relativeTo: Space.Self); // left up
transform.Rotate(new Vector3(0f, 0f, 90f), relativeTo: Space.Self); // 90 clockwise
Ahora tengo rotación r2 . ¿Cómo puedo recuperar la suma de rotación Y local 15-5 + 0 = 10 si no sé qué ángulos se han aplicado? Puede ser imposible obtener exactamente ese valor (10) pero ya entendiste mi idea. ¿Puedo ser que puedo obtener Y diff en el espacio r2 local?
Una posible solución que encontré:
(r2 * Quaternion.Inverse(r1)).eulerAngles.Y
Todavía estoy convencido de que las matrices de transformación serán un enfoque mucho mejor para ti
- como se mencionó en la pregunta anterior
- Los ángulos de Euler no son los mejores para su propósito y solo ensucian para usted
pero de todos modos, ¿qué hay de esto?
P0=(0,0,0) P1=(1,0,0) // or (0,0,1) y=0 !!! A0=r2_localtoglobal(P0) A1=r2_localtoglobal(P1) B0=r2r1_localtoglobal(P0) B1=r2r1_localtoglobal(P1) A=A1-A0 // local r2 X axis direction in GCS (without r1) B=B1-B0 // local r2r1 X axis direction in GCS (with r1) angle=-acos((A.B)/(|A|.|B|)) // angle between A,B (but inverted because you wanted local angle)
Supongo que r1 es ship y r2 es radar
[Editar1] después de leer de su edición de la pregunta vinculada finalmente está claro lo que quiere
P0=(0,0,0)
P1=(1,0,0) // or (0,0,1) y=0 !!!
A0=r1_globaltolocal(P0)
A1=r1_globaltolocal(P1)
A=A1-A0
angle=atanxy(A.x,A.z)
- donde r1 es su transformación de barco
- la transformación de radar es irrelevante para la imagen de fondo
- atanxy es atan2 = atan (y / x) pero con la descomposición del signo, por lo que funciona en un intervalo <0,2PI> completo
atan2, atanxy:
const double pi=M_PI;
const double pi2=2.0*M_PI;
double atanxy(double x,double y) // atan2 return < 0 , 2.0*M_PI >
{
int sx,sy;
double a;
const double _zero=1.0e-30;
sx=0; if (x<-_zero) sx=-1; if (x>+_zero) sx=+1;
sy=0; if (y<-_zero) sy=-1; if (y>+_zero) sy=+1;
if ((sy==0)&&(sx==0)) return 0;
if ((sx==0)&&(sy> 0)) return 0.5*pi;
if ((sx==0)&&(sy< 0)) return 1.5*pi;
if ((sy==0)&&(sx> 0)) return 0;
if ((sy==0)&&(sx< 0)) return pi;
a=y/x; if (a<0) a=-a;
a=atan(a);
if ((x>0)&&(y>0)) a=a;
if ((x<0)&&(y>0)) a=pi-a;
if ((x<0)&&(y<0)) a=pi+a;
if ((x>0)&&(y<0)) a=pi2-a;
return a;
}