목록Season 1 (107)
Graphics Programming
표시 객체를 다루다보면 부모 표시 객체를 참조할 일이 생긴다. 비슷한 객체들을 묶어서 관리하기 위해 Sprite 객체 하나를 컨테이너로 쓴다고 치자. 다음은 메인 루프에서 호출되는 Box 클래스의 update 메서드다. class Box { public function update():void {var pivotX:Number = parent.xvar pivotY:Number = parent.y// do something with (x, y) and (pivotX, pivotY)} } 이 메서드는 박스의 부모, 즉 container의 위치를 이용하여 무언가를 갱신한다. 그 외에도 여러 메서드에서 parent 속성을 이용해 컨테이너를 참조한다. 그런데 나중에 편의상 또다시 box와 circle을 따로 묶게..
Visual Studio .NET 2003, 그러니까 버전 넘버로 따지면 v7.1에서 작성된 비주얼 스튜디오 솔루션을 Visual Studio 2013에서 빌드를 시도해봤다. 무려 10년도 더 된 프로젝트다. 예상대로 수백개의 오류와 에러 메시지가 떴다. Deprecated되었습니다이걸 언제 일일이 고쳐... -_-_CRT_SECURE_NO_WARNINGS와 _CRT_NONSTDC_NO_DEPRECATE를 전처리 옵션에 넣어서 통과. 더 이상 지원하지 않는 라이브러리입니다MFC 멀티바이트는 더 이상 지원되지 않으니 유니코드를 써야 한단다.그냥 마이크로소프트 사이트에서 MFC 멀티바이트 라이브러리를 설치해서 해결. WINVER가 낮으시네요MFC가 이번에는 윈도우즈 버전을 가지고 불평을 한다. 윈도우즈 10..
포함-배제의 원리는 합집합의 크기 ($ n(A_1 \cup A_2 \; \cup \; ... \; \cup \; A_k) $) 를 세는 데 활용할 수 있는 기법이다. 다음은 수학 정규교육에서 집합을 배울 때 나오는 간단한 공식이다. $$ n(A \cup B) = n(A) + n(B) - n(A \cap B) $$ 위키피디아를 보면 위 공식을 k개 집합에 대해 일반화한 공식이 나온다. 출처: 위키피디아 하지만 위 공식을 코드로 구현하라면 가능할지 모르겠다. 대신 재귀적인 형태를 살펴보자. ($ A = A_1 $) , ($ B = A_2 \; ... \; A_k $) 를 대입하면 $$ n(A_1 \cup A_2 \; \cup \; ... \; \cup \; A_k) = n(A_1) + n(A_2 \cup \..
세그먼트 트리는 부분합 또는 RMQ(Range Minimum Query)에 적합한 자료구조다. 부분합 구하기는 펜윅 트리를 써도 되기 때문에 RMQ만 알아보겠다. RMQ를 위한 세그먼트 트리는 원소 ($ A[1..n] $) 들에 대해 다음 두 연산을 ($ O(log \, n) $) 으로 효율적으로 처리한다. 1. query(l, r): ($ A[l..r] $) 내에서 최솟값을 반환한다.2. update(i, x): ($ A[i] = x $) 로 갱신한다. 세그먼트 트리에는 이 외에도 구간 갱신(range update) & 단일 원소 질의(single element query), 지연 전파(lazy propagation) 등의 개념이 있다. 세그먼트 트리의 기본과 이러한 고급 개념들은 다음 글들에 자세히 ..
펜윅 트리는 정수 ($ a[1], a[2], ..., a[n] $)에 대해 다음 연산을 수행할 수 있는 자료구조다.1. query(p): ($ a[1] + a[2] + ... + a[p] $) 을 ($ O(log n) $)으로 계산한다. 2. update(i, x): ($ a[i] += x $) 를 ($ O(log n) $)으로 수행한다.부분합 ($ a[l] + a[l+1] + ... + a[r] $)을 구하려면 ($ sum(r) - sum(l-1) $)을 계산한다. (단 ($ a[0] = 0 $)으로 정의)다음과 같은 단순 부분합의 경우 1번 연산에는 ($ O(1) $)이 걸리지만 2번 연산에는 ($ O(n) $)의 시간이 걸린다. 1번 쿼리가 m번, 2번 쿼리가 k번 있을 때, 이 방법은 ($ O(m..
문제: https://www.hackerrank.com/challenges/game-of-stones-1 다이나믹 프로그래밍을 시도해보자. dp[i]를 다음과 같이 정의한다. dp[i] = 돌이 i개 남았고 플레이어 1의 차례다. 플레이어 1이 이길 수 있는가? dp[n] == true이면 플레이어 1이 이기고, 아니면 플레이어 2가 이긴다. 하지만 이 정의는 플레이어 2를 고려하지 않는다. 식을 하나 더 만들어보자. dp2[i] = 돌이 i개 남았고 플레이어 2의 차례다. 플레이어 2이 이길 수 있는가? 한 번에 돌을 2개, 3개, 또는 5개 가져갈 수 있으므로 돌이 1~5개 남은 상황에 대해 생각한다. dp[1] = false (플레이어 1이 선택 불가)dp[2] = true (2개를 가져가면 0개가..
문제: https://www.acmicpc.net/problem/9520 다이나믹 프로그래밍을 코딩하는 방식은 크게 재귀와 루프로 나뉜다. 재귀 방식은 일종의 지연 평가(lazy evaluation)를 구현한다. (i,j) 항을 참조했는데 평가되지 않았다면 평가하여 반환하고, 이미 평가되었다면 그대로 값을 반환한다. 루프 방식은 for/while로 루프를 돌며 DP 테이블을 채운다. 문제에 따라 무엇을 써도 상관 없는 경우가 있고 재귀나 루프 중 하나가 훨씬 편한 경우도 있다. 나는 루프를 선호한다. 이 문제의 경우 방문 순서를 그리면 1~(n-1)번 도시들은 무조건 n번 도시의 왼쪽이나 오른쪽에 통째로 있어야 한다. 따라서 점화식을 다음과 같이 세울 수 있다. dp[i][j] = 도시 1~i를 방문하는..
큐브맵은 스카이박스와 환경 매핑(Environmental mapping)을 구현할 때 유용한 기능이다. 큐브맵을 샘플링할 때는 큐브맵 샘플러와 방향 벡터가 필요하다. #version 430 core layout (binding = 0) uniform samplerCube texCube; in VS_OUT { vec3 tc; } fs_in; layout (location = 0) out vec4 color; void main() { color = texture(texCube, fs_in.tc);} 원점에서 방향 벡터를 따라갈 때 도달하는 텍셀을 샘플링하는데, 이 벡터가 문제다. 모델의 기하 정보를 기술할 때 OpenGL은 오른손 좌표계를 사용한다. 즉 화면 오른쪽이 +x축, 위쪽이 +y축일 때 화면에서 나..