HTML5 Canvas - 计算物体相对于“磁铁”的速度

Posted

技术标签:

【中文标题】HTML5 Canvas - 计算物体相对于“磁铁”的速度【英文标题】:HTML5 Canvas - Calculate speed of object in relation to a 'magnet' 【发布时间】:2013-04-15 12:21:55 【问题描述】:

我的画布中间直接有一个“磁铁”,并且我有一些在点击时添加到画布中的对象。然后它们会被磁铁吸引。

我有对象之间的 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

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

谢谢

【问题讨论】:

你能准备一份fiddle吗?! jsfiddle.net/qk8Wk en.wikipedia.org/wiki/Newton%27s_law_of_universal_gravitation 【参考方案1】:

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

var distance2 = distanceX * distanceX + distanceY * distanceY;
var mag = n / distance2;

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

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

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

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

或者,避免使用三角函数(根据@JayC)

var norm = Math.sqrt(distance2);
var impulseX = mag * (distanceX / norm);
var impulseY = mag * (distanceY / norm);

【讨论】:

严格来说,数学三角函数的使用是不必要的。如果你让某个值norm=Math.sqrt(distanceX * distanceX + distanceY * distanceY),那么cos(theta) 在数学上等价于distanceX/norm,同样distanceY/norm 对应于sin(theta)。注意我说的是“数学上”等价的,就像浮点数一样,你可能会得到不同的结果。但是,由于该值通过较少的操作传递,如果您完全避免使用三角函数,我希望值的质量会更好。 @JayC 好点,虽然使用 trig 可能更容易理解(最初)。 很好的解决方案,效果很好。我什至没有在正确的轨道上思考我想要的东西。 发现了一个小故障,在小提琴中,很有趣:D,将鼠标放在白色大球的中间。【参考方案2】:

怎么样:

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

【讨论】:

你没有考虑到冲动的方向 你是对的,我想它是一个向量,并在最后一刻添加了X 后缀。现已修复。 您好,我接受了另一个答案,但此解决方案也很有效,效果略有不同:) 谢谢您的帮助【参考方案3】:

但距离越近,力量越弱,

非常合乎逻辑,因为差异变小了——所以差异 / 100 也变小了。

什么时候应该反过来,我该怎么做?

使您的因子乘法所基于的值变得更大,而不是更小 - f.e.

impulseX = ( (20 - distanceX) / 100)

【讨论】:

以上是关于HTML5 Canvas - 计算物体相对于“磁铁”的速度的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Canvas - 在不翻译上下文的情况下相对于对象的中心进行缩放

用kinect计算物体相对于相机的z坐标

[js高手之路] html5 canvas动画教程 - 匀速运动

如何用HTML5 的Canvas制作3D动画效果

如何用HTML5的Canvas制作3D动画效果

js + html5 怎么来绘制三维图形