2016-04-07 6 views
0

Ich muss dies beheben, indem Sie die geringste Menge an Berechnungen mit C# verwenden.Line und Perpendicular Segment von einem isolierten Punkt, Get alle Koordinaten

Ich habe die Punkte (x0, y0); (y1, y1); (x2, y2): (x1, y1); (x2, y2) definieren eine Linie, aber ist ein Segment "S". und (x0, y0) ist ein isolierter Punkt, und der Abstand "d" kürzeres Segment ist ein Segment senkrecht, das einen Abstand "d" hat.

Ich habe „d“ berechnet mit dieser Formel http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html und auch den Wert des „r“ berechnet unter Verwendung„Abstand zwischen zwei Punkten“.

public static Double GetDistance(Point sourcePoint, Point destinyPoint) 
    { 
     Double horizontalDistance = (destinyPoint.X - sourcePoint.X); 
     Double verticalDistance = (destinyPoint.Y - sourcePoint.Y); 
     Double distance = System.Math.Sqrt((horizontalDistance * horizontalDistance) + (verticalDistance * verticalDistance)); 
     return distance; 
    } 

Eigentlich muss ich die Koordinaten des roten Punktes finden.

enter image description here

+0

Verwenden Punktprodukt zwischen dem 'x1, Y1-> x2, y2' und' x1, Y1-> x0, y0' Vektoren Winkel bei 'redDot' zu bekommen, '1', '0' (lasst uns Nenne es 'angle1', den unteren linken Punkt. Winkel zwischen '0',' redDot', '1' ist 90 (roter Punkt), daher ist Winkel von' 1', '0',' redDot' (rechter Punkt) '90-Winkel1'. Sie haben die Länge von "d", jetzt haben Sie auch Winkel, also haben Sie einen Vektor bekannter Länge und Position, so dass 'redDot' Koordinaten gefunden werden können mit [diese Antwort] (http://stackoverflow.com/questions/1638437)/gegeben-ein-Winkel-und-Länge-wie-ich-berechne-die-Koordinaten). Wo '0' ist' (x0, y0) ',' 1' ist '(x1, y1)', etc .. – Quantic

+0

Kannst du einen Pseudocode posten? um ein bisschen mehr zu verstehen. – Cheva

+0

Eh .. meine Mathe ist super rostig, was mich dazu gebracht hat runter zu fühlen. Aber hier ist ein super beschissenes Bild: [Bild] (http://i.imgur.com/3id7r6T.png). Beachten Sie, dass Sie den "C" -Vektor vom Ursprung zu (x0, y0) verschieben und dann seinen Endpunkt finden müssen (oder umgekehrt). Auch habe ich die Polarkoordinaten rückwärts, es geht (Länge, Winkel), und ich setze (Winkel, Länge). – Quantic

Antwort

2

Zuerst kann man s leicht mit

double s = Math.Sqrt(r*r - d*d); 

finden Dann

double distance = GetDistance(point1, point2); 

nun den Abstand zwischen Punkt 1 und point2 finden Sie für die Position des red dot lösen kann.

double redX = (x2-x1)/distance * s; 
double redY = (y2-y1)/distance * s; 

Einfache Methode

Wenn Sie Vektoren (wie Vector2 in System.Numerics.Vectors) verwenden können, wird es ein sehr einfaches orthogonal projection Problem sein.

Vector2 p1 = new Vector2(point1.X, point1.Y); 
Vector2 p2 = new Vector2(point2.X, point2.Y); 
Vector2 p0 = new Vector2(point0.X, point0.Y); 

Vector2 s = p2 - p1; 
Vector2 v = p0 - p1; 

double len = Vector2.Dot(v, s)/Vector2.Dot(s, s); 
Vector2 projection = len * s; 

// Finally get the position of your red dot 
Point pointRedDot = point1 + new Point(projection.X, projection.Y); 

Console.WriteLine(pointRedDot); 
+0

meinst du 'p1 + len *? s' –

+0

Ja, ich habe meinen Tippfehler behoben. Auch zurück in einen "Punkt" konvertiert – LibertyLocked

+0

Folgen Sie dem ersten Schritt nicht die richtigen Koordinaten von Redpoint. – Cheva

Verwandte Themen