圆形与矩形的碰撞检测--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;
    this.y = ul.y;
    this.w = Math.abs(ul.x - ur.x);
    this.h = Math.abs(ul.y - dl.y);
 }

判断圆的x坐标是在矩形的位置

如果圆心在矩形的左侧  circle.x < rect.x   即closestPoint.x = rect.x;

如果圆心在矩形的左侧  circle.x > rect.x + rect.w; 即closestPoint.x = rect.x + rect.w;

否则,圆心就在矩形的正上正下方,即closestPoint.x = circle.x;

同理,y轴类似

    if(circle.y < rect.y) {
        closestPoint.y = rect.y;
    } else if(circle.y > rect.y + rect.h) {
        closestPoint.y = rect.y + rect.h;
    } else {
        closestPoint.y = circle.y;
    }

然后判断是否相交

   let closestPoint = handleClosestPoint(circle, rect);
    let distance = Math.sqrt(Math.pow(closestPoint.x - circle.x, 2) + Math.pow(closestPoint.y - circle.y, 2))
        console.log(‘distance‘,distance)
    if(distance < circle.r) return true // 发生碰撞
    else return false // 未发生碰撞

这种方法只是判断了矩形不旋转和不包含情况。

判断矩形旋转还需特殊处理

原文地址:https://www.cnblogs.com/teteWang-Ember/p/11399220.html

时间: 2024-11-08 20:54:01

圆形与矩形的碰撞检测--Mr.Ember的相关文章

圆形和矩形的碰撞检测

首先来说明一下核心思想 无非是三种状态: 1.圆心在矩形中 2.圆心在矩形外,但在其某一边的侧面 3.圆心在矩形外.不再某一边的侧面 圆心在矩形中的情况十分好处理,这里就不说了. 下面来说一下2.3情况的核心应对思路: 首先,拿到矩形的四个顶点. 算出圆心到四个顶点分别的距离. 给距离从小到大排一下序. 取其中两个最小距离的点,求出圆心到这两点之间直线(或延长线)上最短距离的那个点. 重点来了: 这时候要看这个点是在两点之间,还是在这条直线的延长线上.如果是之间,就是情况2.再延长线上就是3.

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

以前一直以为玄之又玄的碰撞检测算法,其实也不过是一些加减法.看来还是写的太少,大多时候只是停留在望而止步的层次. 矩形的碰撞检测原理就是两个矩形的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,矩形的宽,矩形的高).这里的起点,注意,是指矩形的左上角那个点. 我们通常用他们来做简单的事,他们也只能做简单的事.为什