三角函数问题 - 使用角度创建PointF

时间:2012-03-05 11:53:29

标签: c# .net trigonometry

我已经在这一段时间里摸不着头脑了。猜猜我年轻的时候应该在三角学数学课上多关注但是我们走了:

我有一个角度和一个观点。然后我想在角度方向上放置第二个点,距离第一个点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;

以下是上述值的直观表示。绿线是第一个角度。

Visual overview

3 个答案:

答案 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.Xp1.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

http://en.wikipedia.org/wiki/Line_%28geometry%29