Javascript HTML5画布-计算对象相对于';磁铁'; 我的画布中间有一个“磁铁”,我有一些物体在点击时被添加到画布上。然后它们被磁铁吸引

Javascript HTML5画布-计算对象相对于';磁铁'; 我的画布中间有一个“磁铁”,我有一些物体在点击时被添加到画布上。然后它们被磁铁吸引,javascript,html,math,canvas,Javascript,Html,Math,Canvas,我有物体之间的X和Y距离,大约在-20到20之间 这是我用来计算物体吸引力的方法,但它越近,力越弱,当力应该是相反的时候,我怎么能做到呢 impulseX = (distanceX / 100) impulseY = (distanceY / 100) 示例: Distance = 20, speed = 0.05 Distance = 10, speed = 0.1 Distance = -20, speed = -0.05 Distance = -10, speed = -0.1 我正在

我有物体之间的X和Y距离,大约在-20到20之间

这是我用来计算物体吸引力的方法,但它越近,力越弱,当力应该是相反的时候,我怎么能做到呢

impulseX = (distanceX / 100)
impulseY = (distanceY / 100)
示例:

Distance = 20, speed = 0.05
Distance = 10, speed = 0.1
Distance = -20, speed = -0.05
Distance = -10, speed = -0.1
我正在做的示例:

谢谢

但距离越近,力越弱

这很合乎逻辑,因为差异越来越小,所以/100的差异也越来越小

当它应该是另一种方式,我怎么能这样做

impulseX = (distanceX / 100)
impulseY = (distanceY / 100)
使因子乘法所基于的值变大,而不是变小–f.e

impulseX = ( (20 - distanceX) / 100)
但距离越近,力越弱

这很合乎逻辑,因为差异越来越小,所以/100的差异也越来越小

当它应该是另一种方式,我怎么能这样做

impulseX = (distanceX / 100)
impulseY = (distanceY / 100)
使因子乘法所基于的值变大,而不是变小–f.e

impulseX = ( (20 - distanceX) / 100)
那么:

var distance = Math.sqrt(distanceX*distanceX + distanceY*distanceY)
impulseX = 0.1*distanceX / distance
impulseY = 0.1*distanceY / distance
也可以使用距离^2:

var distance2 = distanceX*distanceX + distanceY*distanceY
impulseX = 0.1*distanceX / distance2
impulseY = 0.1*distanceY / distance2
那么:

var distance = Math.sqrt(distanceX*distanceX + distanceY*distanceY)
impulseX = 0.1*distanceX / distance
impulseY = 0.1*distanceY / distance
也可以使用距离^2:

var distance2 = distanceX*distanceX + distanceY*distanceY
impulseX = 0.1*distanceX / distance2
impulseY = 0.1*distanceY / distance2

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

其中,
n
是表示磁场强度的一般常数

然后,冲量需要与冲量的方向成比例:

var theta = Math.atan2(distanceY, distanceX);
var impulseX = mag * Math.cos(theta);
var impulseY = mag * Math.sin(theta);

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


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

其中,
n
是表示磁场强度的一般常数

然后,冲量需要与冲量的方向成比例:

var theta = Math.atan2(distanceY, distanceX);
var impulseX = mag * Math.cos(theta);
var impulseY = mag * Math.sin(theta);

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


你能准备一份吗?!你能准备一份吗?!你没有考虑到冲动的方向,你是对的,我计算出它是一个向量,并在最后一刻添加了
X
后缀。现在已修复。嗨,我接受了另一个答案,但这个解决方案也很有效,效果稍有不同:)谢谢你的帮助你没有考虑到冲动的方向你是对的,我算出了它是一个向量,并在最后一刻添加了
X
后缀。现在修复了。嗨,我接受了另一个答案,但这个解决方案也很有效,有一个稍微不同的效果:)谢谢你的帮助严格来说,数学三角函数的使用是没有必要的。如果让某个值
norm=Math.sqrt(distanceX*distanceX+distanceY*distanceY)
,那么
cos(θ)
在数学上等价于
distanceX/norm
,同样地
distanceY/norm
对于
sin(θ)
。请注意,我说的“数学上”等价,就像在浮点运算中一样,可能会得到不同的结果。但是,由于值通过的操作越来越少,如果您完全避免使用trig函数,我希望值的质量会更好。@JayC很好,尽管使用trig(最初)可能更容易理解。很好的解决方案,这非常有效。我绝对没有考虑过正确的轨道来找到我想要的东西。在小提琴中发现了一个小故障,非常有趣:D,把鼠标放在大白球的中间。严格地说,使用数学三角函数是不必要的。如果让某个值
norm=Math.sqrt(distanceX*distanceX+distanceY*distanceY)
,那么
cos(θ)
在数学上等价于
distanceX/norm
,同样地
distanceY/norm
对于
sin(θ)
。请注意,我说的“数学上”等价,就像在浮点运算中一样,可能会得到不同的结果。但是,由于值通过的操作越来越少,如果您完全避免使用trig函数,我希望值的质量会更好。@JayC很好,尽管使用trig(最初)可能更容易理解。很好的解决方案,这非常有效。我绝对没有想过沿着正确的轨道来做我想要的。在小提琴中发现了一个小故障,非常有趣:D,把老鼠放在大白球的中央。