2013-04-11 7 views
6

Ich habe 1 Zeile mit 2 bekannten Punkten:iterieren N Punkte, die auf eine andere Linie, die senkrecht sind

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 

Ich möchte bis 10 Pixel nach links (oder rechts), um 1 Zeile iterieren (at x1, y1).

enter image description here

Die roten Punkte sind diejenigen, die ich Prozess möchten. Beispiel:

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) 
} 

Wie durchläufe ich diese Coords?

+0

Ich wollte nur diese hier werfen: [Eine Implementierung von Bresenhamschen Strichzeichnung Algorithmus] (http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html). Es ist ziemlich kurz und gibt Ihnen ein handliches 'IEnumerable ', mit dem zu iterieren ist. Sie können es mit den End-Coords aus den Antworten unten füttern. –

Antwort

3

Ein lotrechter Vektor hat die Form: [-dy dx] wobei [dx dy] der aktuelle Vektor ist. Sobald Sie den senkrechten Vektor haben, können Sie es (Einheitslänge) normalisieren, dann um einen eingestellten Betrag laufen:

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

Die Linie senkrecht zu einer gegebenen Linie hat eine Steigung, die gleich der negativen Inverse der Steigung der gegebenen Linie ist.

Die Steigung der gegebenen Linie ist (y2-y1)/(x2-x1)

So Die rote Linie Steigung = - 1/[(y2-y1)/(x2-x1)]

So jeder i-te Punkt auf dieser Linie hat die Koordinaten (xi, yi) in dem

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

und ist ein Vielfaches von einem Pixel fester Abstand von (x1, y1) entfernt, dh wo

ist

was ich tun würde ist berechnen, was dieser Inkrementvektor (dx, dy) für oder zwischen jedem Punkt auf der roten Linie ist, und dann fügen Sie dieses Inkrement in einer Schleife, die 10-mal iteriert.

Verwandte Themen