2008. 10. 3. 21:11

꼭지점 좌표의 문제점①




 

 

 

  그림 1인 경우에는 시계방향으로 돌며 인식하는 패턴에 의해..

   a,b,c,d 각 좌표의 끝이 마지막 배열에 저장되므로.

   별로 문제될 것 없이 각 4꼭지점을 쉽게 찾을 수있다..

   그러나 그림2같은 경우는 각 초록색점들이 배열에 저장되므로

  위에 사진과 같이 제대로된 꼭지점을 찾지 못한다.(초록색사각형)


-> 해결방안

각 끝쪽을 찾기위해서 패턴인식하는중에 찾은 네개의 정보를 

이용하였다..

먼저 배열을 4개 선언하고..

각 패턴이동시에 동작한 if문 함수(네개의 정보를 찾기 위한 소스)

에서 모든 흔적을 배열에 각각 저장하였다.

 

    --이하 소스 참조--

// 꼭지점 찾는 소스
 if(x_move>=old_x_right){  

// 최고오른쪽의 꼭지점을 찾기위한 소스이지 위쪽 오른쪽 꼭지점을 찾는 소스가 아니다.
  old_x_right = x_move;
  old_x_right_y = y_move;
        ppt2[count_ppt2]=xy;
  count_ppt2++;
 }else if(x_move<=old_x_left){
  old_x_left = x_move;
        old_x_left_y = y_move;
  ppt4[count_ppt4]=xy;
  count_ppt4++;
 }

 if(y_move>=old_y_up){
  old_y_up = y_move;
        old_y_up_x = x_move;
  ppt1[count_ppt1]=xy;
  count_ppt1++;
 }else if(y_move<=old_y_down){
  old_y_down = y_move;
        old_y_down_x = x_move;
  ppt3[count_ppt3]=xy;
  count_ppt3++;
 }

 

위에 소스중에서 if(x_move>=old_x_right){에

 >=가 중요하다..=가 없다면 --------이 부분에서..

 나머지 값들은 무시될수 있기 때문이다.

 그럼 >만써서 처음 값만 저장하면 되지 않느냐하는

 의문도 생기지만..

 만약에 >로 쓰면 그림 1과 그림 2의 문제점이 바뀌어

 버린다..그림2는 별 탈없이 인식이 되지만..

 처음 값들만을 저장하기 때문에... 그림1과 같이 마지막

 값이 필요한 경우 마찬가지로 꼭지점찾는데 문제가 생긴다..

 결국엔 둘중 하나는 희생해야되는 것이다.. 

 

이렇게 저장한 배열에서 중앙y축을 기준으로 하여

old_y_up_x(제일 위쪽의 좌표-아직 완전한 꼭지점은 아님)

 


 

가 xx_half축보다 작으면 그림2와 같은 상황이 되고...소스가 동작하게 된다.

그리고 저장된 count_ppt1만큼 배열에 저장된 데이터로 부터 모든 y축 값을 뽑아네고.그 값이

old_y_up(제일 위쪽 y축값)이랑 같은 값만 if문에 실행되도록 하였다..

그러면 제일 위쪽의 ----------부분들만 처리할수 있게 된다..

이값들은 y축값은 다 같지만 x축값은 다 다르다..

이 x축 값 가운데 가장 작은 값을 찾으면..그 좌표가 바로 꼭지점이 된다.

나머지 3개의 꼭지점도 이런식으로 찾았다.

 

CString CColorCodeDlg::find_4points()
{
 int x_x,y_y,o=0;
  CString zzz;
      if(old_y_up_x<xx_half){
            for(o; o<=count_ppt1;o++){
   y_y=Returrnsy(ppt1[o]);            
            if(y_y==old_y_up){
    x_x=Returrns(ppt1[o]);
    if(result_up_x>x_x){
     result_up_x=x_x;
     old_y_up_x=x_x;
    }
   }
   }


   for(o; o<=count_ppt2;o++){
   x_x=Returrns(ppt2[o]);            
            if(x_x==old_x_right){
    y_y=Returrnsy(ppt2[o]);
    if(result_right_y<y_y){
     result_right_y=y_y;
     old_x_right_y=y_y;
    }
   }
   }


   for(o; o<=count_ppt3;o++){
   y_y=Returrnsy(ppt3[o]);            
            if(y_y==old_y_down){
    x_x=Returrns(ppt3[o]);
    if(result_down_x<x_x){
     result_down_x=x_x;
     old_y_down_x=x_x;
    }
   }
   }

            for(o; o<=count_ppt4;o++){
   x_x=Returrns(ppt4[o]);            
            if(x_x==old_x_left){
    y_y=Returrnsy(ppt4[o]);
    if(result_left_y>y_y){
     result_left_y=y_y;
     old_x_left_y=y_y;
    }
   }
   }

  }else if(old_y_up_x<xx_half){

  }

  // 초기화
  result_down_x=0;
  result_left_y=240;
  result_up_x=320;
  result_right_y=0;

  
 count_ppt1=0;
 count_ppt2=0;
 count_ppt3=0;
 count_ppt4=0;

 

return "";

}