2013-04-11 7 views
6

Tôi có 1 dòng với 2 điểm được biết đến:Duyệt qua N điểm đó vuông góc với dòng khác

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 

Tôi muốn lặp qua 10 pixel bên trái (hoặc bên phải) để 1 dòng (tại x1, y1).

enter image description here

Các chấm đỏ là những người mà tôi muốn quá trình. Ví dụ:

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

Làm cách nào để lặp qua các coords này?

+0

Chỉ muốn ném điều này vào đây: [Thực hiện thuật toán vẽ đường nét của Bresenham] (http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html). Nó khá ngắn, và cung cấp cho bạn một 'IEnumerable 'tiện dụng để lặp lại với. Bạn có thể ăn nó với các coords cuối cùng từ các câu trả lời dưới đây. –

Trả lời

3

Vectơ vuông góc sẽ có dạng: [-dy dx] trong đó [dx dy] là vectơ hiện tại của bạn. Khi bạn có vectơ vuông góc, bạn có thể chuẩn hóa nó (độ dài đơn vị), sau đó lặp lại theo số lượng đã đặt:

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

Đường vuông góc với một đường nhất định có độ dốc bằng nghịch đảo âm của độ dốc của đường cho sẵn.

Độ dốc của đường thẳng cho trước là (y2-y1)/(x2-x1)

Vì vậy, các dòng màu đỏ có độ dốc = - 1/[(y2-y1)/(x2-x1)]

Vì vậy, mỗi điểm thứ i trên dòng này có tọa độ (xi, yi), nơi

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

và là khoảng cách cố định nhiều pixel cách xa (x1, y1), nghĩa là, trong đó

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

những gì tôi sẽ làm là tính toán vector tăng này (dx, dy) là gì hoặc giữa mỗi điểm trên đường màu đỏ, và sau đó chỉ cần tiếp tục thêm số gia tăng trong vòng lặp lặp lại 10 lần.