2013-04-11 5 views
6

Ho 1 linea con 2 punti noti:Scorrere N punti che sono perpendicolari ad un'altra linea

PointF p2_1 = new PointF(); 
p2_1.X = 100; // x1 
p2_1.Y = 150; // y1 

PointF p2_2 = new PointF(); 
p2_2.X = 800; // x2 
p2_2.Y = 500; // y2 

float dx = p2_2.X - p2_1.X; 
float dy = p2_2.Y- p2_1.Y; 

float slope = dy/dx; // slope m 
float intercept = p2_1.Y - slope * p2_1.X; // intercept c 
// y = mx + c 

mi vuoi scorrere 10 pixel verso sinistra (o destra) per 1 riga (A x1, y1).

enter image description here

I punti rossi sono quelli che mi piacerebbe processo. Esempio:

for (int i = 10; i > 0; i--) 
{ 
    // start with distant coordinates 
    PointF new_point = new Point(); // (grab x,y, coords accordingly) 
    // repeat until I'm at (x1, y1) 
} 

Come faccio a scorrere queste corde?

+0

Volevo solo gettare questo qui: [Un'implementazione di algoritmo disegno al tratto di Bresenham] (http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html). È piuttosto breve e ti dà un pratico 'IEnumerable ' per iterare con. Puoi nutrirlo con le stringhe finali dalle risposte qui sotto. –

risposta

3

Un vettore perpendicolare sarà nella forma: [-dy dx] dove [dx dy] è il vettore corrente. Una volta ottenuto il vettore perpendicolare, è possibile normalizzare (unità di lunghezza), per poi proseguire successivamente un certo lasso:

float perp_dx = -dy/Math.sqrt(dy*dy+dx*dx); //normalized 
float perp_dy = dx /Math.sqrt(dy*dy+dx*dx); //normalized 

for(int i =0; /*logic here*/){ 
float new_x = perp_dx * i + start_x; 
float new_y = perp_dy * i + start_y; 
} 
2

La linea perpendicolare a una data linea ha una pendenza uguale all'inverso negativo della pendenza della linea specificata.

La pendenza della linea proposta è (y2-y1)/(x2-x1)

Così la linea rossa ha pendenza = - 1/[(y2-y1)/(x2-x1)]

Quindi ogni punto esimo su questa linea contiene coordinate (xi, yi) dove

(yi - y1)/(xi - x1) = - 1/(y2-y1)/x2-x1) 

ed è un multiplo di pixel ad una distanza fissa da (x1, y1), cioè, dove

(yi-y1) * (yi-y1) + (xi-x1) * (xi-x1) = i * i 

quello che farei è calcolare cosa questo vettore di incremento (dx, dy) è per o tra ciascun punto sulla linea rossa, e quindi continuare ad aggiungere quell'incremento in un ciclo che itera 10 volte.

Problemi correlati