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
risposta
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
in realtà, non conosco la matematica vettoriale. Potresti scrivere gentilmente una C# o una pseudo-funzione per ottenere ciò che stai dicendo? – VOX
Funziona. Ma ho ancora una domanda, se voglio compensare 10 pixel di distanza dalla linea originale, dovrei moltiplicare dx * 10? – VOX
Grazie a @Krumelur. – VOX
Hai provato sottraendo n per Y1 e Y2 insieme con l'aggiunta di n per x1 e x2? Immagino che possa funzionare
E 'un lavoro ?? – Arman
no non lo è. è così facile per te pensare come un compito a casa? quindi per favore rispondimi :) – VOX