2016-06-09 27 views
1

Nehmen wir an, wir definieren zwei Vektoren durch Subtraktion der Endpunkte von zwei Linien.Finden Sie den kleinsten Winkel einer Linie zur X-Achse in C#

V1 = Pa - Pb; 
V2 = Pc - Pd; 

und wir definieren die X-Achse als folgenden Vektor.

Wie können wir wissen, welcher der beiden zwei Vektoren V1 und V2 den geringsten Winkel zur X-Achse hat.

+0

Eigentlich, wenn Sie wissen müssen, welcher Vektor näher an der X-Achse (und nur X) ist, können Sie die Werte der X-Koordinaten dieser Vektoren verwenden. Diese 'X'-Koordinaten sind die Längen der Projektion beider Vectoren an der OX-Achse, die eine kürzere hat den größeren Winkel, die längere Projektion bedeutet einen schärferen Winkel. – Blablablaster

Antwort

3

Sie haben zwei Möglichkeiten: Sie können die Winkel zwischen V1 und V und V2 und V mit der AngleBetween Funktion berechnen kann :

var angle1 = Vector.AngleBetween(V1,V); 
var angle2 = Vector.AngleBetween(V2,V); 

if (angle1 < angle2) { 
    //V1 is closer to V 
}else{ 
    //V2 is closer to V 
} 

oder Sie könnten y Werte ihre Ihre Vektoren normalisieren und vergleichen, auch danach:

V1.Normalize(); 
V2.Normalize(); 
if(Math.Abs(V1.Y) < Math.Abs(V2.Y)){ 
    //V1 is closer 
}else{ 
    //V2 is closer 
} 

würde ich die erste Methode bevorzugen, da die Normalize() Funktion der ursprünglichen Vector tatsächlich ändert, so dass Sie eine Kopie erstellen müssten, wenn man sie danach verwenden wollte. Sie können auch die erste Version verwenden, um sie mit einem anderen Vektor V zu vergleichen, ohne den Code anpassen zu müssen.

Bearbeiten: Eigentlich die erste Version wählt nur den Vektor mit dem kleinsten Winkel zum V Vektor und nicht auf der X-Achse. Also, wenn Sie den Vektor, anstatt nur auf die Achse vergleichen wollen, sollten Sie die Winkelberechnung mit Kopien von V1 und V2 mit absoluten x und y Werten tun:

var ref1 = new System.Windows.Vector(Math.Abs(V1.X),Math.Abs(V1.Y)); 
var ref2 = new System.Windows.Vector(Math.Abs(V2.X),Math.Abs(V2.Y)); 
var angle1 = Vector.AngleBetween(ref1,V); 
var angle2 = Vector.AngleBetween(ref2,V); 

if (angle1 < angle2) { 
    //V1 is closer to V 
}else{ 
    //V2 is closer to V 
} 

es Sehen aus wie diese, könnte das Normierungsverfahren die bessere Wahl sein. (Rufen Sie jedoch Normalize() auf Kopien an.)

+0

Vielen Dank für die Extra-Empfehlung über die 'Normalize()'. – Vahid

+1

Sie sollten sich wahrscheinlich auch meinen letzten Schnitt ansehen, ich habe einige Dinge behoben, die nur teilweise funktionierten. – Keiwan

2

Normalisieren Sie beide und finden Sie einen mit einem höheren absoluten Wert von x.

Alternativ Winkel zwischen zwei Vektoren a und b ist arccos((a.x*b.x+a.y*b.y)/(a.Length*b.Length)) (nicht definiert, wenn einer der Vektoren ist Null)

0
double compare() { 
     Point p0 = new Point(0, 0); 
     Point p1 = new Point(100, 100); 
     Point p2 = new Point(100, -100); 
     Vector v0 = new System.Windows.Vector(1, 0); 

     var v1 = p1 - p0; 
     var v2 = p2 - p0; 

     var value1 = Vector.AngleBetween(v0, v1); //value = 45 
     var value2 = Vector.AngleBetween(v0, v2); //value = -45 

     value1 = Math.Abs(value1); 
     value2 = Math.Abs(value2); 

     /* Or if you want to compare the value of the angle 
     if (value1 < 0) 
      value1 += 360; 

     if (value2 < 0) 
      value2 += 360; 
     */ 

     return Math.Min(value1,value2); 

    } 
1

Überprüfen Sie die folgende Lösung. Kann Ihre Anfrage erfüllen. Fügen Sie die Referenz Windowsbase zum Projekt hinzu. Sehr wichtig.

using System; 
using System.Windows; 

namespace Vectors 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 
      // Define Points 
      Point Pa = new Point(5.0,1.0); 
      Point Pb = new Point(10.0,3.0); 
      Point Pc = new Point(7.0,10.0); 
      Point Pd = new Point(1.0,3.0); 
      Vector V1 = Pa - Pb; 
      Vector V2 = Pc - Pd; 

      Vector V = new Vector(1, 0); 

      double Phi1 = Math.Atan2(V1.Y, V1.X)*180/Math.PI; 
      double Phi2 = Math.Atan2(V2.Y, V2.X)*180/Math.PI; 

      // Check for -ve angle and take 180 degree complement. 
      Phi1 = (Phi1 >= 0) ? Phi1 : 180 + Phi1; 
      Phi2 = (Phi2 >= 0) ? Phi2 : 180 + Phi2; 

      if(Phi1<=Phi2) 
      { 
       Console.WriteLine("Vector V1 has a least angle"); 
      } 
      else 
      { 
       Console.WriteLine("Vector V2 has a least angle"); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Vielen Dank. – Vahid