AS3分析时针分针所成的角度
AS3分析时针分针所成的角度
效果预览:
那天百度到一个问题,就是时钟8点30分,时针和分针所形成的锐角是多少度?了解了一些达人的分析后,主要难点是解决分针走多少时针也相应走多少!下面代码里已经有注析,时针走一圈要12小时每小时30度,每分钟走0.5度,分针就60分钟一圈每分6度。
效果演示里会出现钝角或者负数角度,你可以用360相应减得出锐角或者取反得出正数,也可以把代码再修改达到要求。(Ball.as类可以自己另写,这个简单)
Clock.as
- package
- {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.text.TextField;
- import flash.text.TextFieldType;
- public class Clock extends Sprite
- {
- private var posX:Number;
- private var posY:Number;
- private var angle:Number = 0;
- //1秒弧度值0.104719755 (PI / 180)
- private var speed:Number = 0.104719755;
- private var txt_h:TextField;
- private var txt_m:TextField;
- private var txt_a:TextField;
- //时分针
- private var obj_h:Sprite;
- private var obj_m:Sprite;
- public function Clock()
- {
- init();
- }
- private function init():void
- {
- posX = stage.stageWidth / 2;
- posY = stage.stageHeight / 2;
- obj_h = new Sprite();
- obj_m = new Sprite();
- addChild(obj_h);
- addChild(obj_m);
- for (var i:int = 1; i <= 60; i++ )
- {
- if (i % 15 == 1) //大刻度
- {
- var ball:Ball = new Ball(4, 0x00ff00);
- }
- else if (i % 5 == 1) //中刻度
- {
- var ball:Ball = new Ball(3, 0x0000ff);
- }
- else //小刻度
- {
- var ball:Ball = new Ball(1, 0x000000);
- }
- ball.x = posX + Math.cos(angle) * 80;
- ball.y = posY + Math.sin(angle) * 80;
- angle += speed;
- addChild(ball);
- }
- graphics.lineStyle(1, 0, 1);
- //时针标签
- var label_h:TextField = new TextField();
- addChild(label_h);
- label_h.width = 35;
- label_h.height = 18;
- label_h.text = "时针: ";
- label_h.x = 20;
- label_h.y = 10;
- graphics.moveTo(55, 25);
- graphics.lineTo(75, 25);
- //时针输入框
- txt_h = new TextField();
- addChild(txt_h);
- txt_h.type = TextFieldType.INPUT;
- txt_h.text = "0";
- txt_h.maxChars = 2;
- txt_h.width = 28;
- txt_h.height = 18;
- txt_h.x = 55;
- txt_h.y = 10;
- //分针标签
- var label_m:TextField = new TextField();
- addChild(label_m);
- label_m.width = 35;
- label_m.height = 18;
- label_m.text = "分针: ";
- label_m.x = 20;
- label_m.y = 35;
- graphics.moveTo(55, 50);
- graphics.lineTo(75, 50);
- //分针输入框
- txt_m = new TextField();
- addChild(txt_m);
- txt_m.type = TextFieldType.INPUT;
- txt_m.text = "0";
- txt_m.maxChars = 2;
- txt_m.width = 28;
- txt_m.height = 18;
- txt_m.x = 55;
- txt_m.y = 35;
- //形成夹角标签
- var label_a:TextField = new TextField();
- addChild(label_a);
- label_a.width = 60;
- label_a.height = 18;
- label_a.text = "形成夹角: ";
- label_a.x = 20;
- label_a.y = 60;
- graphics.moveTo(80, 75);
- graphics.lineTo(120, 75);
- //夹角显示框
- txt_a = new TextField();
- addChild(txt_a);
- txt_a.text = "0";
- txt_a.width = 30;
- txt_a.height = 18;
- txt_a.x = 85;
- txt_a.y = 60;
- addEventListener(Event.ENTER_FRAME, onEnterFrame);
- }
- private function onEnterFrame(event:Event):void
- {
- //时针走一圈要12小时每1小时即30度,每分就走0.5度,而分针走一圈要60分即每1分就是6度
- var num_h:Number = Number(txt_h.text);
- var num_m:Number = Number(txt_m.text);
- var degrees:Number;
- if (num_h >= 0 && num_h <= 12 && num_m >= 0 && num_m <=60)
- {
- if (num_h == 12)
- {
- num_h = 0;
- }
- txt_a.text = String(num_h * 30 + num_m * 0.5 - num_m * 6);
- num_h = num_h * 30 + num_m * 0.5;
- drawLine(obj_h, num_h, 1, 0x0000ff, 4, 50);
- drawLine(obj_m, num_m, 6, 0xff0000, 2, 75);
- }
- }
- //画针函数处理
- private function drawLine(obj:Sprite, angle:Number , per:Number , color:uint = 0x000000, width:Number = 1, radius:Number = 60):void
- {
- angle = angle * per - 90;
- var radians:Number = angle * Math.PI / 180;
- var dx:Number = posX + Math.cos(radians) * radius;
- var dy:Number = posY + Math.sin(radians) * radius;
- obj.graphics.clear();
- obj.graphics.lineStyle(width, color, 1);
- obj.graphics.moveTo(posX, posY);
- obj.graphics.lineTo(dx, dy);
- }
- }
- }
posted on 2010-11-16 11:14 jiahuafu 阅读(325) 评论(0) 编辑 收藏 举报
AS3分析时针分针所成的角度
效果预览:
那天百度到一个问题,就是时钟8点30分,时针和分针所形成的锐角是多少度?了解了一些达人的分析后,主要难点是解决分针走多少时针也相应走多少!下面代码里已经有注析,时针走一圈要12小时每小时30度,每分钟走0.5度,分针就60分钟一圈每分6度。
效果演示里会出现钝角或者负数角度,你可以用360相应减得出锐角或者取反得出正数,也可以把代码再修改达到要求。(Ball.as类可以自己另写,这个简单)
Clock.as
- package
- {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.text.TextField;
- import flash.text.TextFieldType;
- public class Clock extends Sprite
- {
- private var posX:Number;
- private var posY:Number;
- private var angle:Number = 0;
- //1秒弧度值0.104719755 (PI / 180)
- private var speed:Number = 0.104719755;
- private var txt_h:TextField;
- private var txt_m:TextField;
- private var txt_a:TextField;
- //时分针
- private var obj_h:Sprite;
- private var obj_m:Sprite;
- public function Clock()
- {
- init();
- }
- private function init():void
- {
- posX = stage.stageWidth / 2;
- posY = stage.stageHeight / 2;
- obj_h = new Sprite();
- obj_m = new Sprite();
- addChild(obj_h);
- addChild(obj_m);
- for (var i:int = 1; i <= 60; i++ )
- {
- if (i % 15 == 1) //大刻度
- {
- var ball:Ball = new Ball(4, 0x00ff00);
- }
- else if (i % 5 == 1) //中刻度
- {
- var ball:Ball = new Ball(3, 0x0000ff);
- }
- else //小刻度
- {
- var ball:Ball = new Ball(1, 0x000000);
- }
- ball.x = posX + Math.cos(angle) * 80;
- ball.y = posY + Math.sin(angle) * 80;
- angle += speed;
- addChild(ball);
- }
- graphics.lineStyle(1, 0, 1);
- //时针标签
- var label_h:TextField = new TextField();
- addChild(label_h);
- label_h.width = 35;
- label_h.height = 18;
- label_h.text = "时针: ";
- label_h.x = 20;
- label_h.y = 10;
- graphics.moveTo(55, 25);
- graphics.lineTo(75, 25);
- //时针输入框
- txt_h = new TextField();
- addChild(txt_h);
- txt_h.type = TextFieldType.INPUT;
- txt_h.text = "0";
- txt_h.maxChars = 2;
- txt_h.width = 28;
- txt_h.height = 18;
- txt_h.x = 55;
- txt_h.y = 10;
- //分针标签
- var label_m:TextField = new TextField();
- addChild(label_m);
- label_m.width = 35;
- label_m.height = 18;
- label_m.text = "分针: ";
- label_m.x = 20;
- label_m.y = 35;
- graphics.moveTo(55, 50);
- graphics.lineTo(75, 50);
- //分针输入框
- txt_m = new TextField();
- addChild(txt_m);
- txt_m.type = TextFieldType.INPUT;
- txt_m.text = "0";
- txt_m.maxChars = 2;
- txt_m.width = 28;
- txt_m.height = 18;
- txt_m.x = 55;
- txt_m.y = 35;
- //形成夹角标签
- var label_a:TextField = new TextField();
- addChild(label_a);
- label_a.width = 60;
- label_a.height = 18;
- label_a.text = "形成夹角: ";
- label_a.x = 20;
- label_a.y = 60;
- graphics.moveTo(80, 75);
- graphics.lineTo(120, 75);
- //夹角显示框
- txt_a = new TextField();
- addChild(txt_a);
- txt_a.text = "0";
- txt_a.width = 30;
- txt_a.height = 18;
- txt_a.x = 85;
- txt_a.y = 60;
- addEventListener(Event.ENTER_FRAME, onEnterFrame);
- }
- private function onEnterFrame(event:Event):void
- {
- //时针走一圈要12小时每1小时即30度,每分就走0.5度,而分针走一圈要60分即每1分就是6度
- var num_h:Number = Number(txt_h.text);
- var num_m:Number = Number(txt_m.text);
- var degrees:Number;
- if (num_h >= 0 && num_h <= 12 && num_m >= 0 && num_m <=60)
- {
- if (num_h == 12)
- {
- num_h = 0;
- }
- txt_a.text = String(num_h * 30 + num_m * 0.5 - num_m * 6);
- num_h = num_h * 30 + num_m * 0.5;
- drawLine(obj_h, num_h, 1, 0x0000ff, 4, 50);
- drawLine(obj_m, num_m, 6, 0xff0000, 2, 75);
- }
- }
- //画针函数处理
- private function drawLine(obj:Sprite, angle:Number , per:Number , color:uint = 0x000000, width:Number = 1, radius:Number = 60):void
- {
- angle = angle * per - 90;
- var radians:Number = angle * Math.PI / 180;
- var dx:Number = posX + Math.cos(radians) * radius;
- var dy:Number = posY + Math.sin(radians) * radius;
- obj.graphics.clear();
- obj.graphics.lineStyle(width, color, 1);
- obj.graphics.moveTo(posX, posY);
- obj.graphics.lineTo(dx, dy);
- }
- }
- }