【发布时间】:2018-03-08 12:27:21
【问题描述】:
在我正在开发的游戏中,我有一座可以向敌人射击的塔。当敌人进入射程时,我试图让我的塔向敌人射击。我的火球出现了,但是我无法将火球移动到敌人身上。我最近的尝试只是让球在屏幕上跳舞。
球有一个 x 和 y 位置(类似于球开始的位置。 球还有一个 newX 和 newY 位置,即敌人所在的位置。我正在考虑做毕达哥拉斯定理,但这只能让我得到我想要旅行的线路长度。然后我在网上搜索并发现了有关 sin、cos 和 atan 的信息。我使用 atan 来获得我计算出的斜率角度,然后将角度代入 sin 和 cos。
我的 Ball::Update 函数如下所示:
int dx = newX - x;
int dy = newY - y;
int ang = atan(dy, dx);
x += cos(ang);
y += sin(ang);
那里的代码使球在屏幕上看起来“跳舞”。它根本不动。我用这些行测试了我的代码:
x += cos(45); y += sin(45);
球以 45 度角移动(向东南方向移动),这是意料之中的。所以我猜我的错误是在计算角度时。有没有数学专家可以帮忙?
【问题讨论】:
-
ang应该是浮点单元并使用atan2。 x 和 y 如果还不是浮点单位,也应该是浮点单位。 -
我真的怀疑你使用例如
sin(45)用于计算窦,因为std::sin(和其他三角函数)期望其参数以 弧度 为单位。 -
为什么这么复杂?请搜索线性插值。 x(t) = (1 - t) * x0 + t * x1。从 x0 到 x1 以任意步骤从 0 ... 1 迭代 t。 (对 y 应用相同的公式来成对计算 x 和 y。)
-
通常计算不是基于角度,而是基于方向向量
-
cos(45)不会给出你想的结果。三角函数的参数是弧度,而不是度数。
标签: c++ line angle trigonometry