★算法高手们:粒子碰撞检测

mngzilin 2010-07-23 08:12:11
问题:

http://topic.csdn.net/u/20100723/19/47b03f81-c82c-48f6-8868-a729fe0ac5a7.html

只要方法可行,分数都归你!~~

谢谢
...全文
212 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mngzilin 2010-07-25
[Quote=引用 12 楼 mngzilin 的回复:]
引用 11 楼 zmshy2128 的回复:
已经很优化了,建议好好读我的那段文字
for (k = 1:5000) //循环每个粒子
进行更新粒子k的坐标x、y
在大数组中,以坐标(x,y)为中心,检测半径r内的所有点的值,如果存在点的值不为0(假设有值为k2的点),则该点与其他点相撞(与第k2个粒子相撞),处理方法LZ自己解决;否则半径r内的所有点的值全部 设为值k。
end

……
[/Quote]

这个不如划分网格效率高,但是划分网格我还没有解决粒子大小不一问题
回复
mngzilin 2010-07-25
[Quote=引用 13 楼 ljia0 的回复:]
可以换个思路,不要取中心点,可以检测边界点,当某点属于两粒子以上就说明他碰撞(前提是粒子碰撞不变形)。
[/Quote]

主要是检测“某点属于两粒子”需要遍历其5000个点
回复
ljia0 2010-07-24
可以换个思路,不要取中心点,可以检测边界点,当某点属于两粒子以上就说明他碰撞(前提是粒子碰撞不变形)。
回复
mngzilin 2010-07-24
哎,要是能在不降低精度前提下,减少运算次数最好了。否则每一帧都要检测5000x5000次,这太庞大了。
回复
Arucart 2010-07-24
6楼的意思是说整个平面分成一个个微元
然后每个球也相对于圆心表示成一系列微元的集合

然后每一帧对每一个球检查是否有微元被重复覆盖..

是个O(n)的算法,不过这个占用空间也太大了吧.....
回复
mngzilin 2010-07-23
[Quote=引用 11 楼 zmshy2128 的回复:]
已经很优化了,建议好好读我的那段文字
for (k = 1:5000) //循环每个粒子
进行更新粒子k的坐标x、y
在大数组中,以坐标(x,y)为中心,检测半径r内的所有点的值,如果存在点的值不为0(假设有值为k2的点),则该点与其他点相撞(与第k2个粒子相撞),处理方法LZ自己解决;否则半径r内的所有点的值全部 设为值k。
end

而且可以解决不同尺寸粒子的问题
[/Quote]

你的办法我再缕一缕,测试下
回复
zmshy2128 2010-07-23
已经很优化了,建议好好读我的那段文字
for (k = 1:5000) //循环每个粒子
进行更新粒子k的坐标x、y
在大数组中,以坐标(x,y)为中心,检测半径r内的所有点的值,如果存在点的值不为0(假设有值为k2的点),则该点与其他点相撞(与第k2个粒子相撞),处理方法LZ自己解决;否则半径r内的所有点的值全部 设为值k。
end


而且可以解决不同尺寸粒子的问题
回复
mngzilin 2010-07-23
回复6楼:

这个算法仍然有问题,当你判断半径为r的圆形区域有无粒子时候要遍历5000个点才能知道。这样同样复杂。耗时。

和划分网格也不一样
回复
mngzilin 2010-07-23
[Quote=引用 6 楼 zmshy2128 的回复:]
分给我吧,我知道怎么做

思想
1、将水平平面 数字化,用一个大数组表示(每个点的精度自己去估计)。
每个圆形粒子的面积也数字化表示,每个固定时刻在 大数组中 只占用一定数目的点(圆形分布)。
2、定义表示粒子的类,需要中心坐标 x、y、和半径r表示,不同的半径r,对应不同的圆形分布点数(这是个固定值,预先求好)。定义5000个粒子变量,并初始化
3、设置定时器,在每个周期内,需要……
[/Quote]

谢谢这位朋友,
你的方法类似于划分网格,也就是我所提到的算法四。这样次数确实少了很多。但是5000个点的位置的标记过程可否优化?期待.....
回复
winton_adlsy 2010-07-23
mark
回复
GResume 2010-07-23
楼上的我怎么没看懂 悲剧
回复
zmshy2128 2010-07-23
分给我吧,我知道怎么做

思想
1、将水平平面 数字化,用一个大数组表示(每个点的精度自己去估计)。
每个圆形粒子的面积也数字化表示,每个固定时刻在 大数组中 只占用一定数目的点(圆形分布)。
2、定义表示粒子的类,需要中心坐标 x、y、和半径r表示,不同的半径r,对应不同的圆形分布点数(这是个固定值,预先求好)。定义5000个粒子变量,并初始化
3、设置定时器,在每个周期内,需要定义一个大数组(表示整个水平平面),并全部初始化为0
for (k = 1:5000) //循环每个粒子
进行更新粒子k的坐标x、y
在大数组中,以坐标(x,y)为中心,检测半径r内的所有点的值,如果存在点的值不为0(假设有值为k2的点),则该点与其他点相撞(与第k2个粒子相撞),处理方法LZ自己解决;否则半径r内的所有点的值全部 设为值k。
end

注意,该方法不是两两检测粒子间的距离,典型的以空间换时间的技巧 O(∩_∩)O
回复
mngzilin 2010-07-23
满三天结贴
回复
renjianxin520 2010-07-23
mark
回复
ayw215 2010-07-23
围观。。
回复
mngzilin 2010-07-23
期待

回复
healer_kx 2010-07-23
mark~~~
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告