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);
                
                
            }
  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/jdragonhu/p/3167641.html
Copyright © 2011-2022 走看看