zoukankan      html  css  js  c++  java
  • Flash中使用ActionScript检测圆形和矩形是否碰撞(倾斜矩形)

    思路:

    1、首先将圆的中心点,都转换为以矩形的边为X/Y的坐标系;

    2、做AABB矩形和圆的相交检测;

    代码如下:

            /**
             * 将一个点,按照指定的坐标信息(原点,旋转),转换为另外一个点 
             * @param p 原始点
             * @param base 新的坐标原点
             * @param angle 新左边系X轴的旋转角度
             * @return 新点的数据 
             * 
             */
            public static function convertLocalPoint(p:Point, base:Point, angle:Number):Point
            {
                var matrix :Matrix = new Matrix();
                //matrix.createBox(1, 1, -angle*Math.PI/180, -base.x, -base.y);
                matrix.translate(-base.x, -base.y);
                matrix.rotate(-angle*Math.PI/180);
                var p2 :Point = matrix.transformPoint(p);
                return p2;
            }
            
            /**
             * 判定一个圆形,是否和矩形相交(矩形的边和XY坐标轴对齐) 
             * @param center
             * @param radius
             * @param min
             * @param max
             * @return 
             * 
             */
            public static function intersectCircleAABB(center:Point, radius:Number, min:Point, max:Point) : Point
            {
                var closestPoint:Point = center.clone();
                if( center.x < min.x )
                    closestPoint.x = min.x;
                else if( center.x > max.x )
                    closestPoint.x = max.x;
                if( center.y < min.y )
                    closestPoint.y = min.y;
                else if( center.y > max.y )
                    closestPoint.y = max.y;
                var diff:Point = closestPoint.subtract( center );
                if( diff.x * diff.x + diff.y * diff.y > radius * radius )
                    return null;
                return closestPoint;
            }          
            
            /**
             * 判定一个圆和一个矩形是否碰撞 
             * @param center
             * @param radius
             * @param loc
             * @param angle
             * @param width
             * @param height
             * @return true/碰撞 false/不碰撞 
             * 
             */
            public static function checkRectCircleCollide(center:Point, radius:Number, loc:Point, angle:Number, Number, height:Number):Boolean
            {
                var min        :Point = new Point(0, -height/2);
                var max        :Point = new Point(width, height/2);
                trace('center:', center, 'radius:', radius, 'loc:', loc, 'angle:', angle, '', width, 'height:', height);
                var center2    :Point    = convertLocalPoint(center, loc, angle);
                var result    :Point = intersectCircleAABB(center2, radius, min, max);
                trace('center2:', center2, 'min:', min, 'max:', max);
                return result!=null;
            }
            

    测试代码:

            [Test]
            public function testMatrix():void
            {
                var base :Point = new Point(0,0);
                var angle :Number = 7.454;
                var p    :Point = new Point(137, 14);
                var p1  :Point = Vector2Extension.convertLocalPoint(p, base, angle);
                trace("p", p, "p1", p1);
    
                base = new Point(2266,2049);
                angle = 7.454;
                p    = new Point(2403, 2063);
                p1  = Vector2Extension.convertLocalPoint(p, base, angle);
                trace("p", p, "p1", p1);
                
                var p2 :Point = Vector2Extension.intersectCircleAABB(new Point(500,500), 142, new Point(10,10), new Point(900,900));
                trace(p2);
                
                
            }
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/jdragonhu/p/3167641.html
Copyright © 2011-2022 走看看