https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ 을 참고해서 만든 ray-triangle intersection 에 관한 소개입니다.
(레이 트레이싱 전체를 다루는 게 아닌데 슬라이드를 잘못 만들었습니다...)
https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/ 을 참고해서 만든 ray-triangle intersection 에 관한 소개입니다.
(레이 트레이싱 전체를 다루는 게 아닌데 슬라이드를 잘못 만들었습니다...)
2. 6.1 방향성 그래프와 이진관계: Warshall알고리즘 6.2 Euler 경로와 Hamilton 회로 6.3 최단 경로와 최소 신장 트리 6.4 그래프 순회 알고리즘
3. 병렬 아크가 없는 n개의 노드를 갖는 방향성 그래프 n x n 부울 행렬 1 2 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 3 4
4. 병렬 아크가 없는 n개의 노드를 갖는 방향성 그래프 n 개의 원소를 갖는 집합에 대한 이진 관계 n x n 부울 행렬 {(1, 2), (1, 3), (3, 3), (4, 1), (4, 2), (4, 3)} 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1 2 4 3 이거나 이거나 매 한가지다
5. 정의 : 도달가능성 노드 방향성 그래프에서 노드에서 까지 경로(path)가존재하는 경우 는 로부터 도달가능(reachable)하다고 한다. 이면, 노드 에서 까지 길이가 m 인 경로가 존재한다.
8. 알고리즘 Warshall Warshall(n X n Boolean matrix M) // Initially, M = adjacency matrix of a directed graph G with no parallel arcs for k = 0 to n – 1 do for i = 1 to n do for j = 1 to n do M[i, j] = M[i, j] ∨ (M[i, k + 1] ∧ M[k + 1, j]) end for end for end for // at termination, M = reachability matrix of G End Warshall
9. 6.1 방향성 그래프와 이진관계: Warshall알고리즘 6.2 Euler 경로와 Hamilton 회로 6.3 최단 경로와 최소 신장 트리 6.4 그래프 순회 알고리즘
10. Euler 경로 그래프 G 에서 Euler 경로는 G 의 모든 아크들을 단 한 번만 방문하는 경로이다 그래프에서 홀수 노드에 대한 정리 어떠한 그래프에서든 홀수 노드의 수는 항상 짝수이다. Euler 경로에 대한 정리 연결된 그래프에서 Euler 경로가 존재하기 위한 필요 충분 조건은, 그 그래프에 홀수 노드가 하나도 없거나 혹은 두 개만 있어야 한다. 홀수 노드가 없는 경우에는, 임의의 어떤 노드에서 시작하여 그 노드에서 끝날 것이고, 홀수 노드가 두 개 있는 경우에는, 하나의 홀수 노드에서 시작하여 또 다른 하나의 홀수 노드로 끝나야 한다.
11. Hamilton 회로 문제 그래프의 모든 노드를 한 번씩만 방문하는 사이클 경로이다 효과적인 알고리즘이 없다. 그냥 시행착오 방법을 사용해야 한다 N > 2 인 완전 그래프는 Hamilton 회로가 존재한다
12. 6.1 방향성 그래프와 이진관계: Warshall알고리즘 6.2 Euler 경로와 Hamilton 회로 6.3 최단 경로와 최소 신장 트리 6.4 그래프 순회 알고리즘
13. x 1 2 3 4 y ∞ 3 8 4 ∞ 10 3 ∞ ∞ 6 ∞ ∞ 8 ∞ ∞ ∞ 7 ∞ 4 6 ∞ ∞ 1 3 ∞ ∞ 7 1 ∞ 1 10 ∞ ∞ 3 1 ∞ x x 1 2 3 4 y 8 3 2 1 4 10 6 7 1 x 1 2 3 4 y 3 4 3 1 d 0 3 8 4 ∞ 10 s - x xxxx y p = 1 IN = {x, 1} d[2] = min(8, 3 + A[1,2]) = min(8, ∞) = 8 d[3] = min(4, 3 + A[1,3]) = min(4, 9) = 4 d[4] = min(∞, 3 + A[1,4]) = min(∞,∞) = ∞ d[y] = min(10, 3+ A[1,y]) = min(10, ∞) = 10
14. p = 3 (8, 4, ∞, 10 중 가장 작은 3번 노드) IN = {x, 1, 3} d[2] = min(8, 4 + A[3,2]) = min(8, 4 + ∞) = 8 d[4] = min(∞, 4 + A[3,4]) = min(8, 4 + 1) = 5 (a change, so update s[4] to 3 d[y] = min(10, 4 + A[3,y]) = min(10, 4 + 3) = 7 (a change, so update s[y] to 3 x 1 2 3 4 y d 0 3 8 4 5 7 s - x xx 3 3 p = 4 (d-value = 5) IN = {x, 1, 3, 4} d[2] = min(8, 5 + 7) = 8 d[y] = min(7, 5+ 1) = 6 (a change, update s[y] x 1 2 3 4 y d 0 3 8 4 5 6 s - x xx 3 4
15. p = y IN = {x, 1, 3, 4, y} d[2] = min(8, 6 + ∞) = 8 x 1 2 3 4 y d 0 3 8 4 5 6 s - x xx 3 4 최종 경로: x – 3 – 4 – y
16. Open: priorityqueue of searchnode Closed : List of searchnode AStarSearch( location StartLoc, location GoalLoc, agenttype Agent) { clear Open and Closed // 시작 노드를 초기화 한다. StartNode.Loc = StartLoc StartNode.CostFromStart = 0 StartNode.CostToGoal = PathCostEstimate( StartLoc, GoalLoc, Agent ) StartNode.Parent = null push StartNode on Open // 성공 또는 실패에 이를 때까지 목록을 처리한다. while Open is not empty { pop Node from Open // 노드가 최저의 TotalCost를 가지는 경우 // 목표에 도달했으면 성공으로 끝낸다 if (Node is a goal node) { construct a path backward from Node to StartLoc return Success } else { for each successor NewNode of Node { NewCost = Node.CostFromStart + TraverseCost( Node, NewNode, Agent ) // 이 노드가 존재하며 더 나은 결과가 아니라면 무시한다. if (NewNode is in Open or Closed) and (NewNode.CostFromStart <= NewCost) { continue } else { // 새로운, 즉 더 나은 정보를 저장한다 NewNode.Parent= Node NewNode.CostFromStart = NewCost NewNode.CostToGoal = PathCostEstimate( NewNode.Loc, GoalLoc, Agent ) NewNode.TotalCost = NewNode.CostFromStart + NewNode.CostToGoal
17. if (NewNode is in Open or Closed) and (NewNode.CostFromStart <= NewCost) { continue } else { // 새로운, 즉 더 나은 정보를 저장한다 NewNode.Parent= Node NewNode.CostFromStart = NewCost NewNode.CostToGoal = PathCostEstimate( NewNode.Loc, GoalLoc, Agent ) NewNode.TotalCost = NewNode.CostFromStart + NewNode.CostToGoal if (NewNode is in Closed) { remove NewNode from Closed } if (NewNode is in Open) { adjust NewNode's location in Open } else { push NewNode onto Open } } // 이 노드에 대한 처리가 끝났다 } push Node onto Closed } return failure // 목표에 도달하기 전에 Open이 빈 경우는 실패 }
18. x 1 3 4 y x Open = {1(3), 3(4), 2(8), y(10)} Open = {3(4), 2(8), y(10)} Open = {4(5), 2(8), y(10)} Open = {y(6)} 8 3 2 1 4 10 6 7 1 3 4 3 1 y
19. 정의: 신장 트리 연결된 그래프의 신장 트리(spanning tree) 는 노드 및 아크가 그래프의 일부와 일치하는 비루트트리이다. 최소 신장 트리 최소한의 비중을 가지고 모든 노드를 연결하는 신장 트리 Prim 알고리즘 초기의 임의의 노드를IN 에 넣고, IN 에 속하지 않는 모든 노드 z 에 대해서 임의의 노드와z 사이의 최단 거리를 갖는 노드를IN에 추가한다. 이런식으로 반복해서 그래프의 모든 노드가IN 에 추가되면 알고리즘은 종료한다.
20. x 8 1 노드선택시IN 에 1을 넣고, 1에 인접한 x 와 3 노드 중 최소 거리를 갖는 x 를 IN 에 추가한다. 다시 1 과 x 에 인접한 2, 3, 4, y 노드 중 거리가 가장 짧은 3을 넣는다 이런식으로 반복하면 {1, x, 3, 4, y, 2} 가 선택된다 3 2 1 4 10 6 7 1 3 4 3 1 y
21. 6.1 방향성 그래프와 이진관계: Warshall알고리즘 6.2 Euler 경로와 Hamilton 회로 6.3 최단 경로와 최소 신장 트리 6.4 그래프 순회 알고리즘
22. 깊이 우선 탐색 DepthFirst(graph G; node a) mark a visited write(a) for each node n adjacent to a do if n not visited then DepthFirst(G, n) end if end for end DepthFirst
23. 너비 우선 탐색 BreadthFirst(graph G; node a) Queue of nodes Q initialize Q to be empty mark a visited write(a) enqueue(a, Q) while Q is not empty do for each node n adjacent to front(Q) do if n not visited then mark n visited write(n) enqueue(n, Q) end if end for dequeue(Q) end while endBreadthFirst
24. 깊이 우선 탐색과 너비 우선 탐색을 이용하면 Warshall알고리즘을 이용하지 않고도 도달 가능성을 계산할 수 있다. 이것은 O(n * max(n, m) (m: 아크 수) 만약 아크수가노드수와같아면 이다. Warshall알고리즘은 이기 때문에 더 빠르다. 방향성이 있는 그래프에서는 깊이 우선 탐색을 사용해 위상 정렬을 구할 수 있다. 6 5 1 7 2 3 4 깊이 우선 탐색 결과를 역순하면 선행자를 구할 수 있다.