/*
* arcX,arcY表示圆的绘制坐标,就是左上角坐标 ,arcR为圆半径;rectX,rectY,rectW,rectH分别表示矩形的绘制坐标与宽高
*/
private static final boolean isArcRectCollides(int arcX,int arcY,int arcR,int rectX,int rectY,int rectW,int rectH){
int arcOx = arcX + arcR;//圆心X坐标
int arcOy = arcY + arcR;//圆心Y坐标
if(((rectX-arcOx) * (rectX-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)
return true;
if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)
return true;
if(((rectX-arcOx) * (rectX-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)
return true;
if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)
return true;
//分别判断矩形4个顶点与圆心的距离是否<=圆半径;如果<=,说明碰撞成功
int minDisX = 0;
if(arcOy >= rectY && arcOy <= rectY + rectH){
if(arcOx < rectX)
minDisX = rectX - arcOx;
else if(arcOx > rectX + rectW)
minDisX = arcOx - rectX - rectW;
else
return true;
if(minDisX <= arcR)
return true;
}//判断当圆心的Y坐标进入矩形内时X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)这个范围内,则碰撞成功
int minDisY = 0;
if(arcOx >= rectX && arcOx <= rectX + rectW){
if(arcOy < rectY)
minDisY = rectY - arcOy;
else if(arcOy > rectY + rectH)
minDisY = arcOy - rectY - rectH;
else
return true;
if(minDisY <= arcR)
return true;
}//判断当圆心的X坐标进入矩形内时Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)这个范围内,则碰撞成功
return false;
}
/*判断圆与长方形的关系,一共四种关系:圆与长方形不包含也不相交,返回1;相交返回2 ; 圆在长方形内部返回3;长方形在圆内部返回4*/
//假定矩形由d1,d2,d3,d4顶点按顺时针方向组成,ywz为圆心位置,yzj为圆直径。
int Y_ZFX_WZ(D3DXVECTOR2 &ywz,float &yzj,D3DXVECTOR2 &d1,D3DXVECTOR2 &d2,D3DXVECTOR2 &d3,D3DXVECTOR2 &d4)
{
/*1、根据圆的方程和长方形的边直线方程,计算交点,如果存在一交点,且在长方形边的线段上,则返回相交2*/
float k,k1,k2;
k=4*pow((d2.x-d1.x)*(d2.x-ywz.x)+(d2.y-d1.y)*(d2.y-ywz.y),2)-4*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2))*(pow(d1.x-ywz.x,2)+pow(d1.y-ywz.y,2)-pow(yzj,2));
//如果有在d2-d1确定的直线上有交点
if (k>=0)
{
k1=(-2*(d2.x-d1.x)*(d2.x-ywz.x)-2*(d2.y-d1.y)*(d2.y-ywz.y)+sqrt(k))/(2*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2)));
k2=(-2*(d2.x-d1.x)*(d2.x-ywz.x)-2*(d2.y-d1.y)*(d2.y-ywz.y)-sqrt(k))/(2*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2)));
/*如果在d2-d1线段上有交点,返回2*/
if ((k1>0)&&(k1<1)) return 2;
if ((k2>0)&&(k2<1)) return 2;
}
k=4*pow((d3.x-d2.x)*(d3.x-ywz.x)+(d3.y-d2.y)*(d3.y-ywz.y),2)-4*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2))*(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)-pow(yzj,2));
//如果有在d3-d2确定的直线上有交点
if (k>=0)
{
k1=(-2*(d3.x-d2.x)*(d3.x-ywz.x)-2*(d3.y-d2.y)*(d3.y-ywz.y)+sqrt(k))/(2*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2)));
k2=(-2*(d3.x-d2.x)*(d3.x-ywz.x)-2*(d3.y-d2.y)*(d3.y-ywz.y)-sqrt(k))/(2*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2)));
/*如果在d3-d2线段上有交点,返回2*/
if ((k1>0)&&(k1<1)) return 2;
if ((k2>0)&&(k2<1)) return 2;
}
k=4*pow((d4.x-d3.x)*(d4.x-ywz.x)+(d4.y-d3.y)*(d4.y-ywz.y),2)-4*(pow(d4.x-d3.x,2)+pow(d4.y-d3.y,2))*(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)-pow(yzj,2));
//如果有在d4-d3确定的直线上有交点
if (k>=0)
{
k1=(-2*(d4.x-d3.x)*(d4.x-ywz.x)-2*(d4.y-d3.y)*(d4.y-ywz.y)+sqrt(k))/(2*(pow(d4.x-d3.x,2)+pow(d4.y-d3.y,2)));
k2=(-2*(d4.x-d3.x)*(d4.x-ywz.x)-2*(d4.y-d3.y)*(d4.y-ywz.y)-sqrt(k))/(2*(pow(d4.x-d3.x,2)+pow(d3.y-d3.y,2)));
/*如果在d4-d3线段上有交点,返回2*/
if ((k1>0)&&(k1<1)) return 2;
if ((k2>0)&&(k2<1)) return 2;
}
k=4*pow((d1.x-d4.x)*(d1.x-ywz.x)+(d1.y-d4.y)*(d1.y-ywz.y),2)-4*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2))*(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)-pow(yzj,2));
//如果有在d1-d4确定的直线上有交点
if (k>=0)
{
k1=(-2*(d1.x-d4.x)*(d1.x-ywz.x)-2*(d1.y-d4.y)*(d1.y-ywz.y)+sqrt(k))/(2*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2)));
k2=(-2*(d1.x-d4.x)*(d1.x-ywz.x)-2*(d1.y-d4.y)*(d1.y-ywz.y)-sqrt(k))/(2*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2)));
/*如果在d1-d4线段上有交点,返回2*/
if ((k1>0)&&(k1<1)) return 2;
if ((k2>0)&&(k2<1)) return 2;
}
/* 2、计算圆心点与四边线段的距离,根据正负距离判断*/
D3DXVECTOR2 ls;
float z,l1,l2,l3,l4;//l1,l2,l3,l4为记录圆心点与四边的距离,在边法向量正侧为正,反之为负
ls=d2-d1;
z=ls.x;ls.x=ls.y;ls.y=-z;
D3DXVec2Normalize(&ls,&ls);//第一个边的法向量
l1= ls.x*(ywz.x-d1.x)+ls.y*(ywz.y-d1.y); //圆心与d2-d1边的距离
l2= ls.y*(ywz.x-d2.x)-ls.x*(ywz.y-d2.y); //圆心与d3-d2边的距离
l3= -ls.x*(ywz.x-d3.x)-ls.y*(ywz.y-d3.y); // 圆心与d4-d3边的距离
l4= -ls.y*(ywz.x-d4.x)+ls.x*(ywz.y-d4.y); //圆心与d1-d4边的距离
if ((l1>=yzj)&&(l2>=yzj)&&(l3>=yzj)&&(l4>=yzj))
return 3; //圆在长方形内部,也就是长方形包含圆
//3、如果矩形四个顶点都在圆内,则返回4
if ((pow(d1.x-ywz.x,2)+pow(d1.y-ywz.y,2)<=yzj*yzj)&&(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)<=yzj*yzj)&&(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)<=yzj*yzj)&&(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)<=yzj*yzj))
return 4;
//4、必定剩余第一种情况,圆与正方形不相交,也不包含
return 1;
}
分享到:
相关推荐
本程序演示了矩形和圆的碰撞检测,用鼠标可以控制圆与矩形碰撞,如果发生碰撞,矩形和圆都显示为红色,否则为白色。 具体的算法介绍和讨论在这个帖子里 ...
对于矩形和圆这种基本形状,我们可以利用简单的几何算法来实现。 1. **矩形碰撞检测**:在Android中,我们可以使用`Rect`类来表示矩形。判断两个`Rect`对象`rect1`和`rect2`是否相交,可以使用`Rect.intersects...
总结一下,"碰撞_vceasyx_物理碰撞"项目将教会我们如何利用Vc++和Easy X库实现一个简单的物理碰撞系统。这涉及到了Easy X的图形渲染,以及2D物理碰撞检测的基本原理和算法。通过实践,开发者不仅可以提升C++编程技巧...
在计算机图形学和游戏开发领域,圆形与矩形的碰撞检测是一个常见的问题。这个压缩包文件"圆形与矩形碰撞.rar"很可能包含了使用易语言编写的源代码,用于实现这种碰撞检测算法。易语言是一种简单易学的编程语言,特别...
本主题聚焦于“绘制旋转矩形以及旋转矩形的碰撞检测”,这通常用于游戏开发、用户界面设计或者可视化应用中。我们将深入探讨以下几个方面: 1. **绘制旋转矩形**:在BCGCBPro(可能指的是Borland C++ Builder或类似...
总之,Box2D_02_碰撞主题涵盖了Box2D在2D碰撞检测和响应的核心技术,以及在Android平台上使用C++实现这些功能的方法。通过熟练掌握这些知识,开发者能够构建出具有真实感的物理效果的游戏或应用。
判断点或圆是否在矩形或圆内的方法,用与游戏开发中判断人物或技能的碰撞。
1. **圆形与矩形碰撞检测**:对于一个圆形和一个矩形的碰撞检测,我们首先需要知道圆心的坐标 `(x_c, y_c)` 和半径 `r`,以及矩形的左下角坐标 `(x_l, y_l)`、右上角坐标 `(x_r, y_r)` 和宽高 `w` 和 `h`。...
总结来说,"易语言源码圆形与矩形碰撞"的实现不仅提供了基本的几何碰撞检测方法,还展示了易语言的编程实践,包括数据结构定义、函数设计和异常处理等。通过学习和理解这份源码,开发者可以进一步提升在易语言环境下...
4. **点圆碰撞**: - 这是检查一个点是否在圆内的过程。通过计算点与圆心的距离平方,与圆半径的平方进行比较,如果距离小于等于半径平方,则点在圆内。 5. **点与圆环的碰撞**: - 圆环碰撞检测不仅包括点在内部...
- 对于圆形和矩形的碰撞检测,我们可以计算圆形中心到矩形各边的距离,如果这个距离小于等于圆形的半径,那么就发生了碰撞。 易语言源码中可能包含了这些算法的实现,通过阅读和分析源码,你可以了解到如何在...
圆形碰撞检测基于几何学原理,即两个圆发生碰撞的条件是它们的圆心之间的距离小于两圆半径之和。这个检测方法适用于圆形或近似圆形的游戏对象。在实际应用中,可以通过计算两个圆心点之间的欧几里得距离并与半径之...
通过这个向导,我们可以快速地为每个图形类型生成一个类,定义其属性和方法。例如,对于点类,我们可能需要定义坐标(x, y),以及获取和设置坐标的函数;对于直线类,我们需要起点和终点坐标,以及计算长度和绘制的...
它可能包含了定义矩形区域、生成随机圆心、计算半径、碰撞检测和调整等步骤的代码。 7. **可视化**:生成的圆多孔介质模型通常需要可视化展示,MATLAB提供了`plot`或`scatter`函数来绘制点和圆,`fill`或`patch`...
这可能包括重写`boundingRect()`, `shape()`, `advance()`等方法,以确保图形的碰撞检测和渲染效率。 9. **性能优化** 高效的图形操作需要考虑性能优化,例如,避免不必要的重绘,使用`cacheMode()`来启用缓存,...
圆形碰撞相对简单,只需计算两个圆心之间的距离与两圆半径之和即可判断是否相撞。 "4-14-5(Region碰撞检测)"可能涉及更复杂的区域碰撞检测,比如多边形或者其他形状的碰撞。这种技术可以用于更复杂的地形或障碍物的...
总结来说,"VC画线、矩形、圆,并对他们进行一般编辑"涉及的是使用Visual C++和GDI进行图形编程的基本概念和技巧,包括绘图函数的使用、图形属性的修改、图形的移动以及用户交互。这些技能对于开发任何涉及图形界面...
碰撞检测的不同方式:像素级、矩形、圆形等.docx Phaser引擎开发:生存游戏碰撞检测与物理系统_(12).碰撞检测的优化与性能提升.docx Phaser引擎开发:生存游戏碰撞检测与物理系统_(13).使用Phaser物理引擎创建...
总之,Android范围碰撞检测是Android开发中的关键技能,涉及矩形和圆形的检测方法。通过对这些概念的深入理解,开发者能够有效地实现游戏逻辑、用户交互等功能,提升应用的用户体验。同时,掌握性能优化技巧也至关...