如何计算一个与另一条直线上的一个点垂直的点,以给定的距离,单位为C#?

如何计算一个与另一条直线上的一个点垂直的点,以给定的距离,单位为C#?,c#,math,trigonometry,vector-graphics,C#,Math,Trigonometry,Vector Graphics,我有一个中点p1,用于沿角度a创建直线: 到目前为止还不错 现在我需要创建一条与第一条线平行的新线,垂直距离为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度,但没有其他 我错

我有一个中点p1,用于沿角度a创建直线:

到目前为止还不错

现在我需要创建一条与第一条线平行的新线,垂直距离为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度,但没有其他

我错过了什么

这几乎适用于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);
这几乎适用于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);

你的想法是正确的,你使用的角度增加了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度

调用一次以获得原始线端点,
p2
,再调用一次以获得垂直线端点,
p3
,再调用两次以获得平行线,
p4,p5

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);
}
绘制点的结果为


i基准线端点(黑色)、垂直线端点(红色)、平行线(蓝色和绿色)。

您的想法是正确的,将所使用的角度增加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度

调用一次以获得原始线端点,
p2
,再调用一次以获得垂直线端点,
p3
,再调用两次以获得平行线,
p4,p5

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);
}
绘制点的结果为


i基线端(黑色)、垂直线端(红色)、平行线(蓝色和绿色)。

可能?图片会有很大的帮助:)创建垂直线时有困难吗?或者你在使垂直线达到正确长度方面有困难吗?对于
X
坐标,它不应该是
D*Math.Cos
吗?你真的应该开始在radiasmaybe中工作吗?一张图片会走很长的路:)你在创建垂直线方面有困难吗?或者你在使垂直线的长度正确时遇到困难了吗?对于
X
坐标,它不应该是
D*Math.Cos
?你真的应该开始在弧度和可能的范围内工作:已经尝试过了。没有任何正/余弦组合返回正确的角度结果!=45.为我工作了30度角。您可以在问题中添加示例输入和预期输出。我可以得到0-90的答案,但距离不确定。我认为为了使这个问题有意义,我需要将代码转换为生成Javascript的SVG。没有任何正/余弦组合返回正确的角度结果!=45.为我工作了30度角。您可以在问题中添加示例输入和预期输出。我可以得到0-90的答案,但距离不确定。我认为为了使这个问题有意义,我需要将代码转换为生成Javascript的SVG。良好使用DRY,这似乎解决了所有奇怪的+/-,sin/cos等问题。良好使用DRY,这似乎解决了所有奇怪的+/-,sin/cos等问题。