如何在C#中计算与给定距离处另一条直线上的点垂直的点?

时间:2014-07-17 20:29:19

标签: c# math trigonometry vector-graphics

我有一个 p1 的中点,用于沿 A 的角度创建一条线:

double startX = p1.X - lineHalfLength * Math.Cos(-A * Math.PI/180);
double endX = p1.X + lineHalfLength * Math.Cos(-A * Math.PI/180);

double startY = p1.Y - lineHalfLength * Math.Sin(-A * Math.PI/180);
double endY = p1.Y + lineHalfLength* Math.Sin(-A * Math.PI/180);

到目前为止一切顺利。

现在我需要创建一条与第一条线平行的新线,垂直距离 D

一旦我找到新线的中点 p2 ,我就可以创建一条线(与上面相同的逻辑),但得到这一点正在躲避我,高中三星就是很久以前。这是我目前的尝试:

p2.X = p1.X + D * Math.Cos((A + 90) * Math.PI/180);
p2.Y = p1.Y + D * Math.Sin((A + 90) * Math.PI/180);

这几乎适用于45度,但没有别的。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

你有正确的想法将90度添加到你正在使用的角度,但是你使用的角度是从水平方向的左侧顺时针测量的,而惯例是从右侧的逆时针方向测量的。横向的。

按照通常的角度约定,我希望看到更像这样的代码来找到行结束

double startX = p1.X - lineHalfLength * Math.Cos(A * Math.PI/180);
double endX = p1.X + lineHalfLength * Math.Cos(A * Math.PI/180);

double startY = p1.Y - lineHalfLength * Math.Sin(A * Math.PI/180);
double endY = p1.Y + lineHalfLength* Math.Sin(A * Math.PI/180);

在这种情况下,将90添加到A应该可以正常工作。

(注意cos(-x)=cos(x)sin(-x)=-sin(x)

维护角度约定,将代码包装成线函数,然后然后可以将90度添加到传递给自己函数的角度

void LineFromMidpoint(double A, Point p1, double dist, out Point p2, out Point p3)
{
    double startX = p1.X - dist * Math.Cos(-A * Math.PI/180);
    double endX = p1.X + dist * Math.Cos(-A * Math.PI/180);

    double startY = p1.Y - dist * Math.Sin(-A * Math.PI/180);
    double endY = p1.Y + dist* Math.Sin(-A * Math.PI/180);

    p2 = new Point {X=startX, Y=startY};
    p3 = new Point {X=endX, Y=endY};
}

调用一次以获得原始行结束p2,另一次使得垂直行结束p3,再调用两次以获得平行线p4, p5。< / p>

void Main()
{
    Point p1 = new Point {X=10, Y=5};
    Point p2start, p2end;
    double A=15;
    double lineHalfLength = 10;
    LineFromMidpoint(A, p1, lineHalfLength, out p2start, out p2end);
    Console.WriteLine("p1={0}, p2={1}, p3={2}", p1, p2start, p2end);

    double B=A+90;
    double perpDist=2;
    Point p3firstMidpoint, p3secondMidpoint;
    LineFromMidpoint(B, p1, perpDist, out p3firstMidpoint, out p3secondMidpoint);
    Console.WriteLine("p3firstMidpoint={0}, p3secondMidpoint={1}",
        p3firstMidpoint, p3secondMidpoint);

    Point p4start, p4end;
    LineFromMidpoint(A, p3firstMidpoint, lineHalfLength, out p4start, out p4end);
    Console.WriteLine("p4start={0}, p4end={1}", p4start, p4end);

    Point p5start, p5end;
    LineFromMidpoint(A, p3secondMidpoint, lineHalfLength, out p5start, out p5end);
    Console.WriteLine("p5start={0}, p5end={1}", p5start, p5end);
}

绘制点结果

enter image description here

原始线端(黑色),垂直线端(红色),平行线(蓝色和绿色)。

答案 1 :(得分:1)

  

这几乎适用于45度

这是因为SIN(45)COS(45)相同,而您在X计算中使用的是错误的

p2.X = p1.X + D * Math.Cos((A + 90) * Math.PI/180);
p2.Y = p1.Y + D * Math.Sin((A + 90) * Math.PI/180);