TheBest

블로그 이미지
단군의 후예이길 거부하는자 .. 꺼져주시길
by InsertCoin

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

[ 문제 : 반지름이 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;
}

/**************************************************************/

AND

ARTICLE CATEGORY

분류 전체보기 (131)
공지사항 (2)
JAVA (1)
ORACLE (12)
기타 (15)
JSP (1)
flash (7)
자존심의이유 (36)
secret (0)
좋은글 모음 (34)
UNIX (2)
민가 (21)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/04   »
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

ARCHIVE

LINK