• 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);
                
                
            }
  • 相关阅读:
    智能指针unique_ptr记录
    ubuntu系统火狐无法播放网页视频
    javascript中json对象json数组json字符串互转及取值
    C#压缩文件
    C#异步编程
    C# POST请求 json格式
    C# Http方式下载文件到本地类
    C#中NPOI操作excel之读取和写入excel数据
    浅析C#中抽象类和接口的区别
    C#自动实现Dll(OCX)控件注册的两种方法
  • 原文地址:https://www.cnblogs.com/jdragonhu/p/3167641.html
Copyright © 2020-2023  润新知