大连科技学院官方网站的建设与放,山东通app官网下载二维码,wordpress 地址调用,鸿扬家装公司简介目标#xff1a;实现一个算法#xff0c;模拟在一个封闭二维区域#xff0c;圆形小球朝给定方向坠落的过程#xff0c;实现二维区域的紧密填充。 像下面这样#xff1a; 难点#xff0c;及其简单解决#xff1a; 1.如何把粒子移动尽可能远#xff1f; 图中的粒子i…目标实现一个算法模拟在一个封闭二维区域圆形小球朝给定方向坠落的过程实现二维区域的紧密填充。 像下面这样 难点及其简单解决 1.如何把粒子移动尽可能远 图中的粒子i能往下移动多远一般情况,碰撞边界 一个简单解法 注意如下事实判断两个粒子是否重叠判断粒子是否和边 界线重叠都是十分容易的。 据此定义函数 f (r) 如下 考虑把粒子往前推的过程最开始 f (r) 1当推进到一个临界值后f (r) 0, 因此f (r) 的函数图像是 代码如下 //找出一个点在一个方向上最远可以前进多远限于一步之内该点可以不属于这个mesh如果不能前进返回false
bool most_advance(Point* p,double direc_x,double direc_y,Mesh *mesh,double x,double y,double best){//二分法求根。if(!(p-can_move))return false;double low_radio0.0;double high_radio1.0;//mesh-x_num mesh-y_num;bestlow_radio;bool at_least_one_successfalse;double mid;double stepmesh-get_step();Point new_point;while(fabs(low_radio-high_radio)0.000001){mid(low_radiohigh_radio)/2;new_point.xp-x direc_x * step * mid;new_point.yp-y direc_y * step * mid;bool resultmesh-can_move_point(p,new_point);if(result){low_radiomid;bestmax(best,mid);at_least_one_successtrue;}else{high_radiomid;}//coutmidmid bestbest resultresultendl;}if(!at_least_one_success)return false;xp-x direc_x * step * best;yp-y direc_y * step * best;return true;
}转载于:https://www.cnblogs.com/windydays/archive/2012/07/26/2609256.html