我已经在这一段时间里摸不着头脑了。猜猜我年轻的时候应该在三角学数学课上多关注但是我们走了:
我有一个角度和一个观点。然后我想在角度方向上放置第二个点,距离第一个点200个单位。我使用Atan2获得角度,然后使用cos和sin获得第三个点。但是......我认为在为p3.Y计算罪时会出现问题。
编辑:为了澄清,我删除了p2并直接使用了角度:
PointF p1 = new PointF(20, 20);
double angle = 1.3034851559678624f;
//Create a new PointF in the same direction, 200 pixels away from p1
//{ X = 199,9482, Y = 4,549629 }
PointF p3 = new PointF
{
X = (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
Y = (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
};
//This is where I would expect 1.3034851559678624 as the first angle
//but I get -4.9073849244837184
double angle2 = Math.Atan2(p3.Y - p1.Y, p3.X - p1.X) * 180 / Math.PI;
以下是上述值的直观表示。绿线是第一个角度。
答案 0 :(得分:1)
如果p3应该在p1-p2线上,你根本不需要使用任何三角法。您可以直接从p1和p2的坐标中找到p3的坐标。假设p1和p2之间的距离是1000个单位。然后p3的位置,p1的200个单位是:
{p1.x+(p2.x-p1.x)*(200/1000),p1.y+(p2.y-p1.y)*(200/1000)}
如果两点之间的距离不是1000(当然也不是1000),请用它们之间的Euclidean Distance替换该值。
如果您仍想要线的斜率,则计算比率
(p2.y-p1.y)/(p2.x-p1.x)
它给出了作为单个数字的斜率,其中1表示以+45deg
角度穿过原点的直线。稍微摆弄会使斜率变成角度,当线条垂直时要小心,即比率的分母为0。
答案 1 :(得分:1)
您当前代码的问题在于您不会相对于p3
计算p1
。您需要将p1.X
和p1.Y
添加到p3
的坐标:
PointF p3 = new PointF
{
X = p1.X + (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
Y = p1.Y + (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
};
答案 2 :(得分:0)
你不必使用atan来获得角度然后计算sin / cos。 你可以从点的坐标直接得到罪和cos。
cos = (p2.x - p1.x)/length
sin = (p2.y - p1.y)/length