저번 시간에서 백터로 만드는 이유를 눈으로 확인할 수 있었고, 최종 배열 모습을 보았다.
그럼 이제 VecUp, VecDown을 가지고 어떻게 최종 배열 모습으로 만드는가?
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 최종전배열) 다 넣는다.
쓰면서도 이해가 많이 어려울거 같다.
위에 과정을 이미지로만 알아보자
프로그랭을 눈으로 보면 저런 식으로 작동한다.
다음에는 lane 체크를 알아보겠습니다.
감사합니다.
'프로그래밍(Programing) > 엑셀매크로_vba(Excel-Macro)' 카테고리의 다른 글
도형(Shape)의 통로(Lane) 체크하기_02 (0) | 2021.12.21 |
---|---|
도형(Shape)의 통로(Lane) 체크하기_01 (0) | 2021.12.20 |
도형(Shape)의 통로(Lane) 체크하기_서론 (0) | 2021.12.20 |
재귀호출 2. 퀵정렬(Quick Sort) 및 코딩 방법 (0) | 2021.11.01 |
재귀호출(Recursive Call) 1. 내 생각 (0) | 2021.10.30 |