圆形坠落模拟算法设计

目标:实现一个算法,模拟在一个封闭二维区域,圆形小球朝给定方向坠落的过程,实现二维区域的紧密填充。

像下面这样:

 

 

难点,及其简单解决:

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_radio=0.0;double high_radio=1.0;//mesh->x_num + mesh->y_num;best=low_radio;bool at_least_one_success=false;double mid;double step=mesh->get_step();Point new_point;while(fabs(low_radio-high_radio)>0.000001){mid=(low_radio+high_radio)/2;new_point.x=p->x + direc_x * step * mid;new_point.y=p->y + direc_y * step * mid;bool result=mesh->can_move_point(p,new_point);if(result){low_radio=mid;best=max(best,mid);at_least_one_success=true;}else{high_radio=mid;}//cout<<"mid="<<mid<<" best="<<best<<" result="<<result<<endl;}if(!at_least_one_success)return false;x=p->x + direc_x * step * best;y=p->y + direc_y * step * best;return true;
}

  

 

转载于:https://www.cnblogs.com/windydays/archive/2012/07/26/2609256.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven详细教学

一、Maven简介 maven&#xff1a;是apache下的一个开源项目&#xff0c;是纯java开发&#xff0c;并且只是用来管理java项目的 依赖管理&#xff1a;就是对jar包的统一管理 可以节省空间 项目一键构建&#xff1a;mvn tomcat:run该代码可以将一个完整的项目运行起来&#xff0…

Java Character.UnicodeBlock of()方法与示例

Character.UnicodeBlock类的()方法 (Character.UnicodeBlock Class of() method) of() method is available in java.lang package. of()方法在java.lang包中可用。 of() method is used to return the Unicode block containing the given parameter value or it returns null…

simpleDBM的B-link树实现

参考的是VLDB2005的这篇论文&#xff0c;做个标记把。/Files/YFYkuner/Concurrency_control_and_recovery_for_balanced_B-link_trees.pdf 转载于:https://www.cnblogs.com/YFYkuner/archive/2009/12/21/1629268.html

网站后台中对html标签的处理

最近做一个CMS&#xff0c;后台中需要使用在线编辑器对新闻进行编辑&#xff0c;然后发表。我用的在线编辑器是CKEditorCKFinder。也许是我为了让CKEditor更本地化吧&#xff0c;改了很多。后来发现在CKEditor中对文字设置字体、颜色、字号大小时文字的<span>标签会出现N…

Java Calendar getActualMaximum()方法与示例

日历类的getActualMaximum()方法 (Calendar Class getActualMaximum() method) getActualMaximum() method is available in java.util package. getActualMaximum()方法在java.util包中可用。 getActualMaximum() method is used to return the maximum value that the given …

软件研发人员考核的十项基本原则(转)

软件研发人员考核的十项基本原则 作者: 任甲林 来源: 万方数据 软件研发人员的考核一直是软件企业管理的难点笔者在长期的研发管理实践与咨询实践中总结了进行软件研发人员考核的一些基本原则。(1) 要体现公司的价值观公司的价值观体现了公司认可什么类型的人员&#xff1f;…

2012.7.24---C#(2)

学习过了C#的基本属性函数后&#xff0c;接下来的学习我觉得比较重要。C#是一种面向对象的语言&#xff0c;下面复习一下面向对象中的一些名词。 类&#xff1a;把一些系列东西&#xff0c;把他们的共同的属性和方法抽象出来&#xff0c;给他起一个名字就是XXX类。类中定义…

汇编语言-001(BYTE、DUP、WORD 、DWORD 、QWORD 、TBYTE 、REAL )

1 : 基础汇编语言展示 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCmov eax,5add eax,6INVOKE ExitProcess,0 main ENDP END main2:基础汇编语言展示增加变量的访问 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dw…

<各国地图轮廓app>技术支持

如在app使用过程中遇到任何问题&#xff0c;请与开发者联系caohechunhotmail.com

Java BigDecimal longValueExact()方法与示例

BigDecimal类longValueExact()方法 (BigDecimal Class longValueExact() method) longValueExact() method is available in java.math package. longValueExact()方法在java.math包中可用。 longValueExact() method is used to convert this BigDecimal to an exact long val…

c#中的多线程同步

在处理多线程同步问题的时候&#xff0c;我们一般有临界区&#xff0c;互斥量&#xff0c;信号量和消息机制等几种解决方案&#xff0c;在c#中可以非常方便的使用它们来实现进程的同步。下面我就常用的lock,Monitor和Mutex几种来说明如何实现进程的同步。 lock和Monitor依靠一种…

ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“

windows下&#xff1a; ffplay 提示"SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can’t initialize audio client" 添加环境变量&#xff1a;SDL_AUDIODRIVERdirectsound

js 正则表达式,正整数

var ss "3.333";var type /^[0-9]*[1-9][0-9]*$/;var re new RegExp(type);alert(ss.match(re));if (ss.match(re) null) {alert("请输入大于零的整数!");return;} 转载于:https://www.cnblogs.com/lingxzg/archive/2012/08/02/2620543.html

java 根据类名示例化类_Java即时类| EpochSecond()方法的示例

java 根据类名示例化类EpochSecond()方法的即时类 (Instant Class ofEpochSecond() method) Syntax: 句法&#xff1a; public static Instant ofEpochSecond(long sec_val);public static Instant ofEpochSecond(long sec_val, long nanos_adjust);ofEpochSecond() method is…

java中Date()类型输入数据的处理

对于Date类型的数据&#xff0c;需要输入生日存入相应数据库中 private Date birthday;// 生日package com.pdsu.mybatis.pojo;import java.io.Serializable; import java.util.Date;public class User implements Serializable {/*** */private static final long serialVers…

(扩展)欧几里德快速幂

GCD模板 __int64 gcd(__int64 a,__int64 b) {return b0? a:gcd(b,a%b); } 欧几里德算法又称辗转相除法&#xff0c;用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理&#xff1a; gcd函数就是用来求(a,b)的最大公约数的。 gcd函数的基本性质&#xff1a; gcd(a,…

汇编语言-002(.data、Equal、$、EQU 、MOV 、MOVSX、MOVZX)

1&#xff1a;变量相加程序 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data firstval DWORD 20002000h secondval DWORD 11111111h thirdval DWORD 22222222h sum DWORD 0.code main PROCmov eax,firstvaladd eax,secondvaladd eax,thirdvalm…

\r与\n的区别,\r\n与\n或\r的区别(C语言/C#)

本文出处http://topic.csdn.net/t/20020718/07/882679.html 原作者:triout&#xff08;笨牛&#xff09; \r表示回车&#xff0c;\n表示换行&#xff0c;我们按回车按钮的时候&#xff0c;系统自动产生回车和换行两个字符&#xff1a; 回车仅仅是表示完成&#xff0c;把光…

通过ID查询一个用户的两种开发方法

通过ID查询一个用户的两种开发方法 数据库建表sql语句如下&#xff1a;https://github.com/beyondyanyu/Sayingyy/blob/master/JDBC2-数据库sql建表语句 ①&#xff0c;原始Dao开发&#xff1a; UserDao.java&#xff08;接口&#xff09;: package com.pdsu.mybatis.dao;i…

duration java_Java Duration类| minusMinutes()方法与示例

duration java持续时间类minusMinutes()方法 (Duration Class minusMinutes() method) minusMinutes() method is available in java.time package. minusMinutes()方法在java.time包中可用。 minusMinutes() method is used to subtract the given duration in minutes from t…