最近在試著把12個按鈕排成圓弧狀
下面是我找的一些有關於三角函數的資料
http://edscb.blogspot.com/2008/03/blog-post.html
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=53846
在as裡使用sin和cos函數都是輸入弧度
因此要先將角度用角度與弧度的轉換:
radians = degrees * Math.PI / 180
degrees = radians *180 / Math.PI
去轉換後再傳進去,才可獲得正確的值
以下類別是我寫的排列函數
傳進的參數為
範例:
1 2 |
ArrangeTool.getInstance().drawArc(100,500,100,400,canvasContent); //弧形開端、弧形結束端、水平y座標、半徑、存放要排列的物件的陣列 |
類別內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package com.demo { import flash.geom.Point; public final class ArrangeTool { private static var instance:ArrangeTool; public static function getInstance():ArrangeTool{ if (instance == null){ instance = new ArrangeTool(); } return instance; } /** * 將物件排成弧型 */ public function drawArc(startX:int,endX:int,Y:int,radius:int,items:Array):void{ //先算出圓心座標 var center:Point = new Point((startX+endX)/2,Y+Math.sqrt(radius*radius-Math.pow(startX-endX,2)/4)); //將該區域的圓切成相同大小等份,先算整個弧線的角度,以角度切 var totalAngel:int = Math.asin((endX - center.x)/radius)*360/Math.PI; var onePiece:int = totalAngel/(items.length-1); //要取出該弧形的點的座標及角度 var angle:int; for(var i:int=0;i< span=""> angle = 90-(totalAngel/2)+onePiece*i; var tmp:Point = getPoint(radius,angle); items[i].x = center.x-tmp.x-(items[i].width/2); items[i].y = center.y-tmp.y-(items[i].height/2); //以程式改變註冊點 var A:Point=items[i].localToGlobal(new Point(items[i].width/2,items[i].height/2)); items[i].rotation = (angle-90); var B:Point=items[i].localToGlobal(new Point(items[i].width/2,items[i].height/2)); items[i].x-=B.x-A.x; items[i].y-=B.y-A.y; } } private function getPoint(radius:int,angel:int):Point{ var y:int = Math.sin(angel*Math.PI/180)*radius; var x:int = Math.cos(angel*Math.PI/180)*radius; return new Point(x,y); } } } |