2013-04-11 85 views
6

我有2已知點1行:迭代通過垂直於另一條線的N個點

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 

我想通過10個像素迭代向左(或右)以1線(在x1,y1)。

enter image description here

紅點是,我想處理的人。例如:

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

如何迭代這些座標?

+0

只是想在這裏拋出這樣的:[Bresenham直線繪製算法的實現(HTTP:/ /ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html)。它非常短,並且爲您提供了一個方便的'IEnumerable '來進行迭代。你可以用下面答案中的結尾符號來提供它。 – 2013-04-11 19:47:24

回答

3

垂直向量的形式如下: [-dy dx]其中[dx dy]是當前向量。一旦你的垂直矢量,你可以歸它(單位長度),然後通過一組量迭代:

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

垂直於給定線的線的斜率等於給定線的斜率的負倒數。

給定的線的斜率是(y2-y1)/(x2-x1)

所以紅色線具有斜率= - 1/[(y2-y1)/(x2-x1)]

所以在這條線的每個第i個點具有座標(xi,yi)的其中

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

並且是距離(x1,y1)一個像素固定距離的倍數,即,其中

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

我要做的是計算這個增量向量(dx,dy)是在紅色線上的每個點之間還是之間,然後在迭代10次的循環中繼續添加該增量。