본문 바로가기

프로그래밍(Programing)/엑셀매크로_vba(Excel-Macro)

도형(Shape)의 통로(Lane) 체크하기_03

 

저번 시간에서 백터로 만드는 이유를 눈으로 확인할 수 있었고, 최종 배열 모습을 보았다.

그럼 이제 VecUp, VecDown을 가지고 어떻게 최종 배열 모습으로 만드는가?

 

그림1

p1 p2는 A구역 ↑↓안에 있고, p3 p4 B구역 ↑↓안에 있고, p5 p6은  A구역 ↓ B구역 ↑사이에 있다.

핀이 일단 도형안에 있는 없는지 판별부터해야 하는 문제가 처음부터 있었다.

다행이? 점p 다각형에 내부외부 판별해주는 공식은 있다.

https://bowbowbow.tistory.com/24

 

[기하] 다각형의 내부 외부 판별

[기하]다각형의 내부 외부 판별 목차 [기하] 다각형의 내부 외부 판별 다각형의 내부 외부 판별이란? 아이디어 다각형의 내부에 위치하는 점의 특징은 뭘까? 구현 어떻게 반 직선과 다각형의 교

bowbowbow.tistory.com

하지만 저 공식만 가지고는 원하는 배열에 넣을 수가 없다.

이유는 저 공식을 사용하려면 (Pin배열을 P배열이라 부르겠다.)

P배열 하나씩 x,y를 꺼내서 VU(VecUp)배열에서 포함되는지 카운터하고

VD(VecDown)배열에서 포함되는지 카운터해 카운터합산해서 홀수면 내부, 짝수면 외부판별이 가능은 하다.

 

For k = 1 to UBound(P,2)

   Bx = P(1,k)

   By = P(2,k)

  For i2 = 1 to UBound(VU,2)

      j =  (i2+1)%UBound(VU,2)     

(방금 블로그에서 이 방식을 봄 되게 좋은방법같다. 이거 아니였음 For  i3 =2  to UBound(VU,2) 이런식으로 했을텐데)

     atX = (p[j].x- p[i].x)*(By-p[i].y)/(p[j].y-p[i].y)+p[i].x;

     해서 atX가 홀수면 카운터

  next i2

  For i3 = 1 to UBound(VD,2)

       위 함수 반복해서 홀수면 카운터

 

이렇게 해서 총 카운터 합이 홀수면 판별인데 이럴거면 Vec배열로 했다. 

내부 외부만이 아니라 ↑↓ 사이에 있는지도 알아야 한다. p2 가 A구역 ↑ 에서는 외부이고  ↓에서는 내부인데 이런 규칙으로는 나로써는 생각이 안된다.

 

그래서 하는 방법은 

For i = 1 to UBound(VU,2)

   For k = 1 to UBound(P,2)

        만약 외부면 

        최종전배열생성(5,x) =P(5,i)

        P(1,i)  = x

        P(2,i)  = y

        P(3,i)  = 0 '했냐 안했냐 판단

        'P(4,i)  = r '반지름 '여기서는 안넣음

        'P(5,i)  = 2r  '지름 이것 여기서는 안다루지만  선과 핀이 겹칠때 값이 달라지는 값을 배제하기위해 만든변수

       

   next k

   if  최종전배열이 하나라도있으면

      For k = 1 to UBound(최종전배열,2)

          For i2 = 1 to UBound(VD,2)

               if VD(4,i2) <= 최종전배열(1,k) <= VD(2,i2)

                       만약 내부면 

                          최종배열생성(15,x) 해서  (VU VD 최종전배열) 다 넣는다.

 

그림2. 최종배열 형태

                                   

쓰면서도 이해가 많이 어려울거 같다.

 

위에  과정을 이미지로만 알아보자

그림3-1. VecUp에 대한 외부 판별
그림3-2. VD 내부판별한 값을 최종배열에 넣음

 

그림3-3. 그 다음 순서 그림3-1 위에 과정 반복
그림3-4. 그림3-2 과정과 같이 최종배열에 넣음

 

프로그랭을 눈으로 보면 저런 식으로 작동한다.

 

다음에는 lane 체크를 알아보겠습니다.

감사합니다.

728x90