2010-05-13 5 views
23

Ich habe x1, y1 und x2, y2, die ein Liniensegment bildet. Wie bekomme ich eine andere Zeile x3, y3 - x4, y4, die parallel zur ersten Zeile ist wie im Bild. Ich kann einfach n zu x1 und x2 hinzufügen, um eine parallele Linie zu bekommen, aber es ist nicht das, was ich wollte. Ich möchte, dass die Linien im Bild parallel sind.Zeichnen Sie eine parallele Linie

enter image description here

+0

Ist es ein Hausaufgaben ?? – Arman

+5

nein ist es nicht. fällt es dir so leicht, als Hausaufgabe zu denken? dann antworte mir bitte. :) – VOX

Antwort

43

Was Sie tun möchten, ist, die Koordinaten in der orthogonalen Richtung zu versetzen. Wenn Sie Vektor-Mathematik kennen, multiplizieren Sie den Vektor durch den Abstand zwischen den Endpunkten der Linie durch die folgende Matrix erstellt:

[ 0 -1 ] 
[ 1 0 ] 

sagen, dass die erste Linie, die die Punkte hat (x1,y1), (x2,y2), mit x=x2-x1, y=y2-y1.
Wir haben auch L = sqrt(x*x+y*y), die Länge der Zeile (verzeihen Sie die Notation). Dann wird die nächste Zeile sollte durch

[ 0 -1 ] [x] 
[ 1 0 ] [y] 

=>dx = -y/L, dy = x/L kompensiert werden, die für die neue Linie Offset normiert wird.

In C# -ähnliche Pseudo-Code:

var x1 = ..., x2 = ..., y1 = ..., y2 = ... // The original line 
var L = Math.Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 

var offsetPixels = 10.0 

// This is the second line 
var x1p = x1 + offsetPixels * (y2-y1)/L 
var x2p = x2 + offsetPixels * (y2-y1)/L 
var y1p = y1 + offsetPixels * (x1-x2)/L 
var y2p = y2 + offsetPixels * (x1-x2)/L 

g.MoveTo(x1p,y1p) // I don't remember if this is the way 
g.LineTo(x2p,y2p) // to draw a line in GDI+ but you get the idea 
+0

eigentlich, ich weiß nicht Vektor Mathe. Könnten Sie bitte eine C# - oder Pseudo-Funktion schreiben, um zu erreichen, was Sie sagen? – VOX

+0

Habe es funktioniert. Aber noch eine Frage, wenn ich 10 Pixel von der ursprünglichen Linie entfernen möchte, sollte ich dx * 10 multiplizieren? – VOX

+0

Danke @Krumelur. – VOX

0

Haben Sie versucht, mit dem Hinzufügen von n zu x1 und x2 n y1 und y2 subtrahieren entlang? Ich denke, das kann funktionieren

+0

Subtrahieren y1 und y2 funktioniert nicht, wenn die Linien 90 Grad oder 180 Grad sind. – VOX

+0

Wahrscheinlich können Sie die Randbedingungen setzen, d. H. Prüfen, ob y1, y2 oder null sind oder nicht. – gsk

+0

@ Krumelur Methode muss nicht auf Kanten überprüfen. ;) – VOX