圆形和矩形的碰撞检测

首先来说明一下核心思想

无非是三种状态:

1、圆心在矩形中

2、圆心在矩形外,但在其某一边的侧面

3、圆心在矩形外、不再某一边的侧面

圆心在矩形中的情况十分好处理,这里就不说了。

下面来说一下2、3情况的核心应对思路:

首先,拿到矩形的四个顶点。

算出圆心到四个顶点分别的距离。

给距离从小到大排一下序。

取其中两个最小距离的点,求出圆心到这两点之间直线(或延长线)上最短距离的那个点。

重点来了:

这时候要看这个点是在两点之间,还是在这条直线的延长线上。如果是之间,就是情况2。再延长线上就是3。

分别做处理,如果是情况2就算出两点距离,看看跟半径的关系判断是否碰撞。

如果是3就算出圆心到距离圆心最近的顶点的距离,看看它和半径的关系。

Lua代码如下:

(注:这个是本人洗澡的时候灵感突现想出的Idea,半夜写的算法。没有单独摘出来方法,将会在以后改进。请关注本人博客或Github: https://github.com/Schrodinger123)

--圆心,半径
	local circle = {
		x = 0,
		y = 0,
		r = 5
	}

	-- 矩形位置,宽高
	local box = {
		x = 5,
		y = 5,
		w = 3,
		h = 3
	}

	-- 矩形四个点
	box.ld = {
		x = box.x-box.w/2,
		y = box.y-box.h/2
	}

	box.rd = {
		x = box.x+box.w/2,
		y = box.y-box.h/2
	}

	box.lu = {
		x = box.x-box.w/2,
		y = box.y+box.h/2
	}

	box.ru = {
		x = box.x+box.w/2,
		y = box.y+box.h/2
	}

	-- 求两点间距离方法
	function p2pDis(p1,p2)
		return math.abs(math.sqrt(math.pow(p1.x-p2.x,2)+math.pow(p1.y-p2.y,2)))
	end

	-- 算出每个点距离圆心距离
	local line = {
		[1] = {dis = p2pDis(circle,box.ld),point = "ld"},
		[2] = {dis = p2pDis(circle,box.rd),point = "rd"},
		[3] = {dis = p2pDis(circle,box.lu),point = "lu"},
		[4] = {dis = p2pDis(circle,box.ru),point = "ru"},
	}

	-- 从小到大排序
	function ts(v1,v2)
		return v1.dis < v2.dis
	end
	table.sort(line,ts)

	-- 算出圆心在距离它最近的边(或边延长线)上的最近的点坐标
	local pointInLine = {}
	local status = 0 --0为竖着 1为横着
	if box[line[1].point].y == box[line[2].point].y then
		status = 1
	end

	pointInLine.x = status == 0 and box[line[1].point].x or circle.x
	pointInLine.y = status == 0 and circle.y or box[line[1].point].y

	-- 算距离
	if (status == 1 and (pointInLine.x < box.ld.x or pointInLine.x > box.rd.x)) or (status == 0 and (pointInLine.y < box.ld.y or pointInLine.y > box.lu.y)) then
		--完全在外边
		local p2nDis = p2pDis(circle,box[line[1].point])
		print("外距离"..p2nDis)
		print(p2nDis > circle.r and "不碰撞" or "碰撞")
	else
		--圆心在附近
		local p2lDis = p2pDis(circle,pointInLine)
		print("距离"..p2lDis)
		print(p2lDis > circle.r and "不碰撞" or "碰撞")
	end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 07:32:55

圆形和矩形的碰撞检测的相关文章

圆形与矩形的碰撞检测--Mr.Ember

圆形与矩形的碰撞检测--Mr.Ember 已知:圆形半径和坐标* 矩形四个点坐标* 判断是否相交 先去找出矩形上离圆心最近的点,判断该点的距离是否小于圆半径,若小于半径,则为碰撞. let closestPoint = {x:0, y:0}; 约定圆形和矩形的类: //圆形 function Circle(x,y,r) { this.r = r; this.x = x; this.y = y; } //矩形 function Rect(ul,ur,dl,dr) { this.x = ul.x;

矩形的碰撞检测(模仿俄罗斯方块)

以前一直以为玄之又玄的碰撞检测算法,其实也不过是一些加减法.看来还是写的太少,大多时候只是停留在望而止步的层次. 矩形的碰撞检测原理就是两个矩形的x值+宽度和y值+高度的各种比较. function(c1,c2{ return !{ b1.x + b1.w < b2.x || b1.y + b1.h < b2.y || b2.x + b2.w < b1.x || b2.y + b2.h < b1.y } 意思就是矩形1的x加上矩形1的宽度是否小于矩形2的x,这样就能检测到当矩形1在

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

我们以cocos2dx lua脚本来说明,原理才是重点 检测圆和矩形碰撞,首先要找到矩形上离圆的中心点最近的点 if circle.x < box.x then cx = box.x end 如果圆在矩形的左边,离着圆中心点最近的矩形上的点在矩形的左边边界上 elseif circle.x > box.x + box.width then cx = box.x + box.width 如果圆的中心点在矩形的右边,离着圆中心点最近的矩形上的点在矩形的右边边界上 else cx = circle.

javascript中矩形的碰撞检测---- 计算碰撞部分的面积

今天在做一个拖拽改变元素排序的东西的时候,在做被拖动元素同时碰撞到两个元素时,究竟应该与哪个元素交换位置的问题上,纠结到崩溃,实在是想不到别的办法去做了,只能去想办法计算碰撞的面积. 这应该不是最合适的办法,具体怎样更合适,后续发现了再补上吧. 先说从妙味课堂里听到的九宫格判断碰撞检测的方法 如图,左侧的橙色箭头所指的线,是蓝色矩形右边和黑色矩形左边的距离,如果蓝色矩形右边的左边小于黑色矩形的左边,则两个矩形不可能发生碰撞,不可能发生碰撞的范围如图蓝色线条圈住的范围. 同样的道理,可以判断另外4

计算圆形、矩形、三角形的面积

class Progarm { static void Main(string[] argm) { Console.WriteLine("选择以下图形(输入图形序列号)"); Console.WriteLine("1.圆形,2.矩形,3.三角形); string str = Console.ReadLine(); switch(str) { case "1": Console.WriteLine("请录入圆的半径:"); int  r

Canvas---Canvas版画图、圆角矩形、圆形、矩形、图形填充、mvc模式重新整合代码版

 使用Canvas实现画图程序.(转载注明出处与作者啊) 本次主要更新了一下功能: 新添加图形:矩形,圆形,圆角矩形 实现了描边颜色与填充颜色的选择 使用类似mvc的模式重新整理了代码. M层: 特殊图形的路径规划代码组成,只包含路径规划,无样式设计. V层:设计样式,调用路径规划代码,实际绘制图案.在这里完成填充.描边. C层:判断选择框内容,调用不同的实际绘制代码 其他:事件处理与辅助计算函数等 不足:感觉代码结构还是不够好,果然是我没用面向对象么? 下面是效果图: 下面是源代码: ①本

旋转矩形碰撞检测 OBB方向包围盒算法

在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于SAT(Separating Axis Theorem)分离轴定律的. 分离轴定律:两个凸多边形物体,如果我们能找到一个轴,使得两个在物体在该轴上的投影互不重叠,则这两个物体之间没有碰撞发生,该轴为Separating Axis.也就是说两个多边形在所有轴上的投影都发生重叠,则判定为碰撞:否则,没有

圆与矩形碰撞检测

圆与矩形的碰撞检测,假设矩形中心点v0, 上边中心点v1, 右边中心点v2, 圆心v, 圆半径r, 矩形半宽w1, 矩形半高h1,.v0为矩形的坐标系原点,(v0,v2)为矩形坐标系x轴,(v0,v1)为矩形坐标系y轴,圆心到矩形y轴距离为w2, 圆心到矩形x轴距离为h2,如图所示: 根据图示可以很容易的写出圆与矩形的碰撞检测算法: 圆与矩形碰撞检测

[转]html5 Canvas画图教程(9)—canvas中画出矩形和圆形

本文讲一下在canvas中画出矩形和圆形的办法,他们属于基础图形.当然,基础图形本来不止他们,但在canvas中,只有画矩形与圆形不需要用其他方法模拟. canvas画矩形 1,fillRect与strokeRect fillRect可以直接填充出一个矩形,填充样式是你当前设置的样式:同理strokeRect就是直接描边一个矩形 他们的参数是一致的,依次是(起点x坐标,起点y,矩形的宽,矩形的高).这里的起点,注意,是指矩形的左上角那个点. 我们通常用他们来做简单的事,他们也只能做简单的事.为什