Gleichungssystem:
-
krümelkacker schrieb:
Bei allem Respekt, ich finde, Du hast es mit der Überladung der Operatoren übertrieben. Dass Du % für ein Kreuzprodukt nimmst, habe ich mir denken können, aber auch nur, weil ich den Rechenweg kenne. Über das * als Skalarprodukt bin ich aber trotzdem wieder gestolpert. In 'nem Code Review hätte ich das angemeckert und dot(x,y) und cross(x,y) als Alternativen vorgeschlagen.
Ich meine, dass es letztlich Geschmackssache oder Gewohnheit ist, ob man jetzt einen Operator überlädt oder eine Funktion benutzt. Das % für das Kreuzprodukt ist natürlich nicht optimal, aber in Ermangelung von Alternativen sozusagen der am besten passende Operator, der noch 'frei' war. Sebastian fand das % auch unpassend, hatte aber andererseits keine Hemmung den operator/ für den Vektor im Nenner zu überladen.
Ich mag eben nicht so etwas in dieser Form hinschreiben: dot( cross( a, b ), c ); da ist mir die mehr mathematische Schreibweise (a%b)*c; lieber - aber wie gesagt, das ist Geschmackssache.Übrigens wäre auch der Komma-Operator für das Skalarprodukt bzw. das innere Vektorprodukt geeignet, wie der von Dir angegebene Link zeigt, aber das wolltest Du mit sicher nicht mit dem Hinweis zeigen
.krümelkacker schrieb:
...und die Funktion
mittelsenkrechtehätte ich auch wieder angemeckert, weil nirgends ersichtlich ist, dass man ihr nur Punkte a/b geben darf, die die gleiche homogene Komponente haben. Das müsste entweder dokumentiert werden oder durcha = homogen(a); b = homogen(b);korrekt behandelt werden.
Ja ein bisschen ein kniffliges Problem. Deine vorgeschlagene Lösung ist zwar korrekt, aber irgendwie unschön, da man ja korrekterweise davon ausgehen könnte, dass a und b den selben homogenen Anteil haben. Und dann wäre das a = homogen(a); einfach überflüssig. Mir persönlich würde so etwas in der Form
// -- berechnet die Mittelsenkrechte // Bem.: die Klammerung von ez % (a - b) ist notwendig, da das Kreuzprodukt nicht assoziativ ist template< typename T > basic_vector< T > mittelsenkrechte( const basic_vector< T >& a, const basic_vector< T >& b ) { assert( abs( eZ*a - eZ*b ) <= EPS ); // die Konstante EPS wäre in Abhängig der Anwendung zu bestimmen. return ( a + b ) % (eZ % ( a - b )); }besser gefallen.
Eine andere (vielleicht saubere) Lösung bestünde darin, einen zweiten Vektortyp einzuführen, deren homogener Anteil per Definition immer ==1 ist. D.h. die Funktion 'homogen()' würde so einen Typ als Returntyp haben und die beiden Parameter der Funktion mittelsenkrechte wären eben von diesem Typ.
Gruß
Werner