HTML5 Canvas - 计算与'磁铁'相关的对象速度

Hen*_*ryz 1 javascript math html5 canvas

我的Canvas中间直接有一个"磁铁",我有点击时添加到画布中的对象.然后他们被吸引到磁铁上.

我有物体相对于彼此的X和Y距离,大约在-20到20之间.

这是我用来吸引对象的计算,它可以工作,但越接近,力就越弱,当它应该相反时,我该怎么做?

impulseX = (distanceX / 100)
impulseY = (distanceY / 100)
Run Code Online (Sandbox Code Playgroud)

例子:

Distance = 20, speed = 0.05
Distance = 10, speed = 0.1
Distance = -20, speed = -0.05
Distance = -10, speed = -0.1
Run Code Online (Sandbox Code Playgroud)

我正在做的例子:http://jsfiddle.net/qk8Wk/

谢谢

Aln*_*tak 6

你的冲动应遵循平方反比定律,即

var distance2 = distanceX * distanceX + distanceY * distanceY;
var mag = n / distance2;
Run Code Online (Sandbox Code Playgroud)

其中n是表示场强的一般常数.

那么冲动需要与冲动的方向成比例:

var theta = Math.atan2(distanceY, distanceX);
var impulseX = mag * Math.cos(theta);
var impulseY = mag * Math.sin(theta);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/alnitak/BH5qL/

或者,避免触发功能(根据@JayC)

var norm = Math.sqrt(distance2);
var impulseX = mag * (distanceX / norm);
var impulseY = mag * (distanceY / norm);
Run Code Online (Sandbox Code Playgroud)

  • 严格地说,不需要使用数学三角函数.如果你让一些值为'norm = Math.sqrt(distanceX*distanceX + distanceY*distanceY)`,那么`cos(theta)`在数学上等同于`distanceX/norm`和类似`distanceY/norm`的`sin(theta) )`.注意我说,"数学上"等价,就像浮点数一样,你可能得到不同的结果.但是,当值通过较少的操作时,如果你完全避免使用trig函数,我会期望值的质量更好. (2认同)