基于角度、速度与起始点的位置计算问题求助
问题根源与解决方案
哈哈,这个问题我之前帮好几个开发者排查过!核心问题很简单——你用错了三角函数的参数单位!
关键错误点
绝大多数编程语言里的cos()和sin()函数,要求传入的参数是弧度(Radian),但你直接传入了角度(Degree)。这就导致计算完全偏离预期:
- 当你传入90度时,函数会把它当成90弧度来计算。90弧度换算成角度大概是5156度,对应的
cos(90)≈-0.448,sin(90)≈0.894。这样X方向会加上10*(-0.448)≈-4.5,Y方向加上10*0.894≈8.9,结果自然是斜向移动,和你看到的情况完全吻合。
修复步骤
你需要先把角度转换成弧度,转换公式是:
弧度 = 角度 * π / 180
修改你的代码,先做单位转换再计算:
var radian: Double; begin radian := direction * Pi / 180; self.px.X := round(self.px.X + self.speed * cos(radian)); self.px.Y := round(self.px.Y + self.speed * sin(radian)); end;
验证预期结果
当方向为90度时,转换成弧度是π/2:
cos(π/2) = 0,所以X坐标保持不变sin(π/2) = 1,所以Y坐标增加10(你的速度值)
这样点就会垂直向下移动(因为你的坐标系原点在屏幕左上角,Y值增大是向下),完全符合你的预期。
另外提醒一句:如果你的方向定义是“向上为90度”,可能需要调整Y方向的符号(比如改成-self.speed * sin(radian)),但先解决弧度转换的问题,再根据实际坐标系微调即可。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

