编程模拟自然(八):几种常见力的建模

  古书记载:大河之东,有美丽佳人,乃天帝之子,机杼女工,年年劳役,织成云雾绢缣之衣,天帝怜其独处,嫁与河西牵牛为妻。

  自此即废织紝之功,留恋不归。天帝大怒,责归河东,令他们每年只有七月七日可以相会一次。有诗云:

  纤云弄巧,飞星传恨,银汉迢迢暗渡。

  金风玉露一相逢,便胜却人间无数。

  柔情似水,佳期如梦,忍顾鹊桥归路。

  两情若是长久时,又岂在朝朝暮暮

第零章 实例化一个长整型

  “无名儿,来个睡前故事吧。”

  “猿叔,我才是小孩子唉!”

  “你当然是小屁孩,我这是培养你的语言表达能力。”

  “哦,那给你讲个牵牛星和织女星的故事。”

  ...

  “从前有个出身码农世家的孩子,爹娘给他取了NewLong的名字。”

  “不愧码农世家,完全符合匈牙利命名法。”元吐槽道。

  “...后来NewLong和一位下凡仙女成为夫妻。”

  “码农怎么可能有女朋友?”元惊讶不已。

  “从此夫妻过着男编女织的生活...”

  “...”元陷入了沉思。

  “直到有一天从天而降的天神打破了原有的平静...”

  “我预感到接下来就是转折。”元不再思考。

  “...天神带走了仙女,NewLong失去了妻子。”

  “哈哈哈哈,我就说码农怎么能有女朋友。”元得意洋洋起来。

第一章 重力

  失去妻子后,NewLong对生活失去了信心,从此没日没夜的写着代码。

  一天儿子Newton哭着从外面回来,说一颗苹果从树上落下砸到了自己。

  NewLong一边安慰着儿子,一边想“为什么苹果不往天上掉,砸死那天神呢?”

  在现实中,我们可能会有一种错觉:质量越大的物体下落速度越快。当然这是错的,而牛顿第二定律告诉我们:质量越小,加速度越大。但是事实并非如此,如果你登上比萨斜塔的顶层,让两个质量不同的铁球同时从上面落下,那个铁球会先着地?伽利略已经在1589年做过这个测试,他发现两个铁球下落加速度相等,最后同时击中地面。

  我们在编程中可以简单的模拟重力。

    Dim gravityVec As New Vector2(0, 0.1 * SubWalker.Mass)
    SubWalker.ApplyForce(gravityVec)

  再模拟一个向右的风力。

    Dim windVec As New Vector2(0.1, 0)
    Dim gravityVec As New Vector2(0, 0.01 * SubWalker.Mass)
    SubWalker.ApplyForce(windVec)
    SubWalker.ApplyForce(gravityVec)

图1.1 物体受重力、向右风力作用

  尽管物理下落的速度相等,但质量越小的物体向右运动的加速度越大,因为风力的强度和物体的质量无关。

第二章 摩擦力

  在发现重力后,NewLong对生活恢复了一些信心,继续没日没夜的写着代码。

  一天儿子Newton又哭着从外面回来,说从土坡上滑下来磨破了裤子。

  NewLong一边缝补着裤子,一边想“只要土坡‘足够光滑’,裤子还会破吗?”

  摩擦力是一种耗散力。耗散力的定义是:在运动中使系统总能量减少的力。比如说开车时,脚踩刹车板会让车通过摩擦力使轮胎减速,在这个过程中,动能被转化为热能。只要两个物体的表面相互接触并有相对运动的趋势,它们之间就有摩擦力。摩擦力可分为静摩擦力(物体相对于表面静止不动)和动摩擦力(物体在表面上发生运动)。

  这里我们只对动摩擦力进行模拟。

  Dim frictionMag As Single = 0.1 ‘系数
  Dim frictionVec As New Vector2(SubWalker.Velocity.X, SubWalker.Velocity.Y) ‘由当前速度向量初始化
  frictionVec = -frictionVec ‘向量反向
  frictionVec.SetMag(frictionMag) ‘重新设定向量长度
  SubWalker.ApplyForce(frictionVec)

图1.1 物体受重力、向右风力和摩擦力作用

  物体受摩擦力,反弹后无法回到原来的高度。

第三章 空气和流体阻力

  物体通过流体或者气体时同样会受摩擦力的作用,这种摩擦力有很多名字,如粘滞力、阻力和流体阻力。流体阻力产生的效果和前述的摩擦力相同(物体会减速),但是计算阻力的方式却有些不同。

  简化的阻力计算公式:阻力=速度的平方*阻力系数

    Private Sub ApplyDrag(SubWalker As RndWalker)
        Dim vLen As Single = SubWalker.Velocity.Length
        Dim dragMag As Single = 0.05 * vLen * vLen ‘系数
        Dim dragVec As New Vector2(SubWalker.Velocity.X, SubWalker.Velocity.Y) ‘由当前速度向量初始化
        dragVec = -dragVec ‘向量反向
        dragVec.SetMag(dragMag) ‘重新设定向量长度
        SubWalker.ApplyForce(dragVec)
    End Sub

图3.1 物体受重力、流体阻力、向右外力(抛物线)

  不同物体反弹后升起的高度不再一致。

 图3.2 物体受重力、流体阻力(垂直下落)

  图中灰色区域是模拟物体落入水中,你会发现物体越小(质量越轻),速度减小的越快。

第四章 万有引力

  后来,NewLong对生活找回了全部信心,他决定生活不再只是代码,还有诗。

  有天晚上NewLong陪着儿子Newton看星星,繁星漫天,有感而发:

  远远的街灯明了/好像闪着无数的明星

  天上的明星现了/好像点着无数的街灯

  想那缥缈的空中/定然有她美丽的身影

  引力是最常见的力,当地球吸引苹果下落的同时,苹果对地球也有引力作用,只不过地球过于庞大,苹果的作用力完全可以忽略不计。

  由引力的计算公式我们可以知道:物体距离越远,引力越弱;物体距离越近,引力越强。

  现在,我们让鼠标指针吸引物体,并假设指针的质量为1.0f

    Private Sub ApplyAttract(SubWalker As RndWalker, MouseVec As Vector2)
        Dim mouseMass As Single = 1.0f ‘鼠标质量
        Dim gValue As Single = 100f ‘引力常量
        Dim attractVec As Vector2 = MouseVec - SubWalker.Location ‘由二者向量差初始化
        Dim aLen As Single = attractVec.Length ‘距离
        Dim attractMag As Single = (gValue * mouseMass * SubWalker.Mass) / (aLen * aLen) ‘计算模长
        attractVec.SetMag(attractMag) ‘重置向量长度
        SubWalker.ApplyForce(attractVec)
    End Sub

  图4.1 鼠标吸引物体  

  附加题:观察图像并回答鼠标大致在什么位置。(5分)

第五章 长征系列火箭

  当然生活不只是代码和诗,还有远方。NewLong一直有个伟大的计划,他要去天上找回昔日的姑娘。

  --中文名:长征运载火箭

  --外文名:NewLong

  --别称:新长整型号

  --是否拥有轨道舱:是

  --是否拥有返回舱:是

  就在NewLong准备上天前夜,一直默默无闻的老牛突然说话了:“我就要死了,但我一直有个飞天的梦想。”

  月纪8年,9月1日,元告别无名儿后发射火箭离开了月球

  9月20日,元进入地月转移轨道

  10月6日,元抵达地球同步轨道

  10月7日,元与仍旧在轨的NewLong号返回舱完成对接.

  ...

  “返回舱返回程式重新生成中。”

  “生成成功1个,失败0个。”

  “部署成功1个,失败0个。”

  “Console:助推火箭启动,尝试再入角修正”

  “Warning:反椎发动机推力计算时抛出了异常,发生除零运算。”

  元选择了继续。

  “Warning:再入角修正时抛出了异常,这将可能导致坠毁。”

  元看到“坠毁”,一瞬间想了很多。

  “Console:再入速度修正中,即将再入大气层。”

  …

  “Console:软着陆程式就绪,副伞开启。”

  元抬头看了看,原来是一块牛皮伞,这下牛皮真上天了。

后记

  “这是哪儿?”元爬出返回舱时下意识说了句话。

  视野内一片碧蓝,随后仿佛听到了些许鸟语。

  “一Bug还未平息,一Bug又来侵袭,茫茫码海狂风暴雨…”

  “…这里是Sad Pacific Ocean。”

  元这下看清楚了,他眼前飘下来个鸟人。

附录

1.预知前情,请看上回分解。也可以浏览目录导航

2.New是VB.NET语言中的关键字,用以创建一个类的实例

3.参考书籍:《The Nature of Code》[美] Daniel Shiffman 著

时间: 2024-11-15 18:07:01

编程模拟自然(八):几种常见力的建模的相关文章

【目录导航】编程模拟自然系列博文

简介 博文名称:编程模拟自然 系列别称:奇幻元纪 主要角色:元.无名儿 角色设定:(按出场顺序) 元:故事主角,拥有创世能力的程序猿 亚和夏:生活在元创造的世界里的人类 NvWa:传说通过重构天阙代码完成补天的程序Yuan 盘古:上古程序架构师,后世传有生平语录<盘语>一书 吴刚:在月亮上中终日砍伐桂树的码农 无名儿:故事主角,一破小孩儿 嫦娥:奔月的仙子,身居广寒宫 天狗:妖物,来源不明 望舒:御车之神,管辖月宫禁地 VisualSnake:伊甸园里的可视化集成开发环境,外形同蛇 后羿:(下

编程模拟自然(七):力学矢量与牛顿定律

序 旧书有云:古者十日并出,草木焦槁,一曰后羿者射日,太阳里之九鸟皆死,救苍生于涂炭. 传闻后羿所用箭矢加持了力学模拟系统,可实现深空精确制导,才得以击落太阳. ... “星星挂在天边,就像梦想遥不可现...”元哼唧着. “猿叔你在哼什么曲子啊?” “...星星消失在天边,就像诺言来不及实现...”元对无名儿捂着双耳选择无视. “咳咳,我这是在朗诵诗人小刚的诗歌呢!” ... 第零章 “星星挂在天...你爸曾经射落过太阳?”元刚要继续深情朗诵,似乎想到了什么. “是的,听娘说爹地最厉害了.” “

编程模拟自然(九):元胞自动机

序 旧书有云:发鸠之山,其上多柘木.有鸟焉,其状如乌,文首.白喙.赤足,名曰精卫,其鸣自詨. 一日,精卫游于码海,溺而不返,后常衔西山之木石,以堙于海.有诗为证: 万事有不平,尔何空自苦: 长将一寸身,衔木到终古? 我愿平码海,身沉心不改: 码海无平期,我心无绝时. 呜呼!君不见,西山衔木众鸟多,鹊来燕去自成窠! (前情提要:主角元乘坐返回舱降落到了码海上,随后遇到了个鸟人...) “咳咳,远道的客人,我名精卫XIV,乃是先祖精卫鸟的第十四代后裔...”鸟人作自我介绍 “...你是谁,从哪里来又

编程模拟自然(三):更好的静态树算法

序 旧言月中有桂,有蟾蜍,故异书言,月桂高五百丈,下有一人常斫之,树创随合. “汪...”一声猿啸从天际传来. 吴刚抬头看了看天,却没有发现什么,只当是出现了幻听. 第零章 提出问题 元来到这个世界已经好多天了,本想去找那树下的人探听一些消息,却不想竟然无法进入桂树百丈范围. 元在伊甸园里种过树的,但看到那桂树受创随即便愈合,倍感神奇.看来需要更新算法了. “这颗树的全称为Graphics User Interface Tree,中文简称:桂树.” 第一章 作出假设 每个树枝都是一个独立的结点,

编程模拟自然(一):如何画一颗静态树

序 万物初始之前,宇宙是无边无际混沌的黑暗,只有元之灵穿行其间.元对这无边的黑暗十分不满,就轻轻一敲键盘,说:“要有光”,于是世间就有了光.元称“光”为“昼”,称“黑暗”为“夜”.亮光隐去,黑暗重临,从此,世间就有了昼与夜的交替.这是元创世的第一天. 这个二次元世界诞生之初伴有一只程序猿,Ta的名字叫元. 第一章 二叉树必须是最好的树! 元就是这样想的,为了表达对这种数据结构的崇拜之情,决定在这个世界造出一颗真实的树,一开始的构想是这样的 “正所谓树极生三干,三干生六枝,六枝生十二叶.” 然而这

iOS中有3种常见的多线程编程方法

1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC实现的.NSOperation以面向对象的方式封装了需要执行的操作,然后可以将这个操作放到一个NSOperationQueue中去异步执行.不必关心线程管理.同步等问题. 3.Grand Centeral Dispatch 简称GCD,iOS4才开始支持,是纯C语言的API.自iPad2开始,苹果设备开始有了双核CPU,为了充分利用这

对几种常见设计模式的理解

 转自:  http://blog.csdn.net/dengpeng0419/article/details/48110841 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现.在<建

C# 实现AOP 的几种常见方式

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获.性能监控等 AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码,比如如下代码: class RealA { public virtual string Pro { get; set; } public virtual void ShowHello(string

总结几种常见web攻击手段及其防御方式

本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 XSS 概念 全称是跨站脚本攻击(Cross Site Scripting),指攻击者在网页中嵌入恶意脚本程序. 案列 比如说我写了一个博客网站,然后攻击者在上面发布了一个文章,内容是这样的 <script>window.open("www.gongji.com?param="