2016-05-12 8 views
3

Ich schreibe etwas Geometrie-Code mit System.Numerics und ich habe einen Fehler in der Implementierung der Plane.CreateFromVertices Methode gefunden. Der Kommentar auf Plane.D sagt:Sind System.Numerics Flugzeuge rückwärts?

Der Abstand des Flugzeugs vom Ursprung entlang seiner normalen Vektor.

jedoch, wenn ich dies bei Y mit drei Eckpunkten nennen = 0,5 Ich bekomme das Flugzeug:

N = (0, 1, 0) 
D = -0.5 

Die D ist negativ! Also soweit ich sehen kann entweder der Kommentar falsch ist, und D gekennzeichnet werden sollten:

Der Abstand des Ursprungs von der Ebene entlang der Normalvektor

oder Plane.CreateFromVertices falsch ist, und D sollte positiv sein.

Bin ich richtig (in diesem Fall werde ich einen Fehlerbericht schreiben), oder missverstand ich etwas hier (in welchem ​​Fall, was und warum?).

+2

Sind Sie vielleicht Linkshänder? : D – leppie

+0

Ob ich Linkshänder bin oder nicht, hat keine großen Auswirkungen auf mein Leseverständnis: P – Martin

+0

@leppie machte einen hinterhältigen;) Witz in Bezug auf die [Rechte Hand] (http: // mathworld .wolfram.com/Right-HandRule.html) Siehe meine Antwort für weitere Informationen. – bradgonesurfing

Antwort

1

Sie haben Recht. Die Dokumentation ist irreführend. Zum Beispiel vergleiche ich zwei verschiedene mathematische Bibliotheken. System.Numerics und Accord.Math

public void RightHandRulePlane_Accord() 
    { 
     { 
      var plane = System.Numerics.Plane.CreateFromVertices 
       (
       new System.Numerics.Vector3(0, 0.5f, 0) 
       , new System.Numerics.Vector3(1, 0.5f, 0) 
       , new System.Numerics.Vector3(0, 0.5f, 1)); 

      Console.WriteLine(plane.ToString()); 

      plane = System.Numerics.Plane.CreateFromVertices 
       (
       new System.Numerics.Vector3(0, 0.5f, 1) 
       , new System.Numerics.Vector3(1, 0.5f, 0) 
       , new System.Numerics.Vector3(0, 0.5f, 0) 
       ); 

      Console.WriteLine(plane.ToString()); 

     } 
     { 
      var plane = Accord.Math.Plane.FromPoints 
       (
       new Accord.Math.Point3(0, 0.5f, 0) 
       , new Accord.Math.Point3(1, 0.5f, 0) 
       , new Accord.Math.Point3(0, 0.5f, 1)); 

      Console.WriteLine(plane.ToString()); 

      plane = Accord.Math.Plane.FromPoints 
       (
       new Accord.Math.Point3(0, 0.5f, 1) 
       , new Accord.Math.Point3(1, 0.5f, 0) 
       , new Accord.Math.Point3(0, 0.5f, 0) 
       ); 

      Console.WriteLine(plane.ToString()); 
     } 
    } 

die Ausgabe

{Normal:<0, -1, 0> D:0.5} 
{Normal:<0, 1, 0> D:-0.5} 
0x -1y 0z +0.5 = 0 
0x +1y 0z -0.5 = 0 

Der signierte Wert +0.5 der konstante Term in der Gleichung

ax + by + cz + d = 0 

Sie in das korrekt sind, ist wahrscheinlich sollten Sie lese das als die Entfernung vom Ursprung der Ebene zum Ursprung des Koordinatensystems in Richtung der Ebene normal.

+0

Worum ich frage, ist der Wortlaut der Definition. Sie sagen: 'Der D-Wert sollte Abstand in Richtung der Normalen vom Ursprung sein, also lese ich das als * beginnend * im Ursprung, wie weit entlang der Normalen zur Ebene. Aber dann ist die Ausgabe, die du zeigst, das Gegenteil von dem, d. H. Es ist die Entfernung, die bei der Ebene beginnt und * zu * dem Ursprung geht. Lies ich gerade das falsch? – Martin

+0

Eigentlich hast du einen guten Punkt und hast Recht. Ich habe meine Antwort mit einem Experiment aus einer anderen Bibliothek aktualisiert, die verdeutlicht, was vor sich geht. – bradgonesurfing