AS3分析时针分针所成的角度

 

效果预览:

那天百度到一个问题,就是时钟8点30分,时针和分针所形成的锐角是多少度?了解了一些达人的分析后,主要难点是解决分针走多少时针也相应走多少!下面代码里已经有注析,时针走一圈要12小时每小时30度,每分钟走0.5度,分针就60分钟一圈每分6度。
效果演示里会出现钝角或者负数角度,你可以用360相应减得出锐角或者取反得出正数,也可以把代码再修改达到要求。(Ball.as类可以自己另写,这个简单)

Clock.as

  1. package 
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.text.TextField;
  6.     import flash.text.TextFieldType;
  7.    
  8.     public class Clock extends Sprite
  9.     {
  10.         private var posX:Number;
  11.         private var posY:Number;
  12.         private var angle:Number = 0;
  13.         //1秒弧度值0.104719755 (PI / 180)
  14.         private var speed:Number = 0.104719755;
  15.         private var txt_h:TextField;
  16.         private var txt_m:TextField;
  17.         private var txt_a:TextField;
  18.         //时分针
  19.         private var obj_h:Sprite;
  20.         private var obj_m:Sprite;
  21.        
  22.         public function Clock()
  23.         {
  24.             init();
  25.         }
  26.        
  27.         private function init():void
  28.         {
  29.             posX = stage.stageWidth / 2;
  30.             posY = stage.stageHeight / 2;
  31.             obj_h = new Sprite();
  32.             obj_m = new Sprite();
  33.             addChild(obj_h);
  34.             addChild(obj_m);
  35.            
  36.             for (var i:int = 1; i <= 60; i++ ) 
  37.             {  
  38.                 if (i % 15 == 1) //大刻度
  39.                 {  
  40.                     var ball:Ball = new Ball(4, 0x00ff00);  
  41.                 }
  42.                 else if (i % 5 == 1) //中刻度
  43.                 {  
  44.                     var ball:Ball = new Ball(3, 0x0000ff);  
  45.                 }
  46.                 else //小刻度
  47.                 {  
  48.                     var ball:Ball = new Ball(1, 0x000000);  
  49.                }  
  50.                 ball.x = posX + Math.cos(angle) * 80;   
  51.                 ball.y = posY + Math.sin(angle) * 80;   
  52.                 angle += speed;  
  53.                 addChild(ball);  
  54.             }
  55.            
  56.             graphics.lineStyle(10, 1);
  57.             //时针标签
  58.             var label_h:TextField = new TextField();
  59.             addChild(label_h);
  60.             label_h.width = 35;
  61.             label_h.height = 18;
  62.             label_h.text = "时针: ";
  63.             label_h.x = 20;
  64.             label_h.y = 10;
  65.             graphics.moveTo(55, 25);
  66.             graphics.lineTo(75, 25);
  67.             //时针输入框
  68.             txt_h = new TextField();
  69.             addChild(txt_h);
  70.             txt_h.type = TextFieldType.INPUT;
  71.             txt_h.text = "0";
  72.             txt_h.maxChars = 2;
  73.             txt_h.width = 28;
  74.             txt_h.height = 18;
  75.             txt_h.x = 55;
  76.             txt_h.y = 10;
  77.            
  78.             //分针标签
  79.             var label_m:TextField = new TextField();
  80.             addChild(label_m);
  81.             label_m.width = 35;
  82.             label_m.height = 18;
  83.             label_m.text = "分针: ";
  84.             label_m.x = 20;
  85.             label_m.y = 35;
  86.             graphics.moveTo(55, 50);
  87.             graphics.lineTo(75, 50);
  88.             //分针输入框
  89.             txt_m = new TextField();
  90.             addChild(txt_m);
  91.             txt_m.type = TextFieldType.INPUT;
  92.             txt_m.text = "0";
  93.             txt_m.maxChars = 2;
  94.             txt_m.width = 28;
  95.             txt_m.height = 18;
  96.             txt_m.x = 55;
  97.             txt_m.y = 35;
  98.            
  99.            
  100.             //形成夹角标签
  101.             var label_a:TextField = new TextField();
  102.             addChild(label_a);
  103.             label_a.width = 60;
  104.             label_a.height = 18;
  105.             label_a.text = "形成夹角: ";
  106.             label_a.x = 20;
  107.             label_a.y = 60;
  108.             graphics.moveTo(80, 75);
  109.             graphics.lineTo(120, 75);
  110.             //夹角显示框
  111.             txt_a = new TextField();
  112.             addChild(txt_a);
  113.             txt_a.text = "0";
  114.             txt_a.width = 30;
  115.             txt_a.height = 18;
  116.             txt_a.x = 85;
  117.             txt_a.y = 60;
  118.            
  119.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  120.         }
  121.        
  122.         private function onEnterFrame(event:Event):void
  123.         {
  124.             //时针走一圈要12小时每1小时即30度,每分就走0.5度,而分针走一圈要60分即每1分就是6度
  125.             var num_h:Number = Number(txt_h.text);
  126.             var num_m:Number = Number(txt_m.text);
  127.             var degrees:Number;
  128.             if (num_h >= 0 && num_h <= 12 && num_m >= 0 && num_m <=60)
  129.             {
  130.                 if (num_h == 12)
  131.                 {
  132.                     num_h = 0;
  133.                 }
  134.                 txt_a.text = String(num_h * 30 + num_m * 0.5 - num_m * 6);
  135.                 num_h = num_h * 30 + num_m * 0.5;
  136.                
  137.                 drawLine(obj_h, num_h, 1, 0x0000ff, 4, 50);
  138.                 drawLine(obj_m, num_m, 6, 0xff0000, 2, 75);
  139.             }
  140.         }
  141.        
  142.         //画针函数处理
  143.         private function drawLine(obj:Sprite, angle:Number , per:Number , color:uint = 0x000000, width:Number = 1, radius:Number = 60):void 
  144.         {
  145.             angle = angle * per - 90;
  146.             var radians:Number = angle * Math.PI / 180;
  147.             var dx:Number = posX + Math.cos(radians) * radius;
  148.             var dy:Number = posY + Math.sin(radians) * radius;
  149.             obj.graphics.clear();
  150.             obj.graphics.lineStyle(width, color, 1);
  151.             obj.graphics.moveTo(posX, posY);
  152.             obj.graphics.lineTo(dx, dy);
  153.         }
  154.     }
  155. }