|
"C로 배우는 알고리즘" 1~2권인데 2권에 나오는 내용을 발췌해서 적어드릴께요
수평선을 가지고 어떤 모양이든 다른 색으로 채워주는 알고리즘 이에요.
이것보다 개선된 채우기 알고리즘도 있으니 더 궁금하시면 책을 보세요 .
y에대한 왼쪽 오른쪽(x1 x2) 값이 나오면 그것을 저장 해 두셨다가 길이를 구하세요
당연히 y에대한 증분 미분 다 가능하고 선분의 길이도 구하실수 있을꺼에요
면적 중간의 점(씨앗)을 찾습니다.
씨앗 sy sx를 가지고 아래의 함수를 실행하시면 재귀호출로 채워줍니다.(증가 감소하면서)
//sx sy 씨앗 c 칠하는 색, bc 폐곡선 색
/*수평선 왼쪽 끝 찾음
int scan_left(int x,int y, int c, intbc)
{
int v;
v = read_pixel(x,y);
while(v !=c && v!=bc && x>=0) v = read_pixel(--x,y);
x++;
return x;
}
/*수평선 오른쪽 끝 찾음
int scan_right(int x,int y, int c, intbc)
{
int v;
v = read_pixel(x,y);
while(v !=c && v!=bc && x>=0) v = read_pixel(--x,y);
x++;
return x;
}
면적구하기 는 이것을 응용하시면 될꺼에요 오른쪽 왼쪽 값이 나오면 y증분값을 폭으로 더해 가시면 되니까
line_fill(sx,sy,c,bc){
y=sy;
xleft=scan_left(sx,sy,c,bc);//왼쪽 경계
xright=scan_right(sx,sy,c,bc);//오른쪽
draw_horiz_line(xleft,xright,y,c);//수평선그림
//윗줄 그려지지 않은 점이 있는지 검사
for(x=xleft; x<=xright; x++)
{
v=read_pixel(x,y-1);//윗줄검사
if(v!=c&&v!=bc)//칠해지지 않은 점이 있으면 재귀호출
line_fill(x,y-1,c,bc);
}
//아랫줄 그려지지 않은 점이 있는지 검사
for(x=xleft; x<=xright; x++)
{
v=read_pixel(x,y+1);//아랫줄검사
if(v!=c&&v!=bc)//칠해지지 않은 점이 있으면 재귀호출
line_fill(x,y+1,c,bc);
}
}
초록생선 님이 쓰신 글 :
: 레포트는 아니구요
:
: 제가 하는 일이 벡터 그래픽쪽이라서요 ^^
:
: 흠...뾰족한 수는 없는건가요??
:
: 넓이보다는 길이쪽이 더 급한데-.-
:
: 현재 생각하고 있는거는 점찍어서 넓이 구하는거 하고 (시간은 좀 걸리지만 상관 없어서요 ^^)
:
: 라인 길이는 일정 등분 (100등분정도?) 을 해서 하나하나 더해서 구하는것을 생각하고 있는데요
:
: 이쪽 아시는분들 없으신가요? ㅠ.ㅜ
:
:
: 머리돌 님이 쓰신 글 :
: : 점을 찍는 방법은 모양에 상관없이 넓이가 구해지니 구현하는 사람의 입장에서는 괜찮은 방법이네요.
: :
: : 하지만 로드가 많이 걸리고 재현성에 문제가 있습니다. (물론 엄청난 점을 투자한타면야~)
: :
: : 점찍기 에서 내부점 하나가 나타나면
: :
: : 그점을 씨앗으로 선(수평선,수직선)채우기 알고리즘을 공부해 보시는것이 효율면에서 좋을 듯 ^^
: :
: : 혹시 레포트인가요?
: :
: : 초록생선 님이 쓰신 글 :
: : : 길이는 아직 생각을 안해봤고요
: : :
: : : 닫힌 path의 넓이 구하기는 구현을 해보았는데
: : :
: : : 확대 시킨 후 point를 찍어봐서 PointOnCurvePath라는 API로
: : :
: : : 점이 들어가 있느냐 안들어가 있느냐의 비율로
: : :
: : : 외곽 RECTAGLE과의 비율을 구해서 넓이는 구해봤는데요
: : :
: : : 이렇게 하는 것이 맞는 것인지..
: : :
: : : path의 길이와 넓이를 구하기 위한 어떠한 알고리즘이 있는지 궁금합니다.
|