2011년 2월 20일 일요일

백업] 네이버 24

삽질하는 플머 | 오랑캐꽃
http://blog.naver.com/oranke/40002094977
[질문]화살표 그리는 방법

일반적인 선이 아닌 화살표 그리는 방법을 아시는 분 계시면
도와주시기 바랍니다.
선그리기나 이런것 처럼 아무리 찾아봐도 함수나 컴포넌트가 없네요.
감사합니다


[답변]화살표 그리는 방법



Pt1을 시작점, Pt2를 끝점, 화살의 길이를 A, 화살의 폭을 B라고 합시다.
Pt1이 원점에 놓여있고 Pt1과 Pt2를 잇는 직선이 그리는 각도가 0도라고 할 때
화살표를 구성하는 Pt3과 Pt4의 좌표는 다음과 같습니다

Pt3 = (D-A, B/2),
Pt4 = (D-A, -B/2). (D : Pt1과 Pt2를 잇는 직선의 거리)

Pt1->Pt2를 잇는 직선의 각도 th는 ArcTan 한방으로 구할 수 있구요..

var
Pt1, Pt2 : TPoint;

...

th := ArcTan2(Pt2.y-Pt1.y, Pt2.x-Pt1.x);


두 점의 거리는 피타고라스 할배의 정리에 따라 다음과 같이 계산됩니다.

D := Sqrt(sqr(Pt2.x-Pt1.x) + sqr(Pt2.y-Pt1.y));


2차원 좌표상의 점을 주어진 각도 th만큼 회전시키는 행렬식은 다음과 같습니다.

| Nx Ny | =| X Y | * | cos(th) sin(th) |
| -sin(th) cos(th) |

위의 행렬식을 풀고 원점으로 간주했던 시작점을 실제 Pt1의 좌표만큼 옵셋시키면
Pt3과 Pt4를 Pt1을 중심으로 th만큼 회전한 새로운 Pt3과 Pt4를 계산할 수 있습죠.

Pt3 :=
Point(
Trunc((D-A) * cos(th) - (b/2) * sin(th)) + Pt1.x,
Trunc((D-A) * sin(th) + (b/2) * cos(th)) + Pt1.y
);

Pt4 :=
Point(
Trunc((D-A) * cos(th) + (b/2) * sin(th)) + Pt1.x,
Trunc((D-A) * sin(th) - (b/2) * cos(th)) + Pt1.y
);


Pt1과 Pt2가 주어졌을 때 Pt3와 Pt4를 계산하기 위한 식들을 모두 알아봤습니다.
이제 구해진 점들을 연결하기만 하면 예쁜 화살표가 그려지겠죠???

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...