您有正确的想法,将您使用的角度添加 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。
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);
}
绘制点结果
原线末端(黑色)、垂直线末端(红色)、平行线(蓝色和绿色)。