C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47822] Re:Re:Re:RoundRect기본 원리를 알고싶습니다.[추가질문이요]
[] 1093 읽음    2007-01-19 18:02
착한아들 님이 쓰신 글 :
: 우선 답변에 감사드립니다...('')(..)('') 꾸벅
: 제가 궁극적을 알고 싶은것을 말씀드리겠습니다..
:
: RounRect나 Ellipse 명령어로 원을 그릴때 각 좌표를 얻어내야하는데
: 좌표를 얻는방법을 몰라...차라리 삼각함수를 이용해서 그림을 그릴려구했습니다.
: 그런데 삼각함수로 그림 원과 Ellipse로 그린 원들을 비교해보면 정확히 1:1 매치가 안되더군요.
:
: 혹시 각 좌표를 얻을수 있는 방법을 있을까요??
: 그럼 여러 고수님들의 조언을 듣겠습니다.
: 추운 겨울 감기 조심하십시요.


이심률이 0인 타원 즉 원은 삼각함수를 사용할 수 있지만,
일반 타원의 일부를 그릴 때는 삼각함수를 사용하지 않겠지요.

타원의 방정식 표준형(중심이 원점):   (x*x)/(a*a) + (y*y)/(b*b) = 1 (a>0,b>0) 
(a: '타원의 중심'과 'x축이 타원과 만나는 점' 간의 거리로서 RoundRect 함수의 X3/2,
b: '타원의 중심'과 'y축이 타원과 만나는 점' 간의 거리로서 RoundRect 함수의 Y3/2
)

1. y = ± b/a * sqrt(a*a-x*x) ; (-a<=x<=a)
2. x = ± a/b * sqrt(b*b-y*y) ; (-b<=y<=b)

타원의 중심이 (ox,oy)이면 위 타원을 x축으로 ox, y축으로 oy만큼 이동시킨 것이므로,
점의 좌표는 (ox+x,oy+y).

모니터에서는 달리 조치를 취하지 않으면 y축이 뒤집어져서 위로갈수록 값이 작아진다는 가정하에,
a>=b 일 때는 1번 식을 사용하여 각 모서리의 곡선을 그리는데 x의 범위는 아래와 같음:
좌상 곡선: [-a,0)  (y값의 부호: 음수)
우상 곡선: (0,a]   (y값의 부호: 음수)
우하곡선:  (0,a]   (y값의 부호: 양수)
좌하곡선: [-a,0)   (y값의 부호: 양수)

a < b 일 때는 2번 식을 사용하여 각 모서리의 곡선을 그리는데 y의 범위는 아래와 같음:
좌상 곡선: [-b,0)  (x값의 부호: 음수)
우상 곡선: [-b,0)  (x값의 부호: 양수)
우하곡선:  (0,b]   (x값의 부호: 양수)
좌하곡선:  (0,b]   (x값의 부호: 음수)

위에서 구한 x와 y값은 실수지만 Canvas에 점을 찍기 위해 정수로 변환하는 과정에서 오차가 발생합니다.
정수로 변환할 때 +0.5f를 해주면 오차를 조금이라도 줄일 수 있습니다.

+ -

관련 글 리스트
47804 RoundRect기본 원리를 알고싶습니다. 착한아들 1001 2007/01/18
47807     Re:RoundRect기본 원리를 알고싶습니다. 1263 2007/01/19
47812         Re:Re:RoundRect기본 원리를 알고싶습니다.[추가질문이요] 착한아들 895 2007/01/19
47822             Re:Re:Re:RoundRect기본 원리를 알고싶습니다.[추가질문이요] 1093 2007/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.