본문 바로가기

Library

Transforming Normal Vector 페이스(face)를 하나 생성했을 때, 페이스에 대한 법선 벡터(normal vector)는 여러모로 유용하게 쓰인다. 만약, 페이스에 어떤 변환 행렬 A를 적용했을 때, A의 법선 벡터에도 이 변환 행렬을 적용할 수 있을까? 즉, A의 변환 뒤의 법선 벡터와, 변환 전의 페이스에 A를 적용한 결과가 같을까? 이것은 명확하게 정의되지 않는다. 왜냐하면, 컴퓨터에서의 부동 소수점은 그 자체가 정확하지 않기 때문이다. 단순히 같은 변환을 적용하여 원하는 정도의 정밀도의 값을 얻을 수 있는 경우도 있겠지만, 미묘하게 값이 맞지 않는 경우도 있을 수 있다. 그래서, 단순히 같은 변환을 적용하는 것보다, 변환 행렬이 적용된 페이스의 법선 벡터를 다시 계산하는 것이 좋다. 그러나, 법선 벡터를 재계산하는 것은 비교.. 더보기
Visual Studio 2010 : Happy New Start! 드디어 기다리고 기다리던 Visual Studio 2010이 출시되었다. C/C++ 기반 개발자들에게 무엇보다 반가운 것은 C++0x의 지원에, PPL(Parallel Pattern Library) 지원이 추가된 것이다. MFC 지원 강화는 사실 BCG 소프트웨어의 리본 툴킷을 가져온 것이고, MFC는 아직 현역이긴 하지만 설계 구조가 시대에 한참 뒤떨어져 있어 Visual C++이 점점 입지가 약화되는게 아닌가 우려가 많았다. 보다 근본적으로 C/C++ 강화가 절실했는데, 이번 Visual Studio 2010은 C/C++ 개발자들에게 환영할만한 선물이 될 것으로 보인다. C++0x 지원은 사실 새로운 것은 아니다. Visual Studio 2008에서도 tr1 라이브러리를 지원하고 있었기 때문이다. .. 더보기
Stanford Bunny / Happy Buddha / Dragon Stanford Bunny, Only wireframe, 69451 faces Stanford Happy Buddha, Only wireframe, 1087716 faces Standford Dragon, Only wireframe, 1132830 faces 이들 파일들은 스탠포드 CG 연구실에서 배포하는 ply 파일을 읽은 것이며, OpenGL을 사용하여 렌더링 했다. 드래곤과 붓다는 상대적으로 폴리곤이 많은 편이라, 쉐이딩을 적용하지 않으면 제대로 모습을 알아보기 힘들다. 쉐이딩을 적용하지 않은 와이어프레임만으로는 대단히 허전해 보인다. 위의 ply 파일을 구하려면, 아래의 스탠포드 CG 연구실에 대한 링크를 참조하라. 모델링 파일에서 데이터를 읽어들일 때 비디오 메모리에 페이스를 생성하지 않는다면,.. 더보기
초기화 리스트를 사용한 생성자 호출 생성자가 참으로 말썽 많은 존재인 것은, 클래스가 명시적인 생성자를 가지고 있지 않을 경우, 컴파일러가 암묵적인 생성자로 클래스를 생성하기 때문이다. 만약 클래스가 반드시 명시적인 초기화가 필요한 데이터 멤버들을 가지고 있을 경우, 이런 방식으로 클래스 생성하는 것은 파국을 초래할 가능성이 높다. 또, 데이터 멤버들이 명시적인 초기화가 필요하지 않더라도, 이것은 역시 좋은 코드는 아니다. 기본 자료형이 아닌 사용자 정의 자료형일 경우 어떤 오버헤드가 있을지 알 수 없고, 템플릿 자료형이라면 그야말로 예측 불가이다. 만약, 이 데이터 멤버들이 예외를 던진다면 이 예외를 받아낼 방법이 전혀 없다. 즉, 여기서 할 이야기는, '디폴트 생성자를 제외한, 반드시 필요한 생성자를 제공해야 하며, 가급적 디폴트 생성.. 더보기
Mapping and Operations 매핑(Mapping, 寫像)은 수학 전체에 걸쳐 매우 중요한 개념이다. 매핑이란, 어떤 집합 S의 원소를 어떤 집합 T의 원소로 대응시킨다는 뜻이다. 매핑은 보통 함수(function)를 의미하며, 산술(calculus)에서는 함수라는 말이 더 일반적이다. 사실 함수와 매핑은 동의어이지만, 이 개념의 일반성을 더 강조하기 위해서 매핑이라는 용어를 사용한다. 매핑의 정의는 다음과 같다. def. 집합 S에서 집합 T로의 매핑은, S의 각 원소를 T의 어느 원소로 유일하게 대응할지 결정하는 관계이다. 집합 S는 패밍의 도메인(domain)이라 불리며, 집합 T는 코-도메인(codomain)이라 한다. 매핑은 일반적으로 그리스 문자 α로 표기하며, 이것은 집합 S에서 T로의 관계를 나타낸다. 만약, x가 집합.. 더보기
Rings and Subrings 링(ring)에 대해 적당히 대응하는 단어를 찾을 수가 없어서, 링은 그대로 외래어 표기를 사용합니다. 날개의 도서관에서 사용하는 수학 용어에 대한 기본 정책은, http://celdee.tistory.com/610에서 찾아볼 수 있습니다. 링은, 명시적으로 연산을 정의하지 않았다면, 거의 언제나 덧셈과 곱셈 두 연산에 대한 집합을 대상으로 한다. 만약 필요하다면, 링이 어떤 두 연산을 정의하고 있는지 명시적으로 밝힐 수도 있다. 일반적으로, 군(group)은 덧셈이라는 하나의 정의만 다루고 있고, 곱셈에 관한 연산을 쓰지 않았다. 즉, 두 개 이상의 어떤 복합적인 연산에 대해서 대수 구조를 확장하지 않은 것인데, 링은 바로 그런 경우까지 다룬다. 따라서, 링은 군보다 조금 더 큰 개념이라 할 수 있는데.. 더보기
Subgroup (Semigroup, 부분군, 반군) 예를 들어, 짝수의 집합은 전체 정수의 부분 집합이라고 할 수 있다. 그리고, 홀수, 짝수의 집합은 각각 덧셈에 관해 군(group)을 이룬다. 그러므로, 다음의 정의를 만족한다면, 짝수는 정수군의 부분군(subgroup, semigroup, 반군)을 이룬다. def. H가 집합 G에서 어떤 연산에 대해 군을 이룬다면, 부분 집합 H는 어떤 군 G의 부분군이다. 즉, G가 어떤 연산 *에 대한 군이라면, H는 G의 부분군이고, a, b ∈ G일 때 a, b ∈ H이다. 이것은, H는 연산 *에 대해 닫혀 있어야 한다는 것을 뜻하고, 부분적으로 a ∈ H일 때 a * a ∈ H이다. 더 간단히 말하자면, 부분군은 군의 정의 중, 첫번째 정의인 'G의 모든 원소 a, b에 대해 (a * b) * c = a .. 더보기
Group : Algebric Structure group은 현대 대수학에서 매우 중요한 개념 중 하나이며, 국내 서적에서는 대부분 '군'이라는 용어로 번역하고 있습니다. 이것 자체는 잘못된 번역은 아니지만, 군과 관련된 다른 대수학 용어들은 적절하게 번역되어 있지 않기 때문에 전체적으로 혼랍스럽다고 느낍니다. 더구나, 뜻을 바로 추측할 수 없는 한자식 용어나 일본에서 들어온 용어가 대부분이라 그 실체를 파악하기가 더욱 어렵습니다. 이를 대신하는 적절한 우리말 용어가 필요하다고 느껴지지만, 군이라는 용어 자체는 그래도 널리 퍼져있는 편에 속하기 때문에, 일단 그대로 사용했습니다. 날개의 도서관에서의 수학 용어에 대한 기본 정책은, http://celdee.tistory.com/610에서 찾아볼 수 있습니다. .... 비유클리드 기하학의 발견 이외에 공.. 더보기
Direct2D : Your New Windows 2D Rendering API 윈도우 1.0이 세상에 나온지 25년이 지났지만, 아직도 초기와 비교해 크게 달라진 것이 없으며, 현역으로 사용되고 있는 것을 꼽으라면 단연 GDI일 것이다. GDI는 XP까지도 윈도우의 2D 프레젠테이션 엔진이었고, GDI+라는 확장된 버전이 작성되기도 했지만 근본적으로 2D 클리핑 기반 엔진이라는 한계를 가지고 있었다. GDI는 윈도우를 서로 겹칠 때 그 단점을 가장 뚜렷하게 관찰할 수 있다. 예를 들어 투명 효과를 구현하다면 복잡한 일이 될 수 밖에 없다. 직접 전체 화면에 대한 DC를 얻어내어 해당 위치에 대한 픽셀값을 계산해야 했기 때문이다. 또, 근본적으로 래스터라이즈된 이미지를 기반으로 동작하기 때문에, 확대, 축소 시에 이미지 손실이 발생한다. .NET에 탑재된 WPF는 벡터 기반으로 작성.. 더보기
STL 알고리즘과 직접 작성하는 이진 탐색 알고리즘 이진 탐색 알고리즘은 로그 시간 복잡도를 보여주는 대표적인 탐색 알고리즘이다. 정렬된 컨테이너에서 어떤 요소를 찾아야 한다면, 우선적으로 고려해봐야 하는 알고리즘 중 하나이다. 만약, STL을 사용하고 있다면 이진 탐색을 적용하는 것은 매우 쉽다. STL 알고리즘은 binary_search, lower_bound, upper_bound, equal_range와 같은 로그 시간 복잡도를 가지는 탐색 함수들을 이미 가지고 있다. 그러나, 때로는 이들 함수를 직접 적용하는 것이 가끔 곤란할 때가 있다. 즉, binary_search는 이진 탐색 함수이기는 하지만 컨테이너에서 주어진 값을 가진 원소가 있는지 없는지만 알려줄 뿐, 컨테이너 내에서의 원소 위치를 알려주지 않는다. lower_bound의 경우, 주어.. 더보기