该算法适合常见的二维完全弹性碰撞的场合,支持对心碰撞(正碰)和非对心碰撞(斜碰),不考虑碰撞过程中的机械能损耗,不考虑物体表面摩擦以及恢复系数。

/* * this是自身对象,sp是碰撞的对象 * this.m   质量 * this.r   半径 * this.vx  水平速度 * this.vy  竖直速度 * 为了便于理解,代码未经优化!*/
collide(sp) {
    if (this.isCollideWith(sp)) {        // 利用弹性碰撞公式计算水平、竖直方向上的速度分量let vx = this.vxlet vy = this.vythis.vx = ((this.m - sp.m) * this.vx + 2 * sp.m * sp.vx) / (this.m + sp.m)this.vy = ((this.m - sp.m) * this.vy + 2 * sp.m * sp.vy) / (this.m + sp.m)sp.vx = (2 * this.m * vx + (sp.m - this.m) * sp.vx) / (this.m + sp.m)sp.vy = (2 * this.m * vy + (sp.m - this.m) * sp.vy) / (this.m + sp.m)
        // 关键!在速度突变的情况下(例如碰壁反弹,或者另一物体被挤压以至于无法移动),必须防止位置重叠的情况出现        // nextXPos和nextYPos是提前判断二者下一帧的位置。若下一帧位置重叠,则反弹。let ax = this.nextXPos()let ay = this.nextYPos()let bx = sp.nextXPos()let by = sp.nextYPos()if (Math.sqrt((ax - bx) ** 2 + (ay - by) ** 2) < (this.r + sp.r)) {let agl = 0  // 反弹方向相对屏幕坐标系的角度if (this.x != sp.x)agl = Math.atan((this.y - sp.y) / (this.x - sp.x))
          // 反弹的速度的方向需根据二者位置来确定let v = Math.sqrt(this.vx ** 2 + this.vy ** 2)this.vx = v * Math.cos(agl) * (this.x > sp.x ? 1 : -1)this.vy = v * Math.sin(agl) * (this.y > sp.y ? 1 : -1)v = Math.sqrt(sp.vx ** 2 + sp.vy ** 2)sp.vx = v * Math.cos(agl) * (sp.x > this.x ? 1 : -1)sp.vy = v * Math.sin(agl) * (sp.y > this.y ? 1 : -1)}}

转载于:https://www.cnblogs.com/mygodfalling/p/9047590.html

二维非对心弹性碰撞的算法相关推荐

  1. 二维光子晶体禁带的遗传优化算法实现

    二维光子晶体禁带的遗传优化算法MATLAB源代码 光子晶体中因周期性结构而存在的频率禁带称为光子禁带,光子禁带的存在是光子晶体具有广泛应用前景的重要原因. 禁带越大,可控光的频带也越宽,因此如何设计合 ...

  2. 看懂二维码识别OCR:从算法到API 接入代码

    引言 二维码识别OCR(Optical Character Recognition)是结合了图像处理和OCR技术,以识别和提取二维码中的信息的技术,二维码识别OCR 可以实现对图像中的二维码进行自动检 ...

  3. 基于Excel的QR二维码生成工具——原理及算法详解(之一)

    老虎二维码(下载链接在这里)是一个基于Excel的二维码生成工具,完全使用Excel表单公式结合VBA实现,没有调用任何外部库,实现了支持中文英文混合字符以及常用微信二维码编码的自动生成,在工作表单元 ...

  4. 数组(一维数组、多维数组/二维数组)和简单排序算法

    提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...

  5. 矩阵(二维数组)的性质在算法求解中的应用

    本文所说的矩阵(matrix),其实在编程实现时,往往以二维数组的形式出现. 1. 对称矩阵(二维数组) 在求解旅行商问题时,题干中要求,城市之间彼此互通(两城市之间的道路只有一条). double ...

  6. C++多小球非对心弹性碰撞(HGE引擎)

    程序是一个月前完成的,之前一直没正儿八经的来整理下这个程序,感觉比较简单,不过即使简单的东西也要跟大家分享下. 源码下载:http://download.csdn.net/detail/y851716 ...

  7. 二维点云拉普拉斯深度平滑算法-matlab

    克服普通平滑会破坏括扑关系的问题,引入权值,更加可靠 输入:data:数据集 kkk:邻域搜索范围,视情况定 M:迭代次数,越高,平滑越夸张 function [data]=Laplacian_dee ...

  8. MATLAB编写界面实战-一款优良的二维非结构化网格生成软件

    主核调用c语言编写的delaucy非结构化网格生成器,采用Matlab编写界面,界面代码如下: %--------------------------------------------------- ...

  9. ICEM 二维非结构网格添加边界层

    1. 导入几何后,创建材料点. 2. 将需要增加边界层的线.以及线所在的面,分别定义到不同的parts中.假设取名分别叫做line和surface. 3. 设置面网格尺寸.线尺寸(如果需要的话),照常 ...

  10. 种子点生长算法(上)——二维种子点生长

    本文只用作笔记,方便日后查阅. 种子点生长算法上--二维种子点生长 下文提到的种子点生长算法,包括泛洪法,扫描线法,区段法三种.文本先从最简单的泛洪法入手介绍种子点生长算法的相关概念.之后进一步讨论了 ...

最新文章

  1. 一切技术创新史都是数据史
  2. 模式7--ThreadPerMessage
  3. 用筛选法求100以内的素数(数组)
  4. mysql的连表查询_MySQL_连表查询
  5. 学习Python编程的最好的几本书
  6. 群人各说什么是哈希算法?
  7. 查询用户分配角色TCODE
  8. mysql去掉乱码_mysql消除乱码方法集
  9. vue-router的两种模式
  10. 2017年终总结,开始写博客的第一年
  11. ESP32小网关应用,嵌入式串口转以太网,支持蓝牙+wifi
  12. OpenStack创建实例提示失败的具体原因如下: created even after we waited 191 seconds or 61 attempts
  13. 微信去除 防欺诈或盗号请不要输入qq密码 的方法
  14. 一种LCD屏闪问题的调试
  15. Android更换logo之后小米手机和部分三星手机通知栏的小图标未显示正确的图标问题
  16. 基于springboot的问卷调查系统的设计与实现
  17. ICP许可证过期了还能补办吗
  18. Visual Studio C++ 输出调试信息在调试-输出窗口
  19. 农业灌区量测水流量在线监测系统解决方案
  20. ### Cause: java.sql.SQLSyntaxErrorException: ORA-00903: 表名无效

热门文章

  1. 计算两个日期之间,相差多少天C语言详解
  2. 方差公式Var(x)=E(x^2)-[E(x)]^2,求期望值
  3. 企业短信平台发展趋势和展望——SUBMAIL赛邮
  4. SEO与SEM有什么区别?
  5. Python学习(52周存钱)
  6. 【计算机前沿知识】大数据与数据挖掘
  7. 超低功耗高性能2.4GHz GFSK 无线收发芯片Si24R1替代NRF24L01P
  8. SpringSecurity前后端分离
  9. C站一名 普通技术博主 的终端与【开端】,因为热爱,所以习惯,2021~2022
  10. Excel如何根据身份证号码计算年龄