- 음악과 나 -/『 짬 통 』

아.... 모르겠다... 닫힌영역 인식해서..

noon2dy 2006. 4. 21. 16:41

 

...

 

서로 상하좌우로 연결되어있는 블럭들을 어떻게 인식해서 없앨까...

 

..

..

 

 

음... 닫힌영역을 알아내는 알고리즘을 찾으면 되겠다.. ㅎ

 

 

궁금증이 해결이 된 질문입니다.
[질문]폐곡선안의 영역 알아내는방법...
비공개님 작성
답변수: 1  조회: 220  작성일: 00-03-02 06:02
추천5

비추천0   추천 비추천



마우스로 이미지위에서 선그리기로 원모양(임의대로 그린 폐곡선이죠)이나 기타 영역을 그려서 그영역을 복사나 이동하려고 합니다....말하자면 포토샵의 lasso기능과 같은 것이죠..
폐곡선안의 값을 알고 있어야 복사나 이동이 가능할것같은데, 마우스로 이미지를 클릭해가면서 폐곡선을 만들었을때 그안의 영역의 값을 얻어내는 루틴좀 알려주십시요...


[답변] 폐영역 안의 좌표와 색깔 알아내는 방법

데브피아님 작성 | 답변채택률: 0/0
작성일: 00-03-02 12:03

안녕하세여... 까막입니다..

제목과는 조금 다른 질문이군여... ^^
여기서 폐영역의 넓이를 알아야 할 필요는 없는거 같네여....
넓이가 필요하다면 적분을 해주면 되는거구여...(수치해석 참조)

여기서는 폐영역안의 좌표와 픽셀의 색깔값을 알면 가능한거 같은데여..
폐영역안에 어떠한 점이 존재하는지를 확인하는 방법으로 그래픽스에서
사용하는 알고리즘중에 가장 많이 쓰는 두 가지가 있습니다.

8방위 검색 방식과 주사선 스캔방식이 있습니다.
하지만 여기서는 주사선 스캔방식이 좋을거 같네여... 4방위나 8방위검색방식
한글로 쓰니까 약간 어투가 이상하게 들린다.. ^^
일단 영역안에 한점을 설정하여야 한다는 단점이 있는 반면에 빠른 속도를 자랑하죠

하지만 영역에 자동으로 점을 넣어주는 것은 상당히 힘듭니다.
눈으로 보면 쉽지만 자동(일반화)화 시킨다는 것은 다른 문제죠...

그럼 주사선 스캔 방식에 대해서 설명을 드리죠...
님께서 마우스로 어떤 폐영역을 그린다고 말씀 하셨는데.. 그때 설정하는 좌표를
먼저 배열이나 등등에 데이터로 저장하는게 처음으로 해야할 일입니다.
그 다음은 그 좌표들을(영역을 설정하는 좌표)들을 반시계 방향으로 다시 소트해야합니다. 사용자가 꼭 반시계방향으로 영역을 설정한다는 법은 없으니까여...

일반적으로 영역안에 존재하는 점들을 찾기위하여 만들어진 모든 알고리즘들이
일반화를 위하여 반시계방향의 영역에 대해서만 제대로 동작합니다.
수학적인 이야기는 빼고... --;;;

그리고, 정렬된 점을 가지고 CRgn의 폴리곤 모드로 리젼을 생성 시킵니다.
전 몇가지 문제점 때문에 개인적으로 만든적이 있는데...넘 복잡해여... --;;;

그리고, 마지막으로 해야할것이 무엇이냐면 0,0 좌표부터 1,0 2,0 3,0
처럼 좌에서 우로 하나씩 이동해가면 CRgn의 PtInRegion()함수에 대입하여
그 좌표가 영역 안에 있는지를 검사합니다.
만약 영역 안에 있는 점이라면 그 때의 좌표와 색깔을 특정하게 만든 배열이나
리스트에 저장하면 됩니다.

이처럼 TV에서 빔을 쏘는 것 처럼 좌에서 우로, 위에서 아래로 화면의 픽셀을
검사한다고 해서 주사선 검사 방식이라고도 하죠...

도움이 되셨나요? ^^

[질문 내용]***********************************************
올린이 : 김성제

마우스로 이미지위에서 원모양(임의대로 그린 폐곡선이죠)이나 기타 영역을 그려서 그영역을 복사나 이동하려고 합니다....말하자면 포토샵의 lasso기능과 같은 것이죠..
폐곡선안의 값을 알고 있어야 복사나 이동이 가능할것같은데, 마우스로 이미지를 클릭해가면서 폐곡선을 만들었을때 그안의 영역의 값을 얻어내는 방법(코드)좀 알려주십시요...
 
 
 
//////////////////////////////
 
 
2004-04-27 오후 6:47:11   /  번호: 435925  / 평점:  (-) category: VC++ 일반  /  조회: 350 
 채우기 알고리즘(Area Filling) 질문입니다. heochy / heochy  
heochy님께 메시지 보내기  heochy님을 내 주소록에 추가합니다.  heochy님의 블로그가 없습니다  

시드 포인트 사용하여 플그램을 하고 있습니다.

 

근데 작은 영역에서는 잘 되는데...굳이 조금 큰 영역에서는 계속 그냥 플그램이 죽네요..

 

환경으로 point[508][508] 영역에 모두 0값으로 채워져 있습니다.

 

그 후에 for문 이용해서 point[50][All] = 255 로 채운후...

 

flood_fill(100,100, 255); 했더니만 죽네요...ㅜㅜ

 

void flood_fill(int x, int y, unsigned char fill_color)

{

    if( x < 0 || x >m_nWidth || y < 0 || y >m_nHeight)

        return;

 

    if (m_nAllPointArray[y][x] != fill_color)

    {   

        // 경계채우기 경우 : bdColor 또는 fillColor 가 아니면

        m_nAllPointArray[y][x] = fill_color;

        flood_fill(x + 1, y, fill_color);   // 왼쪽

        flood_fill(x - 1, y, fill_color);   // 오른쪽

        flood_fill(x, y + 1, fill_color);   // 위

        flood_fill(x, y - 1, fill_color);   // 아래

    }

}

 

이유가 몰까요..??

 

답변 아시는 고수분들은 리플바랍니다..

이 글에 평점 주기:  
  2004-04-28 오전 11:03:27   /  번호: 436045  / 평점:  (-)  
 Re: 자문 자답... heochy / heochy  
heochy님께 메시지 보내기  heochy님을 내 주소록에 추가합니다.  heochy님의 블로그가 없습니다  

 재귀를 사용한 영역 채우기는 조금만 영역이 커지면 재귀 함수는 내부 스택의 오버플로를 초래해서 프로그램이 자동으로 종료됩니다.

 

따라서 조금이라도 큰 영역으로 영역 채우기를 하시고자 한다면,

 

스택을 이용한 영역 채우기를 해야합니다.

 

 

'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글

치코치코 v1  (0) 2006.04.28
전체화면 만들기.  (0) 2006.04.21
[스크랩] ♡API♡ API 전체화면 만들기  (0) 2006.04.18
음.... 이제 공부는 끝. -_-  (0) 2006.04.18
CMapEditor..  (0) 2006.04.17