这可能是一道非常愚蠢的数学题,但我似乎想不通。我在a点有一个圆圈,我可以点击它并将鼠标从中拖动。当鼠标释放时,释放点B被视为目标点,球必须朝那个方向移动。我现在做的事情是这样的:
velocityX = (b.x - a.x) / somenumber
velocityY = (b.y - a.y) / somenumber
这使我可以使用不同的"射击"速度,鼠标从圆圈释放得越远。但现在我意识到我不喜欢这个想法,相反,我想用以下方式来做:
- 以具有最小和最大速度(每个动画帧的像素)
- 在击球前从该间隔中选择速度
- 使用点B只是为了更容易地定位。拍摄速度是预先选择的,不应该取决于鼠标释放的距离
我知道这应该非常简单,但我(知道点A和B的坐标、最小值、最大值和选定的速度)如何在考虑拍摄方向的情况下将x和y速度设置为圆?
我可以想出两种方法。
假设从a到b的角度是T。那么:
T等于atan((b.y-y.y)/(b.x-a.x)
知道T,就可以计算x和y速度:
Vx=cos(T)VVy=sin(T)V
这应该行得通。
为了更快,你可以直接计算cos(T)和sin(T)。
sin(T)给出了y/h的比例,其中h是a和b之间的线的长度。
我们可以使用勾股定理计算h:
h=sqrt((b.y-y.y)^2+(b.x-a.x)^2)
由此我们可以导出Vx和Vy 的公式
Vx=V*(b.x-a.x)/sqrt((b.y-y.y)^2+(b.x-a.x)^2)
Vy=V*(b.x-a.x)/sqrt((b.y-y.y)^2+(b.x-a.x)^2)
这可能会更快,特别是如果你有一个勾股定理函数。
只需将从圆心到该点的向量归一化,然后乘以所需的速度。在任何goodl矢量库中都有这样一个函数,但只是为了澄清:
length=square_root((b.x - a.x)^2+(b.y - a.y)^2)
velocityX = (b.x - a.x) / length * speed
velocityY = (b.y - a.y) / length * speed