碰撞检测 (矩形、圆形、点、旋转、矩形框、像素)

一、矩形碰撞

1. 使用rectangle的intersects判断碰撞

		let rectA:egret.Rectangle = this.red.getBounds();
		let rectB:egret.Rectangle = this.blue.getBounds();

		//获得的rect不包含x,y位置
		console.log(rectA);  //x=0,y=0,width=200,height=200
		console.log(rectB);  //x=0,y=0,width=200,height=200

		//必须加上方块所在的x,y
		rectA.x += this.red.x;
		rectA.y += this.red.y;
		rectB.x += this.blue.x;
		rectB.y += this.blue.y;

		let startTime = egret.getTimer();
		for(let i=0;i<1000;i++){
			if(rectA.intersects(rectB)){
				console.log("hit");
			}else{
				console.log("no hit");
			}
		}
		console.log(egret.getTimer() - startTime);  //检测1000次,耗时215ms

下图:no hit

下图:hit

矩形旋转后,还能正确判断碰撞吗?

下图:no hit

下图:no hit

下图:hit

矩形旋转后,并不能正确的判断碰撞了。查看源代码,可知并没有计算rotation这样的算法。

        /**
         * 确定在 toIntersect 参数中指定的对象是否与此 Rectangle 对象相交。此方法检查指定的 Rectangle
         * 对象的 x、y、width 和 height 属性,以查看它是否与此 Rectangle 对象相交。
         * @param toIntersect 要与此 Rectangle 对象比较的 Rectangle 对象。
         * @returns 如果两个矩形相交,返回true,否则返回false
         * @version Egret 2.4
         * @platform Web,Native
         * @language zh_CN
         */
        public intersects(toIntersect:Rectangle):boolean {
            return Math.max(this.x, toIntersect.x) <= Math.min(this.right, toIntersect.right)
                && Math.max(this.y, toIntersect.y) <= Math.min(this.bottom, toIntersect.bottom);
        }

所以intersects的碰撞检测适用:

1. 用于矩形(未旋转)

2. eui对象(才有right、bottom属性)

3. 修改了锚点也能正常检测

2. 自定义的矩形碰撞检测

	protected childrenCreated(){

		let startTime = egret.getTimer();
		for(let i=0;i<1000;i++){
			if(this.checkRect(this.red, this.blue)){
				console.log("hit");
			}else{
				console.log("no hit");
			}
		}
		console.log(egret.getTimer() - startTime);  //220ms

	}

    /**
     * 检测碰撞矩形
     * @objA 对象A
     * @objB 对象B          */
    public checkRect(objA: egret.DisplayObject,objB: egret.DisplayObject) {
        var x1 = objA.x - objA.anchorOffsetX;
        var y1 = objA.y - objA.anchorOffsetY;
        var x2 = objB.x - objB.anchorOffsetX;
        var y2 = objB.y - objB.anchorOffsetY;

        if(y1 > (y2 - objA.height) && y1 < (y2 + objB.height)) {
            if(x1 > (x2 - objA.width) && x1 < (x2 + objB.width)) {
                return true;
            }
        }
        return false;
    }

适用范围:

1. 只要是矩形显示对象就可以,对比intersects不要求必须是eui对象

2. 对于旋转对象,同样没法碰撞检测

3. 对象修改了锚点也能正确检测

二、圆形碰撞

原文地址:https://www.cnblogs.com/gamedaybyday/p/9414260.html

时间: 2024-10-10 09:35:42

碰撞检测 (矩形、圆形、点、旋转、矩形框、像素)的相关文章

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

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

【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.

html --- VML --- javascript --- 旋转矩形

矢量标记语言 --- Vector Markup Language 运行它的代码需要打开IE的兼容性视图 如有疑问请参考:http://msdn.microsoft.com/en-us/library/bb264280(VS.85).aspx 代码如下: <html xmlns:v="urn:schemas-microsoft-com:vml"> <head> <!-- VML requires VML namespace and behavior. --

在图片上画矩形并高亮显示矩形区域、统计矩形区域中像素情况并绘制直方图

<学习OpenCV>中文版第4章第3题 提纲 题目要求 程序代码 结果图片 题目要求: ①允许用户在图片上选择一个矩形区域,当鼠标放开,高亮显示矩形区域 ②在另一个独立窗口中,使用绘图函数绘制一个图表,分别用蓝.绿和红色表示选中区域中各种颜色的像素在指定数值范围内的数量. 程序代码: 1 #include "stdafx.h" 2 #include <cv.h> 3 #include <highgui.h> 4 using namespace std

RoundedImageView,实现圆形、圆角矩形的注意事项

RoundedImageView是gitHub上面的一个开源组件(https://github.com/vinc3m1/RoundedImageView),实现一些圆形或者圆角矩形是很方便的, 1 <com.makeramen.roundedimageview.RoundedImageView 2 android:id="@+id/iv_hint" 3 android:layout_width="@dimen/x36" 4 android:layout_hei

关于图像旋转以及旋转后对应像素的位置

参考链接:http://www.echojb.com/image/2016/11/14/258268.html 一.首先来说一下关于像素旋转一定角度后的对应位置: (1)旋转中心为左上角原点: 旋转有一个绕什么转的问题.我们先来看最简单的,绕第一个像素转,则旋转的情况会像这样: 令旋转前有 旋转a角度后有 以矩阵形式表示为 (2)旋转中心为图像中心: 当图片较大时,计算会很慢.主要是判断和计算太多了这里只讨论图像处理,程序的优化暂时放一边运行结果如下: 我们能看到,旋转后的图像有很多“蜂窝煤”.

矩形碰撞检测和圆形碰撞检测。

矩形碰撞检测: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style type="text/css">body { margin: 0;}#wrap { margin: 50px auto; position: relative; borde

Android ImageCropper 矩形 圆形 裁剪框

支持圆形裁剪框,裁剪后生成圆形图案. 代码基于开源项目修改,github上项目链接:https://github.com/shengge/android-crop 还是贴下效果图:    说一下圆形裁剪实现部分: 1.UI方面,自定义CircleHighlightView继承至HighlightView(原有的矩形裁剪框实现),直接看draw方法实现 @Override protected void draw(Canvas canvas) { canvas.save(); Path path =

碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞

一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检测碰撞就只有两种情况了. 情况一,矩形全部都在一个象限内,如图: 当然,图中只是举个例子,不一定是只在第二象限,任何一个象限都行,只要是矩形全在该象限. 这种情况比较好解决,首先,我们计算出矩形每个角的坐标,然后用勾股定律依次算出这个角到圆心的距离是否小于或者等于半径.设这个角与圆心横坐标之差为d1

RotateRect(旋转矩形)的倾斜旋转变换矫正

在Opencv中的图像处理中,经常要用到minAreaRect()函数求最小外接矩形,该函数的返回值就是一个RotatedRect类对象. RotatedRect类定义如下: class CV_EXPORTS RotatedRect { public: //! various constructors RotatedRect(); RotatedRect(const Point2f& center, const Size2f& size, float angle); RotatedRect