【问题标题】:Trigonometry issue - Create a PointF using an angle三角问题 - 使用角度创建 PointF
【发布时间】:2012-03-05 20:38:39
【问题描述】:

我已经为此苦苦思索了很长一段时间了。我想我小时候应该在三角数学课上多加注意,但我们开始吧:

我有一个角度和一个点。然后我想在角度方向上放置第二个点,距离第一个点 200 个单位。我用 Atan2 得到角度,然后用 cos 和 sin 得到第三个点。但是...我认为在计算 p3.Y 的 Sin 时出了点问题。

编辑:为了澄清,我删除了 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;

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

【问题讨论】:

  • 最终计算不应该在某个时候引用X 值吗?
  • 不要相信我的话,但我相信你应该用弧度来表达这些角度。
  • @Damien_The_Unbeliever - 我会在哪里使用 X 点?
  • @NikoDrašković - 是的,也许这会简化,但在我的最终代码中,我会得到一个角度角度,所以我至少需要了解如何正确地来回转换。
  • p3 是否应该在 p1-p2 定义的行上?我不太擅长阅读代码或思想(!),但您对问题的描述似乎与您的代码不一致。如果 p3 不应该在那条线上,那么“介于两者之间”是什么意思?

标签: c# .net trigonometry


【解决方案1】:

您当前代码的问题是您没有计算相对于p1p3。需要在p3的坐标上加上p1.Xp1.Y

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】:

    如果 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(当然不是),则将该值替换为它们之间的 Euclidean Distance

    如果你仍然想要计算比率的线的斜率

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

    它将斜率作为单个数字提供,其中 1 表示以+45deg 角度穿过原点的线。稍微摆弄一下就会把斜率变成角度,当直线垂直时要小心,即比率的分母是0。

    【讨论】:

    • 是的,问题是在我的最终代码中,我只会得到一个角度和一个 PointF。然后我需要弄清楚如何在 200 单位外创建第二个 PointF。
    • @BlueVoodo:现在我发现你的问题更加令人困惑。你为什么不编辑它以清楚地说明你的要求是什么?类似于:给定一个 2D 点和一个 {angle, distance},计算从第一个点移除的第二个点的 {x,y} 坐标。我不明白你为什么要涉及第三点。你肯定把我弄糊涂了,可能你自己也弄糊涂了。在您编辑完问题后,我会再回来看看。
    • 很抱歉给您带来了困惑。我编辑了我的评论以进一步澄清。我只使用 p2 来轻松获得一个角度并能够在我的图像中直观地表示它。
    • @BlueVoodoo:彻底编辑你的问题,我认为 p2 完全是多余的,并且会误导问题的读者。
    • 现在你已经有了你一直想问的问题的答案了!
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,但在我的最终代码中,我不仅有角度和第一点,所以我需要了解如何完成这项工作。
    • 我猜 atan 表示有误。 atan 它不是角度的完整表示。寻找 atan 的值范围。 en.wikipedia.org/wiki/Atan2
    • 我认为你在获得 atan 时会错过四分之一的单位。
    • 让我多读一点。当你说“四分之一公寓”时,你的意思是什么?我将如何修改我的代码以进行调整?
    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2018-08-27
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多