AlSvartr
2006-11-02, 15:52:48
Hallo zusammen,
ich habe ein kleines auf-dem-Schlauch-steh-Problem..und zwar möchte ich zu einem Vektor einen beliebigen orthogonalen Vektor berechnen. Da ich ihn nur zu diesem einen Vektor errechnen möchte, kann ich natürlich nicht auf das Kreuzprodukt zurückgreifen. Also dachte ich mir, ich nehme mir das Skalarprodukt, setze es gleich 0 und mache Fallunterscheidungen je nach Eingabevektor...das ganze resultierte dann in 7 Fallunterscheidungen (8, wenn man berücksichtigt, dass alle Komponenten des Vektors 0 sein könnten...):
public Vector3d getRandomOrthogonal(Vector3d v) {
Vector3d u=new Vector3d();
int vCase=0;
if (v.x==0)
vCase+=1;
if (v.y==0)
vCase+=2;
if (v.z==0)
vCase+=4;
switch (vCase) {
case 0: //Nothing's zero
u.x=Math.random();
u.y=Math.random();
u.z=-(v.x*u.x+v.y*u.y)/v.z;
break;
case 1: //v.x is zero
u.x=0;
u.y=Math.random();
u.z=-(v.y*u.y)/v.z;
break;
case 2: //v.y is zero
u.x=Math.random();
u.y=0;
u.z=-(v.x*u.x)/v.z;
break;
case 4: //v.z is zero
u.x=Math.random();
u.z=0;
u.y=-(v.x*u.x)/v.y;
break;
case 3: //v.x and v.y are zero
u.set(v.z,0,0);
break;
case 5: //v.x and v.z are zero
u.set(v.y,0,0);
break;
case 6: //v.y and v.z are zero
u.set(0,v.x,0);
break;
case 7: //Everything is zero
break;
default:
break;
}
u.normalize();
return u;
}
Nun ist meine Frage: Geht das nicht einfacher? :wink: ... mir kommt das wesentlich zu fummelig vor, nur um eine einfache Orthogonale zu bekommen..in 2d ist das ja ganz einfach mit u=(v_y -v_x)^T möglich..
<edit>Das Math.random() kann ich natürlich auch jeweils durch 1 ersetzen...pseudozufällig muss der Vektor nämlich eigentlich nicht unbedingt sein..
ich habe ein kleines auf-dem-Schlauch-steh-Problem..und zwar möchte ich zu einem Vektor einen beliebigen orthogonalen Vektor berechnen. Da ich ihn nur zu diesem einen Vektor errechnen möchte, kann ich natürlich nicht auf das Kreuzprodukt zurückgreifen. Also dachte ich mir, ich nehme mir das Skalarprodukt, setze es gleich 0 und mache Fallunterscheidungen je nach Eingabevektor...das ganze resultierte dann in 7 Fallunterscheidungen (8, wenn man berücksichtigt, dass alle Komponenten des Vektors 0 sein könnten...):
public Vector3d getRandomOrthogonal(Vector3d v) {
Vector3d u=new Vector3d();
int vCase=0;
if (v.x==0)
vCase+=1;
if (v.y==0)
vCase+=2;
if (v.z==0)
vCase+=4;
switch (vCase) {
case 0: //Nothing's zero
u.x=Math.random();
u.y=Math.random();
u.z=-(v.x*u.x+v.y*u.y)/v.z;
break;
case 1: //v.x is zero
u.x=0;
u.y=Math.random();
u.z=-(v.y*u.y)/v.z;
break;
case 2: //v.y is zero
u.x=Math.random();
u.y=0;
u.z=-(v.x*u.x)/v.z;
break;
case 4: //v.z is zero
u.x=Math.random();
u.z=0;
u.y=-(v.x*u.x)/v.y;
break;
case 3: //v.x and v.y are zero
u.set(v.z,0,0);
break;
case 5: //v.x and v.z are zero
u.set(v.y,0,0);
break;
case 6: //v.y and v.z are zero
u.set(0,v.x,0);
break;
case 7: //Everything is zero
break;
default:
break;
}
u.normalize();
return u;
}
Nun ist meine Frage: Geht das nicht einfacher? :wink: ... mir kommt das wesentlich zu fummelig vor, nur um eine einfache Orthogonale zu bekommen..in 2d ist das ja ganz einfach mit u=(v_y -v_x)^T möglich..
<edit>Das Math.random() kann ich natürlich auch jeweils durch 1 ersetzen...pseudozufällig muss der Vektor nämlich eigentlich nicht unbedingt sein..