koodev

Subgroup으로 생성되는 Left Coset

Math

앞서 Coset을 다음과 같이 정의했다.

aN = { gG | g = an for some nN}

즉, Group G에서 Homomorphism φ 와 Kernel N을 가질 때, 엘리먼트 a의 Coset은 aN들이다.

그런데 궂이 Homomorphism의 Kernel을 안쓰고도 Coset을 정의할 수도 있다. Group G의 Subgroup HLeft Coset은 아래와 같다.

aH = {ah | hH}

Left에 a가 위치함을 기억해두자. 즉, Kernel 집합 대신에 원래 Group의 Subgroup을 쓴 것이다. Kernel도 Group G의 Subgroup이라는 것을 떠올려보자.

그리고 위의 정의에 따르면 Subgroup H도 coset이다. 왜냐하면 H = 1H 이기 때문이다.

이렇게 만들어진 Coset들은 Congruence Relation을 이루는 Equivalence Class이다.

ab if b = ah, for some hH

위와같이 Coset이 Subgroup H로 정의되었을 때, 왜 Congruence한 것들끼리 Equivalence Relation을 갖게 되는지 살펴보자.

우선 Equivalence Relation이 되는 조건에는 어떤 것들이 있었는지 기억을 더듬어보자.

  1. Transitive: If a ~ b and b ~ c, then a ~ c
  2. Symmetric: If a ~ b, then b ~ a
  3. Reflexive: a ~ a for all aS

Subgroup의 특성을 떠올리면서 하나씩 살펴보자.

Transitivity: ab 이고, bc 라고 해보자. 이는 곧 b = ah, c = bh' for some h, h'H 이다. 두 식을 합치면, c = ahh' 가 된다. 근데 H는 Subgroup이기 때문에 두 h, h'를 Composition하면 hh'H 역시 H 이다. 따라서 ac 가 된다.

Symmetry: ab 라면 b = ah 가 된다. 양 변에 h-1 씩 Composition 해 주면, a = bh-1 이 된다. h-1H 이므로 ba 가 된다.

Reflexivity: a = a1 이고 1 ∈ H 이므로 aa 이다.

Equivalence Class들을 통해 Partition을 형성할 수 있다는 사실을 생각하면 아래 내용을 이끌어낼 수 있다.

Corollary. 어떤 Group에서 어떤 Subgroup에 대한 Left Coset 들은 해당 Group의 Partition을 형성한다.

Left Coset aH는 Group G의 특정 부분집합을 나타낸다. Equivalence Relation에서 서로 다른 표현(예를 들면, a ~ b에서 aNbN은 같은 Coset을 나타냄)이 결국은 같은 부분집합을 나타낼 수도 있다는 것을 생각해보면, aHa를 포함하는 유니크한 Coset이지만 역시 다른 표기법으로 나타낼 수 있다는 사실을 유추해낼 수 있다.

aH = bH if and only if ab

만일 aH와 bH가 공통의 엘리먼트를 갖고 있다면 이 둘은 서로 같다.

예를 들어 Group G를 Symmetric Subgroup S3이며 G = {1, x, x2, y, xy, x2y} 라고 해보자. xy는 아래와 같은 Permutation Matrix이다.

x =
010
001
100
 ,  y =
010
100
001

x는 한 칸씩 시프트(123이 231로)하는 Permutation이고, y는 3을 고정시키고 1과2를 바꾸는 Permutation이다. 여기서 엘리먼트 xy를 가지고 Cyclic Subgroup을 만들 수 있는데, (xy)(xy) = 1 이므로 H = {1, xy} 가 되어 Order 2를 갖는다. 그러면 Group G에서 Subgroup H의 Left Coset들은 아래와 같이 세 개가 나올 수 있다.

{1, xy} = H = xyH
{x, x2y} = xH = x2yH
{x2, y} = x2H = yH

세 번째 식이 좀 헷갈리는데 계산해보면 yxy = x2 이 된다. 이 예에서도 보면 Left Coset들로 전체 Group이 Partition됨을 확인할 수 있다.

'Math' 카테고리의 다른 글

Right Coset  (0) 2017.06.27
Lagrange's Theorem과 Counting Formular  (0) 2017.06.22
Congruence Relation & Coset  (0) 2017.06.10
Equivalence relations (3) - fibres  (0) 2017.06.08
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02

Congruence Relation & Coset

Math

Equivalence Relation in Homomorphism = Congruence Relation = Coset

들어가기에 앞서 Homomorphism에 대해 복습해보자.

Group GG'이 있을 때, Homomorphism이란 φ: GG' 매핑으로 다음 룰을 만족한다: φ(ab) = φ(a)φ(b)

매핑 φ:GG'을 Homomorphism 이라고 하자. 여기서 매핑 φ에 의해 G에 Equivalence Relation이 존재하는지를 살펴보자. 이는 Homomorphism에 fibres가 존재하는지를 알아보는 것이기도 한다. 이 경우, 즉 Homomorphism인 φ에서 아래와 같이 Equivalence한 조건일 경우를 Congruence 라고 하고, 기호로는 ~(tilde) 가 아닌 ≡(삼지창등호?) 으로 표기한다.

ab   if   φ(a) = φ(b)

예를 들어 φ:ℂ× ⟶ ℝ× 가 φ(a) = | a | 으로 절대값을 취하는 Homomorphism 매핑 이라고 하자. 이걸로 정의된 Equivalence Relation에 의하면 | a | = | b | 일 경우 ab 이게 된다. 여기에서 fibres는 아래 그림과 같은 Concentric Circles(동심원)이 된다. 그리고 이들 fibres는 매핑된 이미지 im φ(양의 실수들의 집합)와 bijective한(일대일대응) 관계를 갖는다.

Congruence Relation을 정의하는 것은 앞서 나온 ' ab   if   φ(a) = φ(b) ' 외에도 다른 방법들이 많은데 이들 중 이번에 소개하는 내용이 가장 중요하다.

Proposition. φ:GG'을 Group Homomorphism 이며, Kernel N을 갖고, abG의 엘리먼트라고 하자. 그러면 φ(a) = φ(b) 라는 것은 반드시(if and only if) nN인 어떤 엘리먼트 n에 대하여 b = an 이어야 한다. 또는 같은 의미로 a-1bN 이어야 한다.

Proof. φ(a) = φ(b) 라고 하자. 그러면 φ(a)-1φ(b) = 1 이고, φ가 Homomorphism 이기 때문에 아래 두 식을 사용하면,

φ(ab) = φ(a)φ(b)
φ(a-1) = φ(a)-1 ... since a group homomorphism carries the identity to identity and inverses to inverses

φ(a-1b) = 1 이렇게 쓸 수 있다. 그리고 Kernel의 정의를 다시 떠올려보자. Kernel NxG 에서 φ(x) = 1 인 모든 엘리먼트 x를 말한다. 따라서, φ(a-1b) = 1 라는 것은 곧 a-1bN 이며, a-1b = n (for some nN) 이 된다. 바꾸어 말하면, 만일 b = an 이고, nN 일 경우, φ(b) = φ(a)φ(n) = φ(a)1 = φ(a) 가 된다(끝).

여기서 an 과 같은 형태(어떤 엘리먼트와 Kernel 중의 한 엘리먼트와의 composition)를 갖는 엘리먼트들의 집합을 Coset of N in G 라고 하고, aN 이렇게 쓴다.

aN = { gG | g = an for some nN}

즉, Coset aN은 Group 내에서 a와 Congruent한 모든 엘리먼트 b가 된다.

한편, Congruence Relation 인 ab는 Group G를 Partition 하여 Congruence Class로 만든다. 결국 이 Congruence Class가 Coset aN 이다. 이 Coset 들은 φ 매핑의 fibres 이다. 위의 예제 그림 5.12 에서 보이는 각각의 동심원들이 바로 절대값으로 매핑되는 Homomorphism의 Coset 들인 것이다.

그런데 만일 어떤 Homomorphism에서 Kernel이 Trivial Subgroup, 즉 1 ⟶ 1' 하나로 구성된 경우라면 어떨까?

Corollary. 어떤 Group간 Homomorphism φ:GG'가 Injective 할 경우 반드시(if and only if) Kernel은 Trivial Subgroup인 {1} 이 된다.

Injective란 우리말로 단사함수이며 f(x1) = f(x2) 일 경우는 반드시 x1 = x2 이며, x2x2 이면 f(x1) ≠ f(x2) 가 되는 함수이다. 위의 그림에서 aN이 φ(a)로 대응되는데 Kernel이 한개뿐이라면 당연히 단사함수가 될 것이다.

위의 Corollay를 가지고 어떤 Homomorphism이 Isomorphism인지를 검증할 수 있다. Isomorphism은 양방향이며 Bijective 해야 한다. 즉, ker φ = {1} 이라면, 그 φ는 Injective 할 것이고, 또한 im φ = G' 이 될 것이다. 즉, φ 는 Surjective(전사함수: 치역과 공역이 같음)한 것이다. Injective하고 Surjective하니 Bijective할 것이고 Homomorphism이니 결국은 Isomorphism이 되겠다.

'Math' 카테고리의 다른 글

Lagrange's Theorem과 Counting Formular  (0) 2017.06.22
Subgroup으로 생성되는 Left Coset  (0) 2017.06.16
Equivalence relations (3) - fibres  (0) 2017.06.08
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Equivalence relations (1)  (0) 2017.05.31

Equivalence relations (3) - fibres

Math

이전 포스팅의 내용을 다시 생각해보면, 어떤 매핑함수 φ:ST 가 정의역(domain) S에서 Equivalence Relation을 형성한다고 했을 때, φ(a) = φ(b) 이라는 것은 a ~ b 임을 의미한다. 매핑함수가 서로 Equivalence Class 임을 판별하는데 쓰이는 것이다. 이렇게 φ 매핑에 의해서 Equivalence Relation이 형성되었을 때 이것을 the Equivalence Relation determined by the map 이라고 한다.

매핑에는 Inverse(역사상)도 있을 수가 있다. 위의 경우에는 T의 엘리먼트에 대응되는 S쪽 Partition이 Inverse 이미지가 된다. 즉, 엘리먼트 tTInterse Image는 모든 엘리먼트 s가 아래와 같은 S의 부분집합이 되게 된다.

φ-1(t) = {sS | φ(s) = t}

즉, φ-1(t)은 정의역(domain)이었던 S의 부분집합이 된다. 이러한 표현은 단지 표현방식일 뿐이고 여기서 φ-1은 함수가 아니다. 출력이 여러 엘리먼트가 될 수도 있기 때문이다. 이렇게 나오는 Inverse Image들을 fibres of the map φ 라고 부른다. Nonempty인 fibres φ-1(t) 라는 것은 t가 φ의 Image이며, S의 Partition을 형성한다는 것을 의미한다. 여기서 Nonempty fibres 들의 집합인 Equivalence Class S 는 φ 매핑의 이미지 im φ 를 만들어 낼 수도 있다.

φ:S ⟶ im φ

위의 매핑은 일대일매핑(bijective)으로 S의 엘리먼트 s를 φ(s)로 보내는 매핑이다. 이건 φ:ST 와 같아보일수도 있지만 입력이 개별 엘리먼트인 s단위가 아니라 fibres인 s단위이다.

한편, fibres는 영국식 표현이라고 한다. 미국식으로는 fiber 라고하며, 우리말로는 올다발이다.

'Math' 카테고리의 다른 글

Subgroup으로 생성되는 Left Coset  (0) 2017.06.16
Congruence Relation & Coset  (0) 2017.06.10
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Equivalence relations (1)  (0) 2017.05.31
Homomorphisms (2): image, kernel and normal subgroup  (0) 2017.05.24

Xcode에 assimp 올리기

Programming

OpenGL 3D 모델 관련 코드를 연습해보다가 웹에 공유된 모델 데이터를 코드로 읽어들이는 작업이 필요하게 되었다. 참고하고 있는 문서에서는 assimp 외부 라이브러리를 사용하고 있었는데, 윈도우 기반으로 설명하고 있어서 Xcode에 적용하는 방법은 직접 알아낼 수 밖에 없었다. 이 포스트에서는 Xcode에 MacOS용 assimp를 적용하는 방법을 정리한다.

아래는 assimp 라이브러리를 사용하여 nanosuit.obj 를 읽어들여 렌더링한 결과이다. 텍스처는 아직 연결하지 못했다.

한편, 애플은 ModelIO 라는 API를 제공하고 있었는데 나한테는 assimp보다 사용성이 직관적이지 않고 이해하고 적용하기까지 많은 시간이 걸리는 듯 하여 포기했다.

Assimp 다운로드

assimp 페이지를 방문하여 코드를 다운로드 받는다. 나는 최신 버전을 git으로 받았다.

git clone git://github.com/assimp/assimp.git

Cmake 설치

Assimp를 빌드하려면 Cmake를 설치해야 한다. GUI버전을 다운로드 받아도 될지 모르겠지만, 나는 brew를 사용하여 설치했다.

brew install cmake

Assimp 빌드

여기서부터 좀 삽질을 했었는데, 그냥 Cmake를 돌리면 컴파일러가 지정되어 있지 않다는 등 알 수 없는 에러가 나온다. 아래는 assimp 소스 폴더에서 cmake CMakeLists.txt -G "Xcode" 를 실행했을 때 나왔던 에러이다.

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:38 (PROJECT):
  No CMAKE_C_COMPILER could be found.



CMake Error at CMakeLists.txt:38 (PROJECT):
  No CMAKE_CXX_COMPILER could be found.



-- Configuring incomplete, errors occurred!
See also "/Users/koodev/Workspace/Source/assimp/CMakeFiles/CMakeOutput.log".
See also "/Users/koodev/Workspace/Source/assimp/CMakeFiles/CMakeError.log".

GUI 버전의 Cmake를 돌려도 비슷한 에러가 뜬다. 나한테 유효했던 해결책은 아래와 같이 xcode-select 로 developer tool의 기준이 되는 경로를 지정해 주는 것이다. 이 방법을 알아내는데 참고한 사이트는 다음과 같다: https://github.com/nodejs/node-gyp/issues/569#issuecomment-255589932

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
cmake CMakeLists.txt -G "Xcode"

그러면 한동안 빌드가 돌아가고 Assimp.xcodeproj 도 나온다. 내 Mac에 Xcode는 한번밖에 설치한 적이 없을텐데 왜 이게 문제가 되었는진 모르겠다. 힘들게 빌드는 했지만 잘 이후에도 큰 난관이 2개나 더 있었다.

프로젝트에 Assimp 가져오기

Xcode에 외부 라이브러리를 추가하는 방법은 두 가지 정도가 될 수 있을 것 같다. 하나는 해당 라이브러리를 Sub Projext로 구성하는 것이고, 다른 하나는 직접 라이브러리 파일을 추가하는 것이다. 앞의 방식을 사용하면 디버깅을 할 수 있다는 장점이 있다. (뭐가 쉬울까) 고민 끝에 나는 뒤의 방식으로 진행했다.

우선 프로젝트 루트 폴더 밑에 assimp라는 폴더를 만들고 여기에 assimp 소스의 include 폴더와 lib/Debug 폴더를 가져와 아래와 같이 구성한다. lib 폴더에 assimp의 lib/Debug 안에 있는 .a파일과 링크들을 넣었다.

.
├── OpenGLScratch
├── OpenGLScratch.xcodeproj
└── assimp
    ├── include
    │   └── assimp
    │       ├── Compiler
    │       └── port
    │           └── AndroidJNI
    └── lib

그리고 Finder를 열어 assimp 폴더를 Xcode로 그래그하여 옮긴다. 아래와 같은 상태로 만드는 것이다.

프로젝트의 Build Phases - Link Binary With Libraries로 가보면 Xcode가 친절하게도 방금 전에 추가한 라이브러리들을 링크하게 설정해 놓았다.

그치만 헤더 파일의 경로는 자동으로 잡아주지 않기 때문에 이것을 직접 해 주어야 한다. Build Settings - Header Search Paths 에 있다.

끝?

이제 프로젝트에서 assimp라는 외부 라이브러리를 사용할 수 있는 상태가 된 것이다. 하지만 코드에서 assimp를 쓰기 위해서 해야 할 일이 좀 더 있다. assimp 인터페이스가 C++ 이기 때문에 Objective-C++ 로 wrapper 인터페이스를 만들어야하고, Swift를 사용할 경우에는 Bridging Header에 새로 만든 wrapper 헤더를 넣어주어야 한다.

참고

Equivalence relations (2) - Bar 표현식

Math

어떤 집합 S에 Equivalence Relation이나 Partition이 있다고 해 보자. 이 상황에서 각 엘리먼트가 Equivalence Class(혹은 Partition에 의해 나눠진 부분집합)인 새로운 집합 S를 정의할 수 있다. Equivalence Class들로 이루어진 집합이 되는 것이다. 더 나아가서 a를 포함하는 Equivalence Class가 있을 경우 이를 a라고 표기할 수 있다. aS의 엘리먼트 중 하나인 것이다.

위의 상황을 아래와 같은 natural surjective map으로 표현할 수 있다. natural surjective map은 전사함수인데, codomain(정의역) = range(치역) 인 함수를 말한다.

SS, which sends
aa

예를 들어 S = ℤ 이고, S의 엘리먼트가 (Even)과 (Odd)로 이루어져 있다면, 0 = 2 = 4 = ... 가 될 것이다. 즉, 이들 중 어느것이라도 집합 (Even)을 나타낼 수 있다.

ℤ ⟶ {(Even), (Odd)}

위와 같은 상황을 두 가지 방식으로 생각해 볼 수 있겠다.

집합 S의 엘리먼트들을 Partition으로 나눠진 부분집합 중 한 곳에 쌓아놓는다고 보고 각각에 쌓인 더미들(piles)이 또 다른 집합 S 를 형성한다고 생각하는 것이다. SSS의 엘리먼트들을 해당하는 더미(pile)로 옮기는 매핑인 것이다.

또는 이러한 매핑을 S에서 서로 모이는 것끼리는 '같다'라고 생각해 볼 수 있다. 즉, a ~ bS에서는 a = b 를 의미한다고 보는 것이다. 이 관점에서 보면 두 집합 SS는 서로 대응되는(correspond) 관계인 것이다. 단, S에서 엘리먼트끼리 '같다'라는 의미가 좀 더 강할 것이다. 아래의 표현으로 좀 더 명확하게 설명될 수 있을 것 같다.

a = b means a ~ b

위와 같은 bar 표현식의 단점이라고 한다면, 여러 심볼들이 나타내는 것들이 서로 겹칠 수 있다는 점이다. 이에 대하여 각 Equivalence Class의 대표 표현식만 쓰는 방법이 있다. 예를 들면, (Even)을 0 으로, (Odd)를 1 으로만 쓰는 것이다.

{(Even), (Odd)} = {0, 1}

물론 첫 번째 방식(매핑에 의해 더미로 쌓인다고 생각하는 것)이 좀 더 눈에 잘 들어올 수는 있겠으나, 어떤 경우에는 두 번째 방식(bar 표현식)이 더 적합하다. 첫 번째 방식은 표현하기에는 어렵고 손이 많이 가는 반면, (짝수/홀수를 생각해보자) 두 번째 방식은 수학적인 표현식에 집어넣기 편하기 때문이다.

'Math' 카테고리의 다른 글

Congruence Relation & Coset  (0) 2017.06.10
Equivalence relations (3) - fibres  (0) 2017.06.08
Equivalence relations (1)  (0) 2017.05.31
Homomorphisms (2): image, kernel and normal subgroup  (0) 2017.05.24
Homomorphisms (1)  (0) 2017.05.22

Equivalence relations (1)

Math

Equivalence Relation은 우리말로 하면 '동치관계'이다.

수학적인 구조를 만드는 기본적인 방법중에 하나는 집합 S에서부터 시작하여 S안의 특정 엘리먼트들을 같은 범주로 두는 새로운 집합을 생성하는것이다. 편가르기? 예를 들면, 정수 집합을 짝수와 홀수 두 개의 집합으로 나눌 수 있을 것이다. 또는 평면상에서 합동인 삼각형(Congruent Triangle)들을 지리적으로 동일한 오브젝트로 볼 수도 있다.

어떤 집합 S가 있을 때, Partition P of SS를 겹치지 않는 부분집합으로 나누는 것을 의미한다.

S = union of disjoint, nonempty subsets

예를 들면, 아래 집합은 집합 {1, 2, 3, 4, 5}의 Partition이다.

{1, 3}, {2, 5}, {4}

그리고 Equivalence Relation on SS에서 특정 엘리먼트들끼리의 관계를 의미한다. 이를 a ~ b 이렇게 쓰고 Equivalence of a and b라고 부른다.

Equivalence Relation은 아래와 같은 조건이 붙는다.

  1. transitive: If a ~ b and b ~ c, then a ~ c
  2. symmetric: If a ~ b, then b ~ a
  3. reflexive: a ~ a for all aS

예를 들면, 합동인 삼각형(Congruent Triangle)들은 평면상의 삼각형들의 집합 S에서 Equivalence Relation이 될 수 있다.

좀 더 일반적으로 들어가보자. 집합 S에서 Relation을 갖는다는 의미는 S의 엘리먼트 두개를 짝지어 놓은 집합 S × S의 부분집합 R과 같다. 여기서 Ra ~ b인 (a, b) 짝들로 구성된다. 그럼 부분집합의 관점에서 위에서 살펴본 Relation의 Axiom들을 아래와 같이 써볼 수 있다.

  1. if (a, b) ∈ R and (b, c) ∈ R, then (a, c) ∈ R
  2. if (a, b) ∈ R, then (b, a) ∈ R
  3. (a, a) ∈ R for all a

Partition of S라는 말과 Equivalence Releation on S라는 말은 논리적으로는 서로 equivalent(동등)하여 실제로는 둘 중에 하나만 대표로 사용된다. 즉 주어진 Partition of S에서 ab가 Partion의 같은 부분집합에 놓여 있을 경우 이를 a ~ b라고 맺은 Equivalence Relation R을 정의할 수 있다. 위의 Axiom들을 모두 만족하기 때문이다. 반대로, 주어진 Equivalence Relation R에서도 Partition P를 다음과 같이 정의할 수 있다: 엘리먼트 aa ~ b인 모든 엘리먼트 b를 포함하는 부분집합. 이런 부분집합을 Equivalence Class of a 라고 하고, S가 Euqivalence Class로 Partition 되었다고도 한다.

Equivalent Relation이 집합 S에서 Partition을 만든다는 의미를 확인해보자. CaaS인 Equivalence Class라고 하자. 즉, Caa ~ b인 모든 b를 포함한다.

Ca = {bS | a ~ b}

위의 Axiom들 중 reflexive에 의해 aCa 가 되기 때문에 모든 Ca 클래스들은 nonempty이다. 또한 aS의 어떤 엘리먼트도 될 수 있기 때문에 Ca 클래스들이 모이면 집합 S를 커버한다.

이어서 서로다른 Equivalence Class 들은 겹쳐서는 안된다는 속성을 확인해야 한다. 여기서 헷갈릴 수도 있는게, symmetric에 의해서 a ~ bb ~ a 도 되어, bCa 가 될 수 있다. 그런데 bCb 이기도 하기 때문에 서로 다른 Equivalence Class 들이 겹치는 문제가 발생한다. 하지만 사실은 두 클래스가 동일하다. 이어서 아래 내용을 살펴보자.

Ca와 Cb가 공통의 엘리먼트 d를 포함한다고 하자. 그러면, Ca = Cb 이다.

우선 a ~ b 이면 Ca = Cb 이라는 것을 확인해보자. xCb의 임의의 엘리먼트라고 하면, b ~ x 이다. 그러면 a ~ b 이기 때문에 transitivity에 의하여, a ~ x 이며 xCa 가 된다. 따라서 CbCa 가 된다. ab의 순서를 바꾸어도 마찬가지이기 때문에 CaCb 도 성립한다.

그리고 dCaCb의 공통의 엘리먼트라면, a ~ d 이면서 b ~ d 가 된다. 그러면 transitive에 의하여 a ~ b 가 되면서 위에서 밝힌 CbCaCaCb에 의해 Ca = Cd = Cb 가 성립된다(끝).

다시 말해서 각 Equivalence Class들간에 겹치는 엘리먼트가 있다면, 두 클래스가 완전히 동일하게 되므로 한 집합에서 겹치는 Equivalence Class가 생길 수 없게 되는 것이다.

'Math' 카테고리의 다른 글

Equivalence relations (3) - fibres  (0) 2017.06.08
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Homomorphisms (2): image, kernel and normal subgroup  (0) 2017.05.24
Homomorphisms (1)  (0) 2017.05.22
Automorphism and conjugation  (0) 2017.05.18

OpenGL로 원 그리기

Programming

OpenGL로 원을 그리려면 어떻게 해야 할까? OpenGL primitive에는 원이 없고 점이나 선, 삼각형 등만 그릴 수 있다. 그러면 점근적인 접근방식으로 삼각형을 여러개 이어서 원 모양으로 그릴 수 있을 것이다. 그렇지만 이 방식은 정교하게 하려하면 할수록 더 많은 점들이 필요하다. 여기서는 점 4개 만으로 그릴 수 있는 방법을 정리해 보았다.

우선 그릴 원을 정의해 보자. 구현을 단순하게 하기 위해서 NDC(Normalized Device Coordinates)를 기반으로 해서 아래와 같이 정의해 보았다.

  • 반지름: 0.5
  • 원점좌표: (0.0, 0.0, 0.0)
  • 색깔: 외접하는 사각형의 네 귀퉁이를 빨강, 파랑, 노랑, 초록으로 하여 섞어서 보간

추가적으로 타원이 아닌 동그라미를 그리기 위해서는 그림을 그릴 윈도우의 가로세로 비율이 필요하다. 가로/세로 = 3/2 = 1.5 로 고정시킨다.

일단 원을 그리기 앞서 외접하는 사각형을 그린다. 점들의 좌표와 인덱스는 아래와 같이 정의한다.

let vertices: [GLfloat] = [
    -0.5, -0.5, +0.0, 1.0, 0.0, 0.0,
    +0.5, -0.5, +0.0, 0.0, 1.0, 0.0,
    +0.5, +0.5, +0.0, 0.0, 0.0, 1.0,
    -0.5, +0.5, +0.0, 1.0, 1.0, 0.0,
]
let indices: [GLuint] = [
    0, 1, 2,
    0, 2, 3
]

아래는 Vertex shader고,

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
out vec3 ourColor;
void main()
{
  gl_Position = vec4(position.x, position.y, position.z, 1.0);
  ourColor = color;
}

Fragment shader는 아래와 같다.

#version 330 core
in vec3 ourColor;
out vec4 color;
void main()
{
  color = vec4(ourColor, 1.0);
}

이걸 가지고 사각형을 그리면 아래와 같이 된다. 풀 소스는 다음 링크를 참고한다:

결과는 아래 그림과 같다.

이를 기반으로 원을 그려보자. 원을 그리는 전략은 각 Fragment에서 원의 중심 좌표로부터 거리를 재서 정의한 반지름 안에 들어오면 해당하는 색을 칠하고, 거리가 너무 멀면 색을 칠하지 않는 것이다. 거리를 재기 위해서 GLSL의 내장 함수인 distance를, 반지름과 비교하여 0아님 1의 값을 내기 위해 step함수를 사용할 것이다.

우선 Vertex shader는 아래와 같다.

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
out vec3 ourColor;
out vec3 ourPosition;
void main()
{
  gl_Position = vec4(position.x, position.y, position.z, 1.0);
  ourColor = color;
  float ratio = 3.0 / 2.0;
  ourPosition = vec3(position.x * ratio, position.y, position.z);
}

그리고 Fragment shader는 아래와 같다.

#version 330 core
in vec3 ourColor;
in vec3 ourPosition;
out vec4 color;
void main()
{
  float radius = 0.5;
  vec3 origin = vec3(0.0);
  float dist = distance(origin, ourPosition);
  float alpha = step(dist, radius);
  color = vec4(ourColor, alpha);
}

그러면 아래와 같은 동그라미를 그릴 수 있다. 근데 원의 가장자리가 찌글찌글한 모양새를 (선호하는 사람도 있겠지만) 불편해 하는 사람도 있을 것이다.

가장자리에 안티알리아스 효과를 주기 위해서 step 함수를 대신하여 smoothstep 함수를 사용할 수 있다. step이 계단이라면 smoothstep은 언덕길이라고 할 수 있겠다. 아래 그림 참고.

smoothstep을 사용하는 Fragment shader는 아래와 같다.

#version 330 core
in vec3 ourColor;
in vec3 ourPosition;
out vec4 color;
void main()
{
  float radius = 0.5;
  vec3 origin = vec3(0.0);
  float dist = distance(origin, ourPosition);
  float delta = 0.01;
  float alpha = smoothstep(dist-delta, dist, radius-delta);
  color = vec4(ourColor, alpha);
}

그리고 최종 결과는 아래와 같다.

풀 소스는 다음 링크를 참고한다: CircleRenderer.swift

참고한 사이트:

Homomorphisms (2): image, kernel and normal subgroup

Math

모든 group간 Homomorphism φ는 imagekernel이라는 두 개의 중요한 subgroup을 갖는다. image of a homomorphism φ: GG'은 그냥 아래와 같이 매핑된 결과 이미지이다. Homomorphism은 bijective가 아니라는 것을 유념해두자.

im φ = {xG' | x = φ(a) for some aG}

이건 G' 나 혹은 φ(G) 이렇게 쓸 수도 있다.

kernel of φ 는 좀 더 미묘한데, kernel이란 G의 엘리먼트들 중에서 G'의 identity로 매핑되는 녀석들을 말한다.

ker φ = {aG | φ(a) = 1}

이건 G'의 identity 엘리먼트에 대해 역사상시킨 이미지라고 할 수 있다(φ-1(1)). φ가 bijective 하지 않기 때문에 φ-1은 여러개로 사상될 수 있겠다.

kernel은 G의 subgroup이다. 왜냐하면 ab가 ker φ안의 엘리먼트라면, φ(ab) = φ(a)φ(b) = 1 · 1 = 1 이며, 따라서 ab ∈ ker φ 이기 때문이다.

determinant 함수의 kernel은 determinant가 1인 행렬들로 이루어진 subgroup이다. 이 subgroup을 special linear group 이라고 부르고, SLn(ℝ) 이라고 쓴다.

SNn(ℝ) = {real n × n matrices A | det A = 1}

SLn(ℝ)은 GLn(ℝ)의 subgroup이다.

그리고 sign of a permutation sign: Sn → {±1} 이것의 kernel은 alternating group이라고 하고, An이라고 쓴다.

An = {even permutations}

kernel이 subgroup이라는 것 외에도 conjugate와 관련한 중요한 특징이 하나 더 있다. 만일 a가 ker φ 안의 엘리먼트이고 b가 group G안의 어떤 엘리먼트라면, conjugate bab-1 은 ker φ 안의 엘리먼트이다. a ∈ ker φ 라면 φ(a) = 1 이라는 것을 염두해서 아래 수식을 살펴보면,

φ(bab-1) = φ(b)φ(a)φ(b-1) = φ(b)1(b-1) = 1

이므로, bab-1 ∈ ker φ 가 된다.

여기까지를 바탕으로 normal subgroup의 정의를 살펴보자.

Definition. 다음 속성을 갖는 group G의 subgroup Nnormal subgroup이라고 부른다: 모든 aN와 모든 bG에 대하여 conjugate bab-1N의 엘리먼트이다.

여기서 subgroup N이 꼭 kernel일 필요는 없다.

The kernel of a homomorphism is a normal subgroup.

위에서 살펴본 determinant의 kernel인 SLn(ℝ)은 GLn(ℝ)의 subgroup이고, {even permutation}이자 sign of permutation의 kernel인 AnSn의 subgroup 이다.

또한 abelian group의 subgroup은 모두 normal이다. 왜냐하면 G가 abelian이면, conjugate bab-1 = a 이기 때문이다.

거꾸로 말하면, nonabelian group에서 subgroup은 모두가 normal일 필요는 없을 것이다. 예를 들어, A =

11
1
  이고, B =
1
1
  이면, BAB-1 =
1
11
  이 된다. 여기서 (우상단 대각행렬 모양인) AT 이고, BGL2(ℝ) 이지만, (좌하단 대각행렬 모양인) BAB-1T 이다.

normal group의 또다른 예로 center of a group G 가 있다. center subgroup은 Z 또는 Z(G) 이렇게 표기하며, G의 어떤 엘리먼트와 composition하는 경우에도 가환(commute)하는 성질을 갖는다.

Z = {zG | zx = xz for all xG}

모든 group의 center는 normal subgroup이다. 예를 들어 GLn(ℝ)의 center는 scalar matrix의 group(cI) 이다.

'Math' 카테고리의 다른 글

Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Equivalence relations (1)  (0) 2017.05.31
Homomorphisms (1)  (0) 2017.05.22
Automorphism and conjugation  (0) 2017.05.18
Isomorphism (2)  (0) 2017.05.17

Swift3 - result unused warning 없애기

Programming

+= 연산자를 재정의하여 쓰는데 "Result of operator '+=' is unused" 라는 warning이 발생하여 이걸 없애는 방법을 좀 찾아보았다. 결론부터 말하자면, @discardableResult 을 함수 앞에 붙여주면 해결된다.

GLKit 모듈에 붙어있는 GLKVector3에 곱셈과 +=, -= 등의 연산자가 없어서 아래와 같이 연산자 재정의를 해 보았다.

근데 막상 이걸 사용하려 했더니, 아래와 같이 warning이 떴다. 무시해도 괜찮긴 하지만 영 찜찜하다.

관련해서 찾아보니, Swift 2점대 에서는 '@warn_unused_result' 라는 지시자가 있어서 리턴값을 사용하지 않으면 컴파일러가 warning을 내뱉게 하고 있었다. 즉, 이전까지는 기본적으로는 리턴값을 쓰지 않아도 warning이 뜨지 않았다는 말이다. 그리고 Swift 3점대에 오면서 이게 바뀌어서 리턴값을 쓰지 않으면 컴파일러가 warning을 내뿜도록 하고 있다.

unused warning을 없애기 위한 방법은 두 가지가 있다.

  • @discardableResult 을 함수 앞에 붙여주거나,
  • 함수(연산자) 호출 단에서 리턴값을 밑줄(_)에 할당하는 표현식을 쓰는 것이다. 즉, _ = self.position += self.front * velocity 요렇게 쓰면 되겠지.

참고: https://useyourloaf.com/blog/swift-3-warning-of-unused-result/

'Programming' 카테고리의 다른 글

macOS에 emacs ggtags 설치 및 설정  (0) 2017.10.17
Xcode에 assimp 올리기  (0) 2017.06.06
OpenGL로 원 그리기  (1) 2017.05.27
Swift - 튜플에 포인터로 접근하기  (0) 2017.05.14
Unsigned Integer to String with Generics  (0) 2017.04.23

Homomorphisms (1)

Math

Homomorphism에 대하여 다루기에 앞서 아래에 위키피디아 한국어 페이지에서 인용된 내용을 살펴보자.

추상대수학에서, 준동형(準同型, 영어: homomorphism) 또는 준동형 사상(準同型寫像)은 두 구조 사이의, 모든 연산 및 관계를 보존하는 함수이다. 이들은 범주의 사상을 이룬다.

설명에서 Homomorphism이란 '준동형'이며 직감적으로 동형, 즉 Isomorphism에서 뭔가가 빠져 있는 것 같다는 느낌이 든다.

group GG'이 있을 때, Homomorphism이란 φ: GG' 매핑으로 아래의 룰을 만족한다.

φ(ab) = φ(a)φ(b)

여기서 a, bG 이다.

엇, 그런데 이건 Isomorphism의 정의랑 같다??? Homomorphism이 Isomorphism과 다른 점은 φ 매핑이 일대일 대응(bijective)하지 않아도 된다는 점이다.

아래의 매핑들은 모두 Homomorphism이다.

  1. the determinant function det: GLn(ℝ) → ℝ×
  2. the sign of a permutation sign: Sn → {±1}
  3. the map φ: ℤ+G defined by φ(n) = an, where a is a fixed element of G
  4. the inclustion map i: HG of a subgroup H into a group G, defined by i(x) = x

가장 단순한 예제인 두 번째 b의 경우, 매핑이 다대일 사상이기 때문에 Isomorphism은 아니다. 하지만 φ(ab) = φ(a)φ(b) 을 만족하기 때문에 Homomorphism이 된다.

Proposition. group간 Homomorphism인 φ: GG'은 identity를 identity로 사상하고, inverse를 inverse로 사상한다. 다시말해서, φ(1G) = 1G' 이며, φ(a-1) = φ(a)-1 이다.

Proof. 1 = 1 · 1 이고, φ가 homomorphism이기 때문에 φ(1) = φ(1 · 1) = φ(1)φ(1) 이다. 양 끝단 변의 φ(1)을 소거하면, 1 = φ(1) 이 된다. 그리고 φ(a-1)φ(a) = φ(a-1a) = φ(1) = 1 이고, 같은 방식으로 φ(a)φ(a-1) = 1 이다. 따라서 φ(a-1) = φ(a)-1 (양변에 φ(a)-1 을 곱함) 이다(끝).

'Math' 카테고리의 다른 글

Equivalence relations (1)  (0) 2017.05.31
Homomorphisms (2): image, kernel and normal subgroup  (0) 2017.05.24
Automorphism and conjugation  (0) 2017.05.18
Isomorphism (2)  (0) 2017.05.17
Isomorphisms (1)  (0) 2017.05.16