Posted on

繪出圓弧

最近在試著把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
去轉換後再傳進去,才可獲得正確的值

以下類別是我寫的排列函數
傳進的參數為
範例:
ArrangeTool.getInstance().drawArc(100,500,100,400,canvasContent);
//弧形開端、弧形結束端、水平y座標、半徑、存放要排列的物件的陣列

類別內容:

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);

}
}
}