【问题标题】:C++ Move 2D Point Along AngleC++ 沿角度移动二维点
【发布时间】:2017-05-02 22:48:26
【问题描述】:

所以我正在用 C++ 编写游戏,目前我正在研究“指南针”,但我在矢量数学方面遇到了一些问题..

这是我创建的一张小图片,可能有助于更好地解释我的问题

好的,所以你可以看到A的二维位置从(4, 4)开始,但是我想将A沿45度角移动,直到二维位置到达(16, 16),所以基本上有A 的起点和终点之间的距离为 12。我的问题是如何计算?

【问题讨论】:

  • 我记得前几天看到了一个与此非常相似的问题,但这没有意义。你是在问如何在二维平面上平移一个点,给定一个角度和大小的方向?
  • 这个问题的定义很不明确,正如@George 所说,根本没有意义。如果您已经知道它会在哪里结束,为什么还要使用 trig 移动 A?请明确定义给定的信息,并考虑将问题移至更合适的地方,例如数学堆栈交换,因为这与编程或 c++ 无关。

标签: c++ vector 2d trigonometry angle


【解决方案1】:

2D 中最简单的方法是取角度“ang”、距离“d”以及起点“x”和“y”:

x1 = x + cos(ang) * distance;
y1 = y + sin(ang) * distance;

在 2D 中,任何对象的旋转都可以存储为单个值,ang。

对 x 使用 cos 对 y 使用 sin 是几乎每个人都这样做的“标准”方式。 cos(ang) 和 sin(ang) 随着 ang 的增加画出一个圆圈。 ang = 0 指向此处的 x 轴,随着角度的增加,它逆时针旋转(即在 90 度时它指向正上方)。如果你将 cos 和 sin 项换成 x 和 y,你会得到 ang = 0 沿着 y 轴指向上方,并且随着 ang 的增加顺时针旋转(因为它是镜像),实际上这对于制作游戏来说更方便,因为y 轴通常是“向前”方向,您可能希望增加 ang 向右旋转。

x1 = x + sin(ang) * distance;
y1 = y + cos(ang) * distance;

稍后您可以使用更灵活的方式做同样的事情的向量和矩阵,但 cos/sin 适合在 2D 游戏中开始使用。在 3D 游戏中,使用 cos 和 sin 进行旋转在某些情况下开始失效,您开始真正受益于学习基于矩阵的方法。

【讨论】:

【解决方案2】:

(4,4) 和 (16,16) 之间的距离实际上不是 12。使用勾股定理,距离实际上是 sqrt(12^2 + 12^2),即 16.97。要获得沿线的点,您需要使用正弦和余弦。例如。如果您想计算直线中途的点,x 坐标将为 cos(45)(16.97/2),y 为 sin(45)(16.97/2)。这适用于 45 度以外的其他角度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2020-01-11
    • 2021-06-14
    • 2021-06-11
    • 1970-01-01
    • 2013-04-05
    • 2016-06-30
    相关资源
    最近更新 更多