|
착한아들 님이 쓰신 글 :
: 안녕하세요.
: 다름이 아니라 RoundRect의 Round된 부분을
: 삼각함수를 이용해서 그릴려구 하는데
: Round가 매치가 안되더군요..
: 혹시 RoundRect 기본 알고리즘이라든지...소스면 더 좋구요~ *^^*;
: 추천 싸이트 부탁드립니당.
중요한 것은 모서리 네 곳에 타원으로 둥그렇게 처리하는 부분인데 RoundRect의 X3,Y3가 나타내는 것은 좌표가 아니라 각각 타원의 폭과 높이고 각 모서리에 그려야 하는 곡선은 타원의 일부인데,
왼쪽위 모서리에 그려야 하는 곡선의 타원의 중심좌표는 (X1+X3/2,Y1+Y3/2)
오른쪽위 모서리에 그려야 하는 곡선의 타원의 중심좌표는 (X2-X3/2,Y1+Y3/2)
왼쪽아래 모서리에 그려야 하는 곡선의 타원의 중심좌표는 (X1+X3/2,Y2-Y3/2)
오른쪽아래 모서리에 그려야 하는 곡선의 타원의 중심좌표는 (X2-X3/2,Y2-Y3/2)
입니다.
직사각형 안에 그릴 수 있는 가장 큰 타원을 그린다는 관점에서 생각할 때 해당하는 직사각형의 좌상과 우하 좌표:
왼쪽위 모서리 타원: (X1,Y1) , (X1+X3,Y1+Y3)
오른쪽위 모서리 타원: (X2-X3,Y1) , (X2,Y1+Y3)
왼쪽아래 모서리 타원: (X1,Y2-Y3) , (X1+X3,Y2)
오른쪽아래 모서리 타원: (X2-X3,Y2-Y3) , (X2,Y2)
아래 소스가 원리를 이해하는 데 조금이라도 도움이 되었으면 합니다.
int w=200,h=200;
int ew=w/2 ,eh=w/3;
int ox,oy,ex,ey;
int i,j;
for(i=0 ;i<2 ;i++){
oy = i*(h+20)+10;
for(j=0 ;j<2 ;j++){
ox = j*(w+20)+10;
Canvas->Pen->Color = clBlack;
Canvas->RoundRect(ox,oy,ox+w,oy+h,ew,eh);
ex = ox + (w-ew)*(j%2);
ey = oy + (h-eh)*(i%2);
Canvas->Pen->Color = clBlue;
Canvas->Ellipse(ex,ey,ex+ew,ey+eh);
}
}
|