闲来没事,突然想起了,最初学Android时,老师教过最简单矩形碰撞和精灵切割这些简单的算法,当时还说Android主要分两个方向,一个是做应用,一个是做游戏,现在想来,那夕阳下的奔跑,那是我逝去的青春…
虽然现在主要是做Android应用开发,但是闲着没事,也就突然想着,把这简单的平面物体碰撞检测算法试着分析分析,并整理写了下。
代码如下:
/**
* @author Jenly
* @date 2016-6-2
*/
public class CollsionUtils {
/**
* 点与矩形碰撞
* @param x1
* 点的x坐标
* @param y1
* 点的y坐标
* @param x2
* 矩形的x坐标
* @param y2
* 矩形的y坐标
* @param w
* 矩形的宽度
* @param h
* 矩形的高度
* @return
*/
public static boolean isCollsionWithPointAndRect(int x1,int y1,int x2,int y2,int w,int h){
//如果点在矩形的左边或在矩形的右边或在矩形的上边或在矩形的下边 则表示点与矩形没有发生碰撞,反之则表示发生碰撞
if(x1<x2 || x1>x2+w || y1<y2 || y1>y2+h)
return false;
return true;
}
/**
* 点与圆碰撞
* @param x1
* 点的x坐标
* @param y1
* .
* 点的y坐标
* @param x2
* 圆心的x坐标
* @param y2
* 圆心的y坐标
* @param r
* 圆的半径
* @return
*/
public static boolean isCollsionWithPointAndCircle(int x1,int y1,int x2,int y2,int r){
//根据点和圆心画直角坐标系,算出点和圆心的直线距离(即直角三角形的斜线),如果点和圆心的距离大于圆的半径则认为点与圆没有发生碰撞,反之则发生了碰撞
if(Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2))>r)
return false;
return true;
}
/**
* 矩形碰撞
* @param x1
* 矩形1的x坐标
* @param y1
* 矩形1的y坐标
* @param w1
* 矩形1的宽度
* @param h1
* 矩形1的高度
* @param x2
* 矩形2的x坐标
* @param y2
* 矩形2的y坐标
* @param w2
* 矩形2的宽度
* @param h2
* 矩形2的高度
* @return
*/
public static boolean isCollsionWithRect(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){
//如果矩形1在矩形2的左边或在矩形的右边或在矩形的上边或在矩形的下边 则表示点与矩形没有发生碰撞,反之则表示发生了碰撞
if(x1+w1<x2 || x1>x2+w2 || y1+h1<y2 || y1>y2+h2)
return false;
return true;
}
/**
* 矩形与圆碰撞
* @param x1
* 矩形的x坐标
* @param y1
* 矩形的y坐标
* @param w
* 矩形的宽度
* @param h
* 矩形的高度
* @param x2
* 圆心的x坐标
* @param y2
* 圆心的y坐标
* @param r
* 圆的半径
* @return
*/
public static boolean isCollsionWithRectAndCircle(int x1,int y1,int w,int h,int x2,int y2,int r){
//把圆看成一个矩形,判断矩形碰撞,如果碰撞了,则矩形与圆也一定彭碰撞了,反之则判断矩形的四个角是否与圆碰撞
if(isCollsionWithRect(x1, y1, w, h, x2-r, y2-r, 2*r, 2*r))
return true;
//矩形的左上角与与圆碰撞了
if(isCollsionWithPointAndCircle(x1, y1, x2, y2, r))
return true;
//矩形的右上角与与圆碰撞了
if(isCollsionWithPointAndCircle(x1+w, y1, x2, y2, r))
return true;
//矩形的左下角与与圆碰撞了
if(isCollsionWithPointAndCircle(x1, y1+h, x2, y2, r))
return true;
//矩形的右下角与与圆碰撞了
if(isCollsionWithPointAndCircle(x1+w, y1+h, x2, y2, r))
return true;
//以上条件都不满足则表示没有发生碰撞
return false;
}
/**
* 圆形碰撞
* @param x1
* 圆1的圆心x坐标
* @param y1
* 圆1的圆心y坐标
* @param r1
* 圆1的半径
* @param x2
* 圆2的圆心x坐标
* @param y2
* 圆2的圆心y坐标
* @param r2
* 圆2的半径
* @return
*/
public static boolean isCollsionWithCircle(int x1,int y1,int r1,int x2,int y2,int r2){
//根据两个圆心的坐标画直角坐标系,算出两个圆心的直线距离(即直角三角形的斜线),两个圆心的直线距离大于两个圆的的半径距离则表示没有发生碰撞,反之则发生了碰撞
if(Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2))> r1+r2)
return false;
return true;
}
}
写着写着,突然想到,还有多边形碰撞,椭圆碰撞,不规则形状物体碰撞,越想越复杂,好像能写的还挺多…
分享到:
相关推荐
二维场景中的AABB碰撞检测主要依赖于物体在X轴和Y轴上的投影。如果两个物体在X轴和Y轴上各自的投影都有重叠部分,那么这两个物体就可能发生碰撞。具体来说,我们可以比较两个物体的边界坐标,例如,如果物体A的Y轴...
在数学和几何学入门部分,作者介绍了矩阵、坐标系统、向量、质心坐标、直线与平面等基本概念,这些基础知识对于理解后续的碰撞检测算法至关重要。例如,向量不仅是描述位置和方向的基础工具,也是进行几何计算的基本...
在计算机图形学中,碰撞检测是一项关键的技术,用于模拟现实世界中的物理交互。在这个例子中,我们关注的是“一个很好的碰撞检测例子(精确到球和面片)”,它使用OpenGL进行实现,专注于球体与三角面片之间的碰撞...
碰撞检测不仅涉及到物体是否相交,还涉及到如何精确、高效地判断碰撞以及如何响应碰撞事件。下面我们将深入探讨这个话题。 首先,我们要了解基本的几何形状碰撞检测。在OpenGL游戏中,常见的物体形状包括点、线段、...
6. **应用场景**:这种碰撞检测技术在游戏开发中尤为常见,例如角色与地形的交互、物体的碰撞反弹、射击游戏的子弹轨迹检测等。 7. **拓展应用**:除了点和平面,碰撞检测还可以扩展到点与线段、点与多边形、多边形...
碰撞检测的基本思想是检测两个或多个物体在空间中的位置关系,判断它们是否发生接触或者重叠。在OpenGL中,通常有两种类型的碰撞检测:简单的几何体碰撞和复杂的多边形碰撞。 1. 简单几何体碰撞:如球体与球体、...
几何碰撞检测关注的是形状间的接触,如点、线、平面、多边形等之间的相互位置关系;物理碰撞检测则更复杂,涉及到物体的速度、加速度和弹性等因素,通常会结合物理引擎来实现。 基本的碰撞检测方法有多种,包括: ...
在计算机图形学领域,"碰撞检测mouse OpenGL" 是一个关键的概念,主要涉及到用户交互与3D场景中的物体交互。在本场景中,我们关注的是如何使用OpenGL库来实现鼠标与屏幕内3D对象的碰撞检测,并且是用C++语言进行编程...
碰撞检测的核心在于实时、精确地判断场景中物体之间是否发生碰撞,防止“穿墙”、“走人地下”等不真实的现象,从而维持虚拟世界的连贯性和逻辑性。 #### 碰撞检测概述与原理 碰撞检测主要涉及两个关键步骤:检测...
3. AABB的优势:AABB碰撞检测速度非常快,适用于大批量物体的初步筛选,减少不必要的精确碰撞检测计算。 三、球查询 球查询是另一种常用的碰撞检测方法,它通过一个球体来包围物体。在Ogre中,可以使用`Ogre::...
在计算机图形学中,碰撞检测是一项关键的技术,用于模拟物体之间的交互,特别是在游戏开发、物理模拟和虚拟现实等领域。"快速多边形碰撞检测"是一个高效处理多边形间碰撞问题的方法,它允许程序实时地识别两个或多个...
射线碰撞检测是D3D中的一种关键技术,用于确定3D空间中的射线与几何对象之间的交互,如物体选择(Pick)或交互式光照计算。 在D3D中,射线碰撞检测通常用于实现用户界面的拾取操作。例如,当玩家点击屏幕上的某个...
通过有效的碰撞检测机制,可以确保游戏中的物体能够按照物理规律进行运动,提升用户体验的真实性和沉浸感。 **关键知识点:** 1. **网格系统及其运动** - **坐标系映射:** 在3D游戏中,不同的坐标系用于描述物体...
在这个场景中,我们将关注的是小球(一个三维空间中的圆形对象)与多边形(通常为二维平面上的封闭图形)之间的碰撞检测。 小球与多边形的碰撞检测通常分为两个步骤:小球与多边形边界的碰撞检测,以及小球中心点与...
在计算机图形学中,碰撞检测是一项关键的技术,用于模拟物体之间的交互。本示例着重讨论的是在三维空间中,如何对两个三角形面片进行碰撞检测。"TTI"(Triangle-Triangle Intersection)是一种常见的算法,用于判断...
在三维计算机图形学领域,碰撞检测是一项关键的技术,用于判断两个或多个物体在空间中是否相交或接触。本篇文章将深入探讨3D碰撞检测的核心概念、常用算法、理论知识以及与OpenGL相关的拾取方法,特别聚焦于求交测试...
如果物体在上一帧位于平面前方,而在当前帧位于平面后方,则进一步执行碰撞检测;否则跳过后续步骤。 4. **确定碰撞范围**: - 为了确认物体是否在三角形的边界内穿过平面S,需要构建三个辅助平面(PS1、PS2、PS3)...