도입
- 계산 기하(computational geometry) 알고리즘: 점, 선, 다각형과 원 등 각종 기하학적 도형을 다루는 알고리즘
- 계산 기하는 3d 그래픽이나 캐드, 로보틱스 등 다양한 분야에서 사용을 하기 때문에 전산학에서는 중요한 역할
- 많은 주제를 포함하고 있지만 학부 선형 대수나 고등학교 수준의 기하학을 요구
- 2차원 평면 도형과 3차원 입체 도형을 모두 다룸.(주로 2차원을 많이 사용)
계산 기하의 도구들
- 벡터
- 정의 및 특징
- 방향 + 크기 = 단위 벡터 + 스칼라(스칼라: 크기만 가지는 양)
- 크기와 방향이 같으면 동일한 벡터
- 계산기하의 기본적인 도구
- 2차원 평면 위에 있는 서로 다른 두 점의 상대적 위치
벡터의 종류
위치 벡터(Position Vector)
원점에서 임의의 점까지 향하는 벡터
그 점은 위치 좌표들에 의해 정의되어짐
일반적으로 측정점을 지칭하며, 보통 r로 표기
위치 벡터는 주로 기준점으로부터 변위를 나타내는 벡터를 말함
변위: 방향을 고려한 거리
거리 벡터(Distance Vector)
두 점간의 거리를 나타내는 벡터 표기 : R = r-r'
변위 벡터(Displacement Vector)
중간 경로에 관계없이 시작점과 끝점을 가장 짧게 연결하는 벡터
법선 벡터(Normal Vector)
벡터 x에 수직(직교)하는 벡터 n
nx = 0 (법선의 벡터 방벙식)
방향 벡터(Direction Vector)
x=tx(직선의 벡터 방정식)
단위 벡터(Unit Vector)
크기가 1인 벡터
ux = x/ ||x||
||ux|| = 1
벡터의 덧셈
삼각형법
평행사변형법
벡터의 뺄셈
- 벡터의 스칼라곱
벡터에 실수배를 곱하면 된다.
점, 직선, 선분의 표현
점: (x1, y1), (x2, y2)
선: 점과 점 사이를 잇는 선분
직선: 점들을 넘어서까지 잇는 선분
- 벡터의 내적
- 두 벡터 사이의 각도를 구하기 위해 사용
- http://j1w2k3.tistory.com/627
- 벡터의 사이각 구하기
- 벡터의 직각 여부 확인
- 벡터가 직각인 경우
가 항상 PI/2, 3PI/2일 수 밖에 없음.
- 내적이 0이라면 두 벡터는 항상 직각
- 벡터의 사영
- 벡터 b에 수직으로 빛이 내리쬘때 벡터 a가 b에 드리우는 그림자
- |a|cos
- 벡터의 외적
- 두 개의 3차원 벡터에 정의되는 연산, 3차원 벡터 a, b가 주어졌을 때 이 두 벡터에 모두 수직인 다른 벡터를 반환
- z축이 0인 경우 2차원 벡터에서도 정의가 가능
- http://blog.naver.com/PostView.nhn?blogId=mindo1103&logNo=90103361104&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
면적 계산하기
외적의 절대값은 a,b 두변으로 하는 평행 사변형의 넓이
원점과 a, b를 꼭지점으로 하는 삼각형 넓이의 정확히 두 배, 외적의 절대값을 구하고 이를 반으로 나누어 해당 삼각형의 넓이를 구하는 것이 가능
두 벡터의 방향 판별
- 각도가 단순히 두 벡터 사이각이 아니라 a에서 b까지 반시계 방향으로 얼마나 회전해야 하는 가를 나타냄
- sin-
= -sin
- 외적이 양수인 경우
- 외적이 음수인 경우
교차와 거리, 면적
- 직선의 교차를 작성할 수 있는 간단한 방법
- a+pb 형태로 표현
- a+pb = c+qd 방정식 필요
(b와 d가 평행이면 교점의 정의되지 않음으로)
- 선분과 선분의 교차
- 직선과 직선의 교차를 계산 후 이 교차점이 두 선분 위에 오는지 확인
- 한 직선위의 두 선분의 관계
- 두 선분이 서로 겹치지 않음
- 두 선분이 한 점에서 닿음
- 두 선분이 겹쳐짐
- 한 선분이 다른 선분 안에 포함됨
- 선분과 선분의 교차: 교차점이 필요 없을 때
- ccw(a, b, c) * ccw(a, b, d) < 0
- ccw(c, d, a) * ccw(c, d, a) < 0
- a<b, c<d인 네 점 a,b,c,d가 일직선 상에 있을 경우 두 선분이 겹치지 않게 하기 위해서는 b<c or d<a이어야 함.
- 교차하지 않고 접촉하는 경우도 인식하기 위해 ab or cd중 하나가 0인 경우에도 참을 반환
- 점과 선 사이의 거리
- 한 직선에 포함된 두 점의 벡터 a, b가 주어졌을 때 이 직선과 다른 점 p 사이의 거리
- 벡터의 내적을 이용하면 손쉽게 계산 가능
- 벡터 p-a가 벡터 b-a에 내린 벡터 사영을 이용해 계산 가능
- 수선의 발을 먼저 계산하고 나서 이와의 거리를 계산해 점과 선 사이의 거리를 계산
기하 개념 code 종합
문제: 핀볼 시뮬레이션(난이도 상)
- 문제: https://algospot.com/judge/problem/read/PINBALL
동혁이는 새로 나온 핀볼 게임을 하고 있습니다. 이 핀볼 게임은 아주 큰 게임판에 여러 개의 장애물을 놓고, 밖에서 공을 던져 가장 많은 장애물을 맞추는 것을 목표로 합니다. 공과 장애물은 완전한 원형이며, 공은 장애물에 부딪히면 항상 입사각과 반사각이 같도록 정반사됩니다. 장애물은 게임판에 고정되어 있기 때문에 움직이지 않습니다. 위 그림은 예제 게임판에서 동혁이가 던진 공이 장애물들에 순서대로 부딪히는 과정을 보여줍니다.
'Algorithms > Definition' 카테고리의 다른 글
[2018 study] 부분합 및 세그먼트 트리 (0) | 2018.07.22 |
---|---|
11장. 조합 탐색 (1/2) (0) | 2017.05.03 |
계산 기하 Part2 (0) | 2017.04.23 |
탐욕법 (0) | 2017.03.05 |