圆形与矩形碰撞算法分析
圆形与矩形算法分析
首先,将矩形以外的区域分为8个象限,如下图:
由于小球是不断移动的,并且矩形也在不断的移动,因此小球的坐标( x 1 x_1 x1, y 1 y_1 y1),矩形的坐标( x 2 x_2 x2, y 2 y_2 y2)为变量。其中小球的半径,矩形的宽度和高度为常量
我们整理出以下信息为:
- 圆形信息:
- 右上角坐标( x 1 x_1 x1, y 1 y_1 y1)
- 圆形的宽( W 1 W_1 W1)、
- 圆形的高( H 1 H_1 H1)
- 其中 W 1 W_1 W1= H 1 H_1 H1, r 1 r_1 r1= 1 2 \tfrac{1}{2} 21 W 1 W_1 W1
- c x 1 cx_1 cx1= x 1 x_1 x1+ r 1 r_1 r1= x 1 x_1 x1+ 1 2 \tfrac{1}{2} 21 W 1 W_1 W1
- c y 1 cy_1 cy1= y 1 y_1 y1+ r 1 r_1 r1= y 1 y_1 y1+ 1 2 \tfrac{1}{2} 21 W 1 W_1 W1
- 矩形信息
- 右上角坐标( x 2 x_2 x2, y 2 y_2 y2)
- 矩形的宽(W2)
- 矩形的高(H2)
- c x 2 cx_2 cx2= x 2 x_2 x2+ 1 2 \tfrac{1}{2} 21 W 2 W_2 W2
- c y 2 cy_2 cy2= y 2 y_2 y2+ 1 2 \tfrac{1}{2} 21 H 2 H_2 H2
如图下图所示:
第1 象限算法
圆形在第一部分内容碰撞的条件如下:
- 小球的圆心一定在划分第一部分。
- 小球和圆心的距离和矩形右上角的距离不会小于小球的半径。
整理以后可以得出小球的圆心所画出的轨迹如下图:
那么可以得出公式如下:
- 小球的圆心一定在划分第一象限。
c x 1 cx_1 cx1< x 2 x_2 x2 && c y 1 cy_1 cy1 < y 2 y_2 y2 =>
x 1 x_1 x1 + r 1 r_1 r1 < x 2 x_2 x2 && y 1 y_1 y1 + r 1 r_1 r1 < y 2 y_2 y2 =>
x 1 x_1 x1 + r 1 r_1 r1 - x 2 x_2 x2 < 0 && y 1 y_1 y1 + r 1 r_1 r1 - y 2 y_2 y2 < 0
满足以上条件表示小球在第一象限 - 小球和圆心的距离和矩形右上角的距离不会小于小球的半径。
( c x 1 cx_1 cx1 - x 2 x_2 x2 ) 2 ^2 2 + ( c y 1 cy_1 cy1 - y 2 y_2 y2 ) 2 ^2 2 < r 1 r_1 r1 2 ^2 2 =>
( c x 1 cx_1 cx1 - x 2 x_2 x2 ) 2 ^2 2 + ( c y 1 cy_1 cy1 - y 2 y_2 y2 ) 2 ^2 2 - r 1 r_1 r1 2 ^2 2 < 0
满足以上条件表示小球碰撞到矩形右上角顶点
int x1,y1;
int x2,y2;
const int r1 = 5;
const int w2 = 40;
const int h2 = 20;
int cx1 = x1 - r1;
int cy1 = y1 - r1;
int actual_range = (cx1-x2)*(cx1-x2) + (cy1-y2) * (cy1-y2);
int rr = r1*r1;
if( (x1 + r1 - x2) < 0 && (y1 + r1 - y2) < 0&& actual_range - rr < 0){printf("小球在第一象限内碰撞到矩形\r\n");
}
同理方法可以推倒3、5、7象限的碰撞情况。
第2、6象限算法
小球在第2、6 象限内
可以画图如下:
可得公式如下:
满足以下需求:
- 小球在第二象限和第六象限内
c x 1 cx_1 cx1 > x 2 x_2 x2 && c x 1 cx_1 cx1 < x 2 x_2 x2 + W 2 W_2 W2 =>
x 1 x_1 x1 + r 1 r_1 r1 > x 2 x_2 x2 && x 1 x_1 x1 + r 1 r_1 r1 < x 2 x_2 x2 + W 2 W_2 W2 =>
x 1 x_1 x1 + r 1 r_1 r1 - x 2 x_2 x2 > 0 && x 1 x_1 x1 + r 1 r_1 r1 - x 2 x_2 x2 - W 2 W_2 W2 < 0 =>
x 1 x_1 x1 - x 2 x_2 x2 + r 1 r_1 r1 > 0 && x 1 x_1 x1 - x 2 x_2 x2 + ( r 1 r_1 r1 - W 2 W_2 W2) < 0
满足以上条件表示小球在第二第六象限内 - 小球中心点的高度与矩形中心点的高度的绝对值不能小于小球半径和矩形高度的二分之一的和
| c y 1 cy_1 cy1 - c y 2 cy_2 cy2 | < r 1 r_1 r1 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 =>
| y 1 y_1 y1 + r 1 r_1 r1 - ( y 2 y_2 y2 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 ) | < r1 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 =>
- r 1 r_1 r1 - 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 < y 1 y_1 y1 + r 1 r_1 r1 - ( y 2 y_2 y2 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 ) < r1 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 =>
- r 1 r_1 r1 - 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 < y 1 y_1 y1 + r 1 r_1 r1 - ( y 2 y_2 y2 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 ) && y 1 y_1 y1 + r 1 r_1 r1 - ( y 2 y_2 y2 + 1 2 \tfrac{1}{2} 21 H 2 H_2 H2 ) < r1 + $\tfrac{1}
- 2 r 1 2r_1 2r1 < y 1 y_1 y1 - y 2 y_2 y2 && y 1 y_1 y1 - y 2 y_2 y2 < H 2 H_2 H2 =>
y 2 y_2 y2 - y 1 y_1 y1 - 2 r 1 2r_1 2r1 < 0 && y 1 y_1 y1 - y 2 y_2 y2 - H 2 H_2 H2 < 0
int x1_x2 = x1 - x2;
int r1_W2 = r1 - W2;if ( ( x1_x2 + r1 ) > 0 && (x1_x2 + r1_W2) < 0 && (y2 - y1 - 2r1) < 0 && (y1 - y2 + H2 ) < 0){printf("小球在第二、六象限内碰撞到矩形\r\n");
}
同理方法可以推倒4和8 象限的碰撞。
以上只是算法思路有不对的地方请指出。
小伙伴,如果本文对你有帮助。
圆形与矩形碰撞算法分析相关推荐
- 碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞
一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...
- HTML矩形与矩形、圆形与圆形、矩形与圆形元素的碰撞判断与动画
1. 矩形与矩形 判断两个矩形是否碰撞,判断条件:d1Right > d2Left && d1Bottom > d2Top && d1Left < d ...
- 2d游戏碰撞检测C语言,2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascrip版)...
一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...
- 2D游戏中的碰撞检测:圆形与矩形碰撞检测(JavascriptC++版)
这几天放寒假了,时间也多了起来,当然又有时间搞搞程序了.哈哈~ 昨天在开发我的塔防游戏时突然发现人物实际攻击范围比规定的范围小,按理说应该是一样大的,但偏偏不是,我被这个问题搞得糊里糊涂的,一直没想出 ...
- 在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。此外还有些不同的特征,比如,圆形都有半径,可以根据半
代码 import org.w3c.dom.ls.LSOutput;/*在画图软件中,可以画出不同大小或颜色的圆形.矩形等几何图形.几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是 ...
- Flutter Hero 实现径向变换动画 — 圆形变成矩形的转场动画
系列文章 Flutter 旋转动画 - RotationTransition Flutter 平移动画 - 4种实现方式 Flutter 淡入淡出与逐渐出现动画 Flutter 尺寸缩放.形状.颜色. ...
- 树莓派:基于opencv+Python的颜色形状识别(红色、蓝色的圆形、矩形、三角形)
要求 :分辨出一个随机颜色(红色,蓝色)的图形(圆形,矩形,三角形) 思路 : HSV色块识别+轮廓提取+同一高度面积识别 一.HSV模型 HSV(Hue, Saturation, Value)是根据 ...
- android 圆形图片设置蒙层,Android引导蒙层,安卓新手引导图,引导图层,支持椭圆,圆形,矩形多种形状,一行代码快速搞定-Go语言中文社区...
新手引导视图,初次打开页面时显示. 支持圆形,椭圆,矩形等多种图形 提示部分支持图片和文字提示 先看效果图 使用步骤. 使用起来特别简单,只需要把GuideView这个类复制到你的项目中就可以了 pa ...
- HTML5系列代码:绘制一个圆形和矩形叠加的图形
一个画布在网页中是一个矩形框,通过 元素来绘制. 注意: 默认情况下 元素没有边框和内容. <!DOCTYPE HTML> <html> <head> <me ...
最新文章
- Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决
- copy模块中的copy与deepcopy的区别
- Ensemble learning(集成学习)
- php 8 jit,PHP JIT 是什么?PHP8 新特征之 JIT 图文详解_后端开发
- 服务器php 启动命令_服务端的cli方式运行
- 向linux内核版本号添加字符/为何有时会自动添加“+”号
- jQuery源码分析 Callbacks
- 【Flink】改进的BLOB存储架构
- 树莓派3B+64位系统烧制与软件安装
- 解决:‘webpack-dev-server‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
- CSDN第二篇文章· 爬虫突破封禁的6种常见方法
- oracle找出两张表中不同的数据
- 手把手带你Yolov5 (v6.x)添加注意力机制(一)(并附上30多种顶会Attention原理图)(新增8种)
- Python —— excel 创建 复制 删除,获取最大行列
- 计算机英语单词怎么读,英语单词read怎么读,read的音标是什么,read是什么意思 - 音标网...
- 热强化硅酸钠玻璃建筑玻璃英国UKCA认证—EN 1863-2
- 如何分析数据建立数据表
- 如何有效提高营销型企业官网客户成交率?
- 工业控制系统协议相关的安全问题
- Golang的Ticker使用姿势
热门文章
- 解决Figures now render in the Plots pane by default. To make them also appear inline in the Console
- 友元函数实现复数加减法
- 浅谈京东静态html原理,京东首页前端架构设计.ppt
- Android App links 链接打开app功能
- 更换VScode背景图,设置VScode背景为你喜欢的图片
- 普教同步课堂、专递课堂建设解决方案
- windows下Typhon程序使用Hudson完成自动编译
- libgdx开发记录
- 西南大学计算机考研资料汇总
- Powershell / windows终端 无法加载文件 因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170