2010-05-13 3 views
23

Ho x1, y1 e x2, y2 che forma un segmento di linea. Come posso ottenere un'altra riga x3, y3 - x4, y4 che è parallela alla prima riga come nell'immagine. Posso semplicemente aggiungere n a x1 e x2 per ottenere una linea parallela, ma non è quello che volevo. Voglio che le linee siano parallele nell'immagine.Disegna una linea parallela

enter image description here

+0

E 'un lavoro ?? – Arman

+5

no non lo è. è così facile per te pensare come un compito a casa? quindi per favore rispondimi :) – VOX

risposta

43

Quello che vuoi fare è sfalsare le coordinate nella direzione ortogonale. Se si conosce matematica vettoriale, moltiplicare il vettore creato dalla distanza tra i punti finali della linea dalla seguente tabella:

[ 0 -1 ] 
[ 1 0 ] 

dire che la prima linea ha i punti (x1,y1), (x2,y2), con x=x2-x1, y=y2-y1.
Abbiamo anche L = sqrt(x*x+y*y), la lunghezza della linea (scusate la notazione). Allora la riga successiva deve essere compensato da

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

=>dx = -y/L, dy = x/L che viene normalizzato compensato per la nuova linea.

In C# -come pseudocodice:

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

in realtà, non conosco la matematica vettoriale. Potresti scrivere gentilmente una C# o una pseudo-funzione per ottenere ciò che stai dicendo? – VOX

+0

Funziona. Ma ho ancora una domanda, se voglio compensare 10 pixel di distanza dalla linea originale, dovrei moltiplicare dx * 10? – VOX

+0

Grazie a @Krumelur. – VOX

0

Hai provato sottraendo n per Y1 e Y2 insieme con l'aggiunta di n per x1 e x2? Immagino che possa funzionare

+0

sottraendo y1 e y2 non funziona quando le linee sono 90 gradi o 180 gradi. – VOX

+0

Probabilmente è possibile impostare le condizioni dei bordi, ovvero verificare se y1, y2 o zero oppure no. – gsk

+0

@ Il metodo di Krumelur non ha bisogno di controllare i bordi. ;) – VOX