[ 문제 : 반지름이 R 인 원위의 두 점 (x1, y1), (x2, y2) 의 접선이 서로 만나는 점의 위치
(x3, y3) 을 구하시오. ]
저 부분을 공식에서 이끌어내야 x3, y3 을 curveTo의 앵커포인트로 쓸수 있는것입니다.
프로그램하면서 삼각함수를 적용하는데 젤 어려운건 극좌표로 표현을 해야한다는것입니다.
제가 만든 원그래프를 그리는 drawArc 함수는 시작각과 끝각, 즉 퍼센트를 계산하여 그 퍼센트
만큼 그려주는 것입니다.
drawArc(30, 60) 하면 전체 원의 1/12 만 그려지는거겠죠.
이러면 원그래프의 확률을 나타낼수 있을것입니다.
drawArc(r1, r2) 라는 함수로 사용하는것이지요
기억해두시기 바랍니다. 입력된 두 각 r1, r2 를 통해서 호를 그리게 됩니다
하튼 이놈의 좌표를 구하는 원리는 아래 보이는 삼각형에서 x3,y3의 값을 theta 값을 통해서
구하는게 되겠습니다.
여기에는 삼각함수가 적용되서 빗변의 끝점 x3, y3 을 구하기 위해서 알아야 할것은
삼각함수를 적용하기 위해서는 세가지조건중에 하나가 필요합니다.
- 두점의 좌표와 하나의 각을 알거나
- 한점의 좌료를 알고 두개의 각을 알거나
- 세점의 좌표를 모두 알거나
지금 우리의 해당사항은 두점의 좌표를 알고(중심점은 주어지고 시작위치는 입력된 r1의 각도
로 구해낼수 잇습니다.)
var x3:Number = 중심X + 반지름*Math.cos( 두각사이의중간각*rad )/Math.cos( theta*rad );
var y3:Number = 중심Y + 반지름*Math.sin( 두각사이의중간각*rad )/Math.cos( theta*rad );
위 공식으로 도출됩니다.
/*************** Core Module about "Draw Arc" ***************/
/*************** parameter setting for drawArc() **************/
var rad:Number = Math.PI/180; // 라디안 상수
var radius:Number = 150; // 반지름
var obj_Angle:Object = new Object(); // 각도들을 담을 오브젝트
var sArc:Number = 0; // 맨처음 시작각은 0 을 시작으로 그립니다.
/**************************************************************/
// 테스트 : 중심이 (250, 200) 이고 반지름이 100인 원에서 30~140도 까지 호를 그려라.
var arcClip:MovieClip = drawArc(_root, 250, 200, 100, 30, 140)
/**************** Core Module about "Draw Arc" **************/
/****************** source code for drawArc() ****************/
function drawArc(mc:MovieClip, x:Number, y:Number, radius:Number, r1:Number,
r2:Number):MovieClip
{
// 45도씩 나눠서 그리게 됩니다.
var seg:Number = Math.ceil((r2-r1)/45);
// 한번씩 그려줄 각도를 정합니다.
var arc:Number = (r2-r1)/seg;
// 몇번째 그리고 있는지 기억할 변수
var i:Number = 0;
// graph 라는 무비클립으로 그리게 되고 입력받은 무비클립안에 graph 라는 무비클립
으로 존재하고
// 드로잉이 끝난후 return 됩니다.
var graph:MovieClip = mc.createEmptyMovieClip("graph", mc.getNextHighestDepth
());
// 두께 3, 옅은 회색
graph.lineStyle(3, 0xcccccc);
// 호가 시작될 포인트 지정
var sx:Number = x + radius*Math.sin(r1*rad);
var sy:Number = y - radius*Math.cos(r1*rad);
// 호가 시작될 곳으로 이동(그리기 준비 끝)
graph.moveTo(sx, sy)
// 45도씩 나눈만큼 그려줍니다.
while( i < seg )
{
// 0도를 기준으로 시작각의 절대값을 저장합니다.
var sArc:Number = r1 + arc*i;
// 0도를 기준으로 끝각의 절대값을 저장합니다.
var eArc:Number = sArc + arc;
// 두각의 중간각을 0도를 기준으로 저장합니다.
var mArc:Number = -90+sArc + arc/2;
// 호가 끝날 포인트를 지정
var ex:Number = x + radius*Math.sin(eArc*rad);
var ey:Number = y - radius*Math.cos(eArc*rad);
// 앵커포인트 계산합니다.
var ax:Number = x + radius*Math.cos( mArc*rad )/Math.cos( arc/2*rad );
var ay:Number = y + radius*Math.sin( mArc*rad )/Math.cos( arc/2*rad );
// 위에서 계산된 앵커포인트와 끝 포인트를 가지고 curveTo로 호를 그려줍니
다.
graph.curveTo(ax, ay, ex, ey);
// 갯수만큼 반복합니다.
i ++;
}
// 그려진 무비클립을 컨트롤 할 수 있도록 return 합니다.
return graph;
}
/**************************************************************/