繁体   English   中英

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

[英]Trigonometry issue - Create a PointF using an angle

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

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

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

视觉概述

好吧,如果p3应该在p1-p2线上,你根本不需要使用任何三角法。 您可以直接从p1和p2的坐标中找到p3的坐标。 假设p1和p2之间的距离是1000个单位。 那么来自p1的p3,200个单位的位置是:

{p1.x+(p2.x-p1.x)*(200/1000),p1.y+(p2.y-p1.y)*(200/1000)}

如果两点之间的距离不是1000(当然不是1000),则将它们替换为它们之间的欧几里德距离

如果您仍想要线的斜率,则计算比率

(p2.y-p1.y)/(p2.x-p1.x)

它给出了作为单个数字的斜率,其中1表示以+45deg度角度穿过原点的直线。 稍微摆弄会将斜率转变为角度,当线条垂直时要小心,即比率的分母为0。

您当前代码的问题是您不会相对于p1计算p3 您需要将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)
};

你不必使用atan来获得角度然后计算sin / cos。 你可以从点的坐标直接得到罪和cos。

cos = (p2.x - p1.x)/length
sin = (p2.y - p1.y)/length

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM