|
초보 님이 쓰신 글 :
: 아날라고 시계와 비슷한데요.
:
: 360도를 특정갯수로 나눈 위치의 좌표값을 알아내고 싶어요
:
: 4개로 나눈다면 12시 3시 6시 9시 위치의 좌표가 되겠네요
:
: 더 많아 질수도 있고요.
:
: 여기저기 뒤져서 아날로그 시계소스를 찾아서 해보고 있는데 이해력이 부족해서요 답변 부탁드릴께요
: procedure TfrmMain.MakeCoordData;
: var
: iCnt: Integer;
: nInterval: Integer;
: nRadius: Integer;
: cx, cy : real;
: x, y : integer;
: v: Integer;
: begin
: //전체 발신번호의 갯수를 찾는다.
: SendNumCnt := grdSend.RowCount - 1;
:
: nRadius := 300;
:
: iCnt := 0;
: nInterval := 360 div SendNumCnt;
:
: cx := frmRelation.imgBack.Width / 2;
:
: for iCnt := 0 to SendNumCnt do
: begin
:
: v := iCnt;
: x := Round(cx + cx * cos(6 * v * pi / 180));
: y := Round(cx + cx * sin(6 * v * pi / 180));
:
:
: grdSend.Cells[2, iCnt] := intTostr(x);
: grdSend.Cells[3, iCnt] := intTostr(y);
: end;
:
: end;
원은 정의에 따르면 중심으로 부터 거리가 같은 점들의 집합입니다.
원의 중심이 원점이고 Y축에 대해 시계방향으로 각이 커지는 경우,
원점을 O, 원위의 한 점을 P, P에서 Y축에 내린 수선이 Y 축과 만나는 점을 Q라고 하면 ∠OQP는 직각입니다.
따라서, ∠QOP를 Θ라고 하면 P의 좌표(x,y)는 아래와 같습니다.
x = 반지름 * sin(Θ)
y = 반지름 * cos(Θ)
원의 중심좌표가 (cx,cy)인 경우 위의 x,y를 그만큼 이동시킨 것과 같으므로 P의 좌표(x,y)는 아래와 같습니다.
x = cx + 반지름 * sin(Θ)
y = cy + 반지름 * cos(Θ)
위는 y 축의 위쪽으로 갈수록 y 값이 큰 경우입니다.
한편, 윈도우 표면 등에 그림을 그릴 때 달리 조치를 취하지 않으면 y축의 위쪽으로 갈수록 y 값이 작아집니다.
따라서, 이 경우에는 y값의 부호가 바뀌어야 하므로 아래와 같습니다.
x = cx + 반지름 * sin(Θ)
y = cy - 반지름 * cos(Θ)
한편, 원의 둘레를 N 등분하여 N개의 점을 잡는다고 하면, 각 점들은 이웃한 점과 원의 중심이 이루는 각도는 360/N입니다.
예를 들어, 원의 둘레에 12시각을 표시한다고 하면 360/12=30도입니다.
C/C++의 sin,cos 함수는 라디안 단위로 인수를 입력받습니다.
180도가 1π이므로,
라디안 = 각도*M_PI/180.0
|