前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于坐标旋转

关于坐标旋转

作者头像
meteoric
发布2018-11-16 15:30:04
8120
发布2018-11-16 15:30:04
举报
文章被收录于专栏:游戏杂谈游戏杂谈游戏杂谈

在看<Flash actionscript动画教程>(中文版)的第十章的第二节,它提到“高级坐标旋转”,书中只给出了一个基本公式:

x1 = cos(angle) * x – sin(angle) * y; y1 = cos(angle) * y + sin(angle) * x;

书上并没有写如何来分析、证明这个公式,所以就自己琢磨了一下。

有如下的所示的图,如果有一个圆,它的圆心距离以某一点为参考点(原点)不变,而绕着它旋转某一角度后,希望得到新的坐标。

==> 已经圆心距离“原点”它的坐标为(x, y),现在希望求得在它绕“原点”旋转一定角度(angle)后,新的坐标(x1, y1)

image
image

假设初始坐标(x, y)与X轴形成的一个角度为A,记圆心距离“原点”的长度为 d = Math.sqrt(x * x + y * y);

sin(A) = y / d; cos(A) = x / d;

x1 = d * cos(A + angle);

=>

x1 = d * (cos(A)*cos(angle) – sina(A)*sin(angle));

x1 = d * cos(A) * cos(angle) – d * sin(A) * sin(angle);

x1 = d * (x / d) * cos(angle) – d * (y / d) * sin(angle);

x1 = x * cos(angle) – y * sina(angle);

y1 = d * sin(A + angle);

=>

y1 = d * (sin(A)*cos(angle)  + cos(A)*sin(angle));

y1 = d * sin(A) * cos(angle) + d * cos(A) * sin(angle);

y1 = d * (y / d) * cos(angle) + d * (x / d) + sin(angle);

y1 = y * cos(angle) + x * sin(angle);

主要用到了以下两个公式:

sin(A+B) = sin(A) * cos(B) + cos(A) * sin(B);

cos(A+B) = cos(A) * cos(B) – sin(A) * sin(B);

最后用这个公式写一个简单的例子

一个Ball类,还有一个测试类。

Ball类:

package {
    import flash.display.Sprite;
    
    public class Ball extends Sprite {
        private var radius:Number;
        private var color:uint;
        
        public function Ball(radius:Number = 40, color:uint = 0xff0000){
            this.radius = radius;
            this.color = color;
            init();
        }
        
        public function init():void {
            graphics.beginFill(color);
            graphics.drawCircle(0, 0, radius);
            graphics.endFill();            
        }
        
    }
}

用于测试的类

package  
{
    import flash.display.Sprite;
    import flash.events.Event;
    
    /**
     * ...
     * @author ...
     */
    public class Rotate2 extends Sprite
    {
        
        private var ball:Ball;
        private var vr:Number = .05;
        private var cos:Number = Math.cos(vr);
        private var sin:Number = Math.sin(vr);
        
        public function Rotate2() 
        {
            init();
        }
                
        private function init():void
        {
            ball = new Ball();
            addChild(ball);
            
            ball.x = Math.random() * stage.stageWidth;
            ball.y = Math.random() * stage.stageHeight;
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(evt:Event):void
        {
            var x1:Number = ball.x - stage.stageWidth / 2;
            var y1:Number = ball.y - stage.stageHeight / 2;
            var x2:Number = cos * x1 - sin * y1;
            var y2:Number = cos * y1 + sin * x1;
            
            ball.x = stage.stageWidth / 2 + x2;
            ball.y = stage.stageHeight / 2 + y2;
        }
    }
    
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-09-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档