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, width: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:', 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);
            
            
        }

 

转载于:https://www.cnblogs.com/jdragonhu/p/3167641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值