请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于球体碰撞的问题

首先第一个要解决的就是怎么判断球体有没有发生了碰撞,现在我在这里难住了,  根据我们已知的条件 (1)所有小球的数组, (2)每个小球的半径, (3)每个小球的圆心坐标, 我们要根据这三个条件来判断小球是否发生了碰撞,因为圆跟圆的碰撞,碰撞点可能是圆周上的任意一点,所以根据坐标点计算,好像是不太行了,有没有哪位同学知道比较好点的办法,分享一下。谢谢了

https://img1.sycdn.imooc.com/szimg/59e9ba2d000150ba07970809.jpg

正在回答

1回答

liuyubobobo 2017-10-21 07:19:59

其实这个问题我本来计划单独拿出一章进行介绍的,但是最后由于时间原因,没有作介绍。


简单来说,你给出的条件落了一个非常重要的条件,我们还知道每一个小球的速度(方向和大小)。所以,每两个小球之间发生碰撞(如果发生的话)的位置是可以计算的:)


但即使加上这个条件,完成这个任务依然不容易。需要一定的物理知识。与此同时,这个问题有很多优化方案,可以深度结合数据结构的使用。如果感兴趣的话,可以查询一下和“碰撞检测”这个领域相关的资料:)

1 回复 有任何疑惑可以回复我~
  • 提问者 seeme0726 #1
    刘老师,我也在网上搜了,但是没有好的资料,你能给我贴出几个相关网址吗?多谢了。。
    回复 有任何疑惑可以回复我~ 2017-10-21 16:09:33
  • liuyubobobo 回复 提问者 seeme0726 #2
    随手搜了一个:http://ericleong.me/research/circle-circle/ 我没有特别仔细看,他也没有动态的最终效果,所以我不确定他的效果如何。但是可以以这个为起点,哪里发现他的实现不够好,或者和你想实现的有出入,或者想更深入去学习,继续去深挖。有时间的话我也会为这个课程补充一个这个问题的相关代码的:)加油!
    回复 有任何疑惑可以回复我~ 2017-10-21 16:20:28
  • 提问者 seeme0726 回复 liuyubobobo #3
    谢谢老师,我看了资料用了一个比较简单的方法实现了
    /**
     * 判断两圆是否发生碰撞.
     * 如果两圆的圆心距小于等于两圆的半径之和则判断为碰撞
     * @param circles
     */
    private void circleCollision(Circle[] circles){
    	int n = circles.length;
    	for (int i = 0;i<n;i++) {
    		if(circles[i].x!=x&&circles[i].y!=y){
    			Double s = centerDistance(new Point(x, y),
    				       new Point(circles[i].x, circles[i].y));
    			if(s<=2*r){
    				vx=-vx;
    				vy=-vy;
    			}
    		}
    		}
    }
    
    /**
     * 两坐标点之间的距离
     * @param p1 第一个点的坐标
     * @param p2 第二个点的坐标
     * @return
     */
    private Double centerDistance(Point p1,Point p2){
    	 //x和y平方和的二次方根  
    	return Math.hypot((p2.x)-(p1.x),(p2.y)-(p1.y)); 
    }
    :)加油!
    回复 有任何疑惑可以回复我~ 2017-10-23 10:16:07
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信