我正在开发一个基于浏览器的实验,其中我有N个特定的圆形(假设它们里面有独特的图片),需要将它们紧密地排列在一起,尽可能减少它们之间的空隙。它不必被排列成一个圆形,但它们应该“聚集”在一起。
圆的大小是可定制的,用户可以通过拖动JavaScript滑块来更改大小,更改一些圆的大小(例如,在滑块的10%中,圆4的半径为20px,圆2为10px,圆5保持不变等)。如您可能已经猜到的那样,当移动滑块时,我将尝试使调整大小和重新定位平稳过渡。
我迄今尝试的方法:而不是手动尝试对它们进行定位,我尝试使用物理引擎-
思路:
- 在屏幕中心放置某种重力吸引力
- 使用物理引擎来处理球的碰撞
- 在“拖动时间”滑块事件期间,我只会设置不同的球体尺寸,让引擎处理其余部分
为此任务,我使用了“box2Dweb”引擎。我将重力吸引放在屏幕中心,但是那花费了很长时间,直到球被放置在中心并开始漂移。然后我在中心放置了一个小的静态球体,使它们撞上它然后停止。看起来像这样:
结果稍微好了一些,但圆仍然在运动一段时间后才会静止。即使调整了变量,例如球体摩擦和不同的重力吸引,整个系统仍然只是漂移着,感觉非常“摇晃”,而我希望当我拖动时间滑块(更改大小时)时球能够移动。此外,box2d不允许更改对象的大小,我必须想办法解决这个问题。
所以,box2d方法让我意识到,也许让物理引擎处理这个问题不是最好的解决方案。或者可能我需要包括一些其他的力量,我还没有考虑到。我在StackOverflow上找到了一个与我的类似的问题,链接为this similar question。然而,非常重要的区别是它只一次生成一些n个不特定的圆圈,并且不允许额外的具体球大小和位置操作。我现在真的很困惑,有没有人有任何想法来解决这个问题?
更新:现在已经过去将近一年了,我完全忘记了这个主题。最终我做的是坚持物理模型并在几乎空闲的条件下重置力量/停止。结果可以看到这里http://stateofwealth.net/你看到的三角形在这些圆圈内部。其余的线通过“Delaunay三角测量算法”连接。