Ich möchte den Normalenvektor eines Dreiecks ausrechen.
Bis jetzt nehme ich dazu 2 Seiten des Dreiecks: a = B-A und b = C-A.
Da ich eine Normale ausrechnen will, muss diese zu beiden vektoren a und b senkrechts sein und ich bekomme das LGS:
Das LGS ist eigentlich ganz leicht zu lösen, Probleme bereiten mir nur die "Ausnahmefälle". Wenn nämlich a1, a2, a3, b1, b2, b3 jeweils <> 0 sind kann ich die Normale ausrechnen mit:
Code:
tmp := a1/b1;
b1 := b1 * tmp;
b2 := b2 * tmp;
b3 := b3 * tmp;
n2 := a3 - b3;
n3 :=-a2 + b2;
n1 :=(a2*n2+a3*n3)/(-a1);
Sobald aber eine der Werte a1, a2, a3, b1, b2, b3 = 0 ist, dann kann ich das LGS nicht mehr so lösen. Das bedeutet, es gibt 2^6-1=63 verschiedene Ausnahmefälle, die ich alle einzeln behandeln muss.
Bis jetzt mach ich das auch so und es geht eigentlich recht flott und ist nur etwas schlecht leserlich.
Mein Problem ist aber außerdem, dass die Richtungen der Normalenvektoren nicht mehr stimmen. Eigentlich ist dir Richtung der Normalen ja egal, ich bräuchte es aber so, dass die Richtung des Normalenvektors abhängig von der sichtbaren Fläche des Dreiecks ist. Das bedeutet, der Normalenvektor sollte immer auf die sichtbare Fläche des Dreiecks zeigen oder immer von der sichtbaren Fläche des Dreiecks wegzeigen. Und bis jetzt hab ich das noch nicht einheitlich hinbekommen.
Das bedeutet ich habe zwei Fragen an euch:
1) Wie rechne ich den Normalenvektor eines Dreiecks am geschicktesten aus (ohne 63 Sonderfälle behandeln zu müssen)? 2) Wie sorge ich dafür, dass der Normalenvektor des Dreiecks immer von der sichtbaren Fläche wegzeigt oder immer auf die sichtbare Fläche zeigt, jedoch nicht mal so mal so???
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
Das einzige was du beim Kreuzprodukt berücksichtigen musst ist dass du, falls a und b linear abhängig sind, den Nullvektor erhälst.
Ausserdem sollstest du noch beachten, dass ein Normalenvektor immer die Länge 1 hat. Der Ergebnisvektor des Kreuzproduktes sollte also noch auf die Länge 1 skaliert werden. (Division der Komponenten durch die Länge des Vektors, Vorsicht falls Länge gleich 0!)
Das kann doch nicht wahr sein!
Ist das schon alles???
Ich hab für den schei.. bestimmt ne stunde gebraucht und 150 zeilen code bekommen! Und jetzt sagt man mir hier das ich nur 3 zeilen brauch...
Ich glaub ich dreh durch!
Die letzten 4 Tage sitz ich am gleichen Problem und schreib bestimmt 1000 zeilen code. und als ergebnis darf ich fast alles wieder löschen und es bleiben ca 20 zeilen code übrig.
Warn das jetzt 4 tage lang nur verschwendete zeit?!?
Naja, auf jeden Fall danke LarsMiddendorf für die Erleuchtung!
Fragen lohnt sich manchmal halt doch...
hättest dir nur das Tutorial über Vektorgeometrie durchsehen müssen
Also in den DGL Tuts ists wirklich sehr oft erwähnt (grad weils so wichtig ist). Auch unter dem begriff Normale ist das im Wiki vermerkt. Bei manchen Dinge lohnt es sich einfach mal im Wiki nach verdächtigen Begriffen zu suchen
Ihr habt ja recht! Aber ich hab halt versucht n Problem zu lösen, bei dem ich niemals gedacht hätte, dass ich die Normale dazu brauch. Und über 10 Ecken bin ich dann irgendwie zu dem Problem gekommen. Deshalb hätte ich auch nicht gedacht, dass das auch sonst oft gebraucht wird...
Aber nochmal danke!
Ich bin doch froh, dass ich mit eurer bzw LarsMiddendorfs Hilfe noch zu diesem Lösungsweg gekommen bin. Denn das andere hat zwar au geklappt, war aber doch sehr umständlich...
Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.