C# 遍历与另一条直线垂直的N个点

C# 遍历与另一条直线垂直的N个点,c#,winforms,C#,Winforms,我有一条线和两个已知点: 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 int

我有一条线和两个已知点:

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
我想从左(或右)到一行(x1,y1)迭代10个像素

红点是我想要的。例如:

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

如何迭代这些坐标?

垂直于给定直线的直线的斜率等于给定直线斜率的负倒数

给定直线的斜率为
(y2-y1)/(x2-x1)

因此红线的斜率=
-1/[(y2-y1)/(x2-x1)]

这条线上的第i个点都有坐标(xi,yi),其中

并且是距离(x1,y1)固定距离的一个像素的倍数,即

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

我要做的是计算红线上每个点的增量向量(dx,dy),然后继续在循环中添加增量,循环迭代10次。

垂直向量的形式如下: [-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;
}

只是想把这个扔到这里:。它非常短,并提供了一个方便的
IEnumerable
进行迭代。您可以使用下面答案中的结束坐标来输入它。
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;
}