利用Math.cos和Math.sin计算当前角度所对应方位

 

根据Math.cos和Math.sin来实现不同的方位判断,想着借助该Demo可以做成时钟计时的小事例、类似于弹弹堂中的调整炮弹发射方向的小Demo。主要根据下面函数来计算:

var angleRadians:Number = angle * Math.PI / 180; //换算成弧度

var p:Point = new Point(Math.cos(angleRadians) * RADIUS, Math.sin(angleRadians) * RADIUS); //计算偏移量

 

AS3中的示例代码:

package mytest

{

    import flash.display.Sprite;

    import flash.geom.Point;

 

    public class MyTest  extends Sprite

    {

       private const CENTRE:Point = new Point(100, 150); //圆心

      

       private const RADIUS:Number = 100; //半径

      

       private const START_ANGLE:Number = 15; //起初角度

      

       private const Tile_TOTAL:Number = 9; //组件个数

      

       private const SINGLE_ANGLE:Number = 360 / Tile_TOTAL; //平均角度

 

      

       public function MyTest()

       {

           for(var i:uint=0; i<Tile_TOTAL; i++){

             

              var pb:Tile = new Tile(); //新建组件

             

              var angle:uint = i * SINGLE_ANGLE + START_ANGLE; //角度

             

              var p:Point = getPoint(angle);

             

              pb.x = p.x; pb.y = p.y; //移动组件

             

              pb.rotation = angle - 90; //旋转组件

             

              this.addChild(pb);//加到舞台

           }

       }

      

       private function getPoint(angle:uint):Point{

          

           var angleRadians:Number = angle * Math.PI / 180; //换算成弧度

          

           var p:Point = new Point(Math.cos(angleRadians) * RADIUS, Math.sin(angleRadians) * RADIUS); //计算偏移量

          

           p.x += CENTRE.x; //跟据圆心对偏移量进行修正

          

           p.y += CENTRE.y; //跟据圆心对偏移量进行修正

          

           return p;

          

       }

 

    }

}

 

package mytest

{

    import flash.display.Sprite;

   

    public class Tile extends Sprite

    {

       public function Tile()

       {

           super();

           graphics.lineStyle(1, 0x0000ff);

           graphics.beginFill(0xcccccc,0.5);

           graphics.endFill();

           graphics.drawRect(0, 0, 50, 20);

       }

    }

}

AS3效果图:

 

JAVA中的示例代码:

/**一个时钟Demo的雏形*/

package mychTest;

 

import java.applet.Applet;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

 

public class EclipsePaint extends Applet{

    private Graphics drawOffScreen;

    private Image offScreen;

    private int appWidth, appHeight;

   

    private Clock clock;     //钟表实体类

   

    public void init(){

       appWidth = getSize().width;

       appHeight = getSize().height;

       offScreen = createImage(appWidth, appHeight);

       drawOffScreen = offScreen.getGraphics();

      

       clock = new Clock(appWidth, appHeight);

      

       new Thread(new PaintThread()).start();

    }

   

    public void paint(Graphics g){

       clock.draw(drawOffScreen);

       g.drawImage(offScreen, 0, 0, this);

    }

   

    public void update(Graphics g){

       paint(g);

    }

   

    class PaintThread implements Runnable{

       @Override

       public void run() {

           while(true){

              try {

                  Thread.sleep(41);

              } catch (InterruptedException e) {

                  e.printStackTrace();

              }

              repaint();

           }

       }

    }

}

 

class Clock{

    private int x, y, width, height, appWidth, appHeight;          //外圆框的基本信息

    private int heartX, heartY, heartWidth, heartHeight;        //圆心坐标和宽度、高度

    private int minuteAimX, minuteAimY;                            //秒针的X,Y坐标

    private double minuteAngle;                                 //秒针的当前角度

   

    public Clock(int appWidth, int appHeight){

       this.appWidth = appWidth;

       this.appHeight = appHeight;

       width = 80;                                   //外圆直径,记住是直径

       height = 80;

       x = appWidth / 2 - width / 2;                 //绘制外圆的X坐标

       y = appHeight / 2 - height / 2;               //绘制外圆的Y坐标

      

       heartWidth = 5;                               //圆心直径

       heartHeight = 5;

       heartX = x + width / 2 - heartWidth/2;        //绘制圆心的X坐标

       heartY = y + height / 2 - heartHeight/2;      //绘制圆心的Y坐标

      

       minuteAngle = 60;                         //当前角度

    }

   

    public void draw(Graphics g){

       //绘制外圆框

       g.setColor(Color.RED);

       g.drawOval(x, y, width, height);

      

       //绘制中心点

       g.setColor(Color.BLACK);

       g.fillOval(heartX, heartY, heartWidth, heartHeight);

      

       //绘制秒线

       g.setColor(Color.BLUE);

       minuteAimX = (int)(Math.cos(minuteAngle * Math.PI / 180) * width/2) + (x + width / 2);           

       minuteAimY = (int)(Math.sin(minuteAngle * Math.PI / 180) * height/2) + (y + height / 2);

       g.drawLine((x + width / 2), (y + height / 2), minuteAimX, minuteAimY);

       //这里的(x + width / 2), (y + height / 2)相当于圆心的X坐标,Y坐标; 因为heartX, heartY减去了圆心的半径,所以只是适用于绘制的时候

    }

}

JAVA效果图:

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值