벡터는 컴퓨터 그래픽과 기하학에서 모두 중요한 내용입니다. 우선 벡터가 무엇인지 알아보도록 하겠습니다. 어떤 사람이 앞으로 걸어가고 있습니다. 그 사람의 위치는 시간이 지나면 변하게 됩니다. 이때 사람이 움직이는 방향이 바로 벡터입니다. 즉 벡터는 방향성분을 표현하는 단위입니다. 좀 더 정확히 설명하면 벡터는 크기방향을 가지는 성분이라고 할 수 있습니다. 

그렇다면 수학적으로 벡터를 어떻게 표현하는지 알아보도록 하겠습니다. 벡터는 V(x, y, z) 라고 표현할 수 있습니다. 3차원 공간에서는 x, y, z축 3가지가 있기 때문에 벡터를 V(x, y, z)로 표현하고 2차원 평면에서 벡터를 표현하면 V(x, y)가 됩니다. 

그리고 벡터의 크기는 Root(x^2 + y^2 + z^2) 로 표현할 수 있습니다. 뭐 여기까지는 고등교육을 이수한 사람이라면 쉽게 알 수 있는 내용이고 꼭 그렇지 않더라도 쉽게 이해가 가는 내용입니다.

이번 포스팅의 주제가 내적과 외적인데요. 각각 기하학적으로 어떤 의미가 있고 어떻게 활용되는지 알아보고 구하는 계산방법도 알아보도록 하겠습니다.

1. 내적 (Inner Product)

내적은 두 벡터의 곱이라고 생각할 수 있습니다. 그래서 Dot Product라고 부르고, 수학적으로 · 이란 기호를 사용합니다. 벡터 A와 벡터 B의 내적은 A · B 로 표현할 수 있습니다.  이를 좀 더 풀어서 표현하면 · B = |A| |B| Cosθ 로 표현이 가능합니다. 여기서 |A| 는 벡터 A의 크기이고 θ는 벡터 A, B 사이에 이루는 각도입니다.

여기서 |A|Cosθ는 벡터 B와 평행하고 벡터 A에서 벡터 B로 수직으로 그은 삼각형의 밑변이 됩니다. 따라서 여기에 |B|를 곱하면 내적이 되는 것입니다. 

일반적으로 벡터는 2차원이나 3차원에서만 해당되는 이야기가 아닙니다. 차원이 올라가서 n 차원이 되더라도 유클리드 공간에서는 성립하는 공식이 됩니다. 이제 공식과 같이 기억을 하고 있으면 좋은 것이 있는데요. 두 벡터가 수직일때 내적은 계산하나마나 0 이 된다 입니다. 그 이유는 Cosθ 가 θ 가 90인 경우 0이기 때문입니다. 

2. 외적 (Cross Product)

외적은 두 벡터의 수직인 벡터를 구하는 방법입니다. 기호로 x 를 사용하고 A x B 로 표현합니다. 일반적으로 외적 혹은 cross product라고 불리는데요. A x B 를 하면 두 벡터에 수직인 새로운 벡터 C가 나오기 때문에 수학적으로 표현하면 A x B = C 가 됩니다.

여기서 벡터 A의 성분을 A = V(u1, u2, u3) 라고 하고 벡터 B의 성분을 B = V(v1, v2, v3)라고 하면 아래와 같이 표현할 수 있습니다.

A x B = V(u1, u2, u3) x V(v1, v2, v3) = C ((u2 * v3) - (v1 * u2), (v1 * u3) - (u1 * v3), (u1 * v2) - (v1 & u2)) 가 됩니다. 

X 성분은  (u2 * v3) - (v1 * u2) 이고,

Y 성분은 (v1 * u3) - (u1 * v3) 이고,

Z 성분은 (u1 * v2) - (v1 & u2) 입니다.

기하학적으로 벡터 C의 크기는 벡터 A와 벡터 B로 만든 사각형의 넓이가 됩니다. 

 

 

기하학에서 평면은 매우 중요한 요소입니다. 점, 선, 면과 같이 각 차원에서 기본적인 요소가 되는 것들이죠. 이중에서 평면에 대해 이야기를 하도록 하겠습니다. 평면은 평평한 면으로 곡률이 없는 유클리드 평면입니다. 공간은 크게 유클리드 공간과 비유클리드 공간으로 나뉘는데요. 유클리드 공간은 곡률이 없는 공간입니다. 이는 수학자 유클리드가 연구하여 자신의 이름을 붙인 공간입니다. 이 공간에서는 5개의 공준이 성립하는 공간입니다. 여기서 5 공준이란

1. 서로 다른 두 점이 주어졌을 때, 그 두 점을 잇는 직선을 그을 수 있다.
2. 임의의 선분은 더 연장할 수 있다.
3. 서로 다른 두 점 A,B에 대해, 점 A를 중심으로 하고 선분 AB를 한 반지름으로 하는 원을 그릴 수 있다.
4. 모든 직각은 서로 같다.
5. 임의의 직선이 두 직선과 교차할 때, 교차되는 각의 내각의 합이 두 직각(180도)보다 작을 때, 두 직선을 계속 연장하면 두각의 합이 두 직각보다 작은 쪽에서 교차한다.

이 5 공준은 일반적으로 생각했을때 충분히 이해가 되는 공간입니다. 비유클리드 공간은 안으로 혹은 밖으로 휘어져있는 공간이기 때문에 일반적으로 상상하기 어렵습니다.

잠시 이야기가 산으로 갔지만, 지금부터 다룰 평면은 유클리드 공간에서 정의되는 평면이란 것을 기억해주세요. 우선 일반적인 3차원에서 평면의 방정식은 ax + bx + cz = d 로 정의할 수 있습니다. 여기서 (x, y, z)는 공간상에 점을 의미하는 것이고 a,b,c,d 는 해당 평면을 결정하는 숫자입니다. 여기서 x, y, z 는 미지수가 되기 때문에 점이 3개가 있다면 한 개의 평면을 정의할 수 있습니다.

평면을 구성하는 요소로 점과 방향벡터가 있는데요. 방향벡터는 평면에 수직한 벡터로 평면의 방향성을 알려주는 것입니다.   

3차원 좌표계에서 xy 평면을 기준으로 방향벡터는 v (0, 0, 1)가 됩니다. yz 평면을 기준으로 방향벡터는 v (1, 0, 0)가 됩니다. 위에서 이야기한 3개의 점을 이용하여 평면의 구성요소를 생성할 수 있습니다. 각 점을 P0, P1, P2라고 하면 P0는 평면의 원점이 되고 P0에서 P1을 향하는 벡터와 P0에서 P2를 향하는 벡터를 외적하여 평면에서 수직한 방향벡터를 구하게 됩니다.  이 수직한 벡터를 V(a,b,c) 라고 하고 P0를 (p0, p1, p2)라고 하면 평면의 방정식은

a(x - p0) + b(y - p1) + c(z - p2) = 0

으로 만들 수 있습니다. 이때 두 벡터를 외적할때 어떤 점을 원점으로 선택하냐에 따라 2가지 평면이 나오게 되는데요. 법선벡터의 방향이 반대가 될 수 있습니다. 

따라서 두 벡터를 외적을 할때 방향성을 원하는 방향으로 선택하여 평면을 생성해주셔야 합니다. 이는 컴퓨터 그래픽에서 면을 표현할때 두가지 면을 모두 표현하는 경우도 있지만, 한쪽 면만 표현하는 경우가 있기 때문에 중요한 것입니다.  이를 컴퓨터 그래픽에서는 Culling이라는 용어로 사용하는데요. 카메라의 시점을 기준으로 표현할 면을 선택하는 방법에 대한 원리를 기술하는 용어인데요.

왼쪽 해골의 경우 해골 안쪽면도 보이는 반면, 오른쪽 해골은 해골을 바깥면만 표현하게 됩니다. 만약에 속을 볼 수 없는 주사위와 같은 객체를 컴퓨터에서 표현하게 되면 안쪽면은 굳이 표현할 필요가 없기 때문에 메모리와 속도를 향상 시킬 수 있는 것입니다.

중국에서 우지한만큼 유명한 블록체인계의 인물이 있습니다. 바로 트론의 대표인 저스틴 선입니다. 2014년 중국 베이징에서 설립된 트론은 컨텐츠를 관리하는 시스템을 구현한 코인입니다. 초기 트론은 이더리움의 DApp으로 시작하였습니다. 이후 2018년 6월 메인넷을 통해 이더리움으로부터 분리되었습니다. 이후 트론은 엔터테인먼트 시스템을 지원하는 글로벌 방송 블록체인 플랫폼이 되기 위한 노력을 하고 있습니다. 현재 트론은 베이징과 센프란시스코에 본사를 두고 운용하고 있고, 300명의 직원을 두고 있는 코인이다.

 트론은 기존의 대표적인 엔터테인먼트 시스템인 구글, 페이스북, 유튜브와 같은 광고주와 사용자들 사이에 중개업을 하고 있는 플랫폼을 대신하여 중간 전달자가 없이 광고주와 사용자들 사이에 직접 거래하여 수수료를 절감시키는 시스템이 되는 것이 목표입니다. 

트론은 블록체인에 사용자들의 컨텐츠를 게시하거나 저장, 소유할 수 있고, 블록체인에 저장된 컨텐츠들은 트론 플랫폼을 사용하는 모든 사용자들에게 배포되어 이를 소비하게 됩니다. 이는 기존의 유튜브나 아프리카TV와 같은 플랫폼과 거의 비슷하다고 볼 수 있습니다. 이때 사용되는 코인이 트론 코인입니다. 이를 이용하여 다양한 컨텐츠를 구입하고 유통하는데 사용될 수 있습니다. 현재 트론은 중국에서 가장 큰 컨텐츠 어플인 페이워와 호환이 되어 사용되었습니다. 페이워는 오디오 중심의 컨텐츠를 전달하는 어플이기 때문에 향후 트론이 어떻게 사업을 진행할지 기대가 됩니다.

 트론 다른 코인과 다른 특징이 몇개 있습니다. 그 중 하나가 분권화입니다. 기존 블록체인 시스템을 운영하는데 노드는 매우 중요한 역할을 하는데요. 트론의 경우 모든 노드가 작동을 멈추는 일이 생기더라도 블록체인 시스템이 운영되는데 영향을 주지 않습니다. 그리고 각 노드들의 거래나 행동이 모두 투명하게 공개되기 때문에 모든 거래를 신뢰할 수 있습니다. 그리고 각 노드들은 동일한 데이터를 갖고 있기 때문에 조작이나 위조가 불가능합니다. 

이런 트론의 개념은 30살이 안된 저스틴 선의 머리에서 나왔습니다. 그는 포브스의 아시아 30세 이하 30인에 선정되어 중국에서 영향력있는 20대로 인정받고 있습니다. 또 비트토렌트를 인수하면서 트론의 세력을 키우고 있는데요. 이로인해 비트토렌트의 시드를 유지하는 보유자들에게 트론 코인이 보상으로 돌아가게 되었습니다.

트론은 탄생 초기부터 현재까지 일정한 방향성을 유지하고 개발하고 있는 코인입니다. 앞으로 트론이 분산형 컨텐츠 엔터테인먼트 플랫폼으로 블록체인계의 유튜브가 될 수 있을지 지켜보면서 트론의 성장에 큰 기대를 해봅니다. 과연 앞으로 우리가 블록체인에서 컨텐츠를 생산하고 판매하는 날이 올까요? 

 

블루투스는 전자 기기들 사이에 통신을 위해 만들어진 근거리 무선기술입니다. 여기서 전자 기기는 스마트폰, 이어폰, 스피커, 노트북, TV 등 모든 전자제품이 가능하고, 향후 IoT 기술이 보편화되면 대부분의 사물에 블루투스를 통한 통신이 가능해질 것으로 예상됩니다. 블루투스의 특징으로 전력을 적게 소모하고, 근거리에서 통신이 가능하고, 간섭을 최소화 할 수 있습니다. 

이런 블루투스 기술은 1994년 스웨던의 에릭슨이 최초로 개발을 시작하여 1999년 블루투스 SIG(Bluetooth Special Intersect Group)이라는 단체가 생겼습니다. 이후 다양한 개선을 통해 전송거리를 증가시키고, 음질이 향상되며, 전력소모를 감소시켜 지금의 블루투스 기술이 탄생하게 되었습니다.

블루투스 기술은 현재 블루투스 5.0 까지 기술이 발전했는데요. 블루투스가 본격적으로 사용되기 시작한 때는 스마트폰이 보급된 시점인 블루투스 2.0부 입니다. 그전까지는 기술을 개선시키며 전송 속도와 대용량 데이터를 전송하기 위한 노력을 하였습니다. 블루투스 1.0은 초기 버전의 블루투스이고 1.1 버전에서는 802.15.1 IEEE 표준으로 승인되었습니다. 이후 블루투스 1.2 버전까지 출시되었지만 시장의 반응은 뜨겁지 못했습니다.  

이후 블루투스 기술은 2004년 블루투스 2.0이 표준화되어, 전송 속도 3Mbps로 기존 1.0보다 속도를 향상 시키고, 안드로이드 OS를 사용한 스마트폰이나 태블릿, 노트북에 탑재되기 시작하였습니다. 이후 2.1 버전에서는 페어링이 쉽게 가능하게 하기 위한 기술인 SSP(Secure Simple Pairing)이 추가되었고 저전력 모드로 베터리를 적게 소모하는 기능이 추가 되었습니다.

블루투스 2 버전까지는 초기 도입기였다면 블루투스 3부터는 기술의 발전과 함께 대중적으로 보급되는 시기가 되었습니다. 802.11 PAL(Protocol Adaptation Layer)를 이용하여 기존 3Mbps였던 전송 속도가 24Mbps로 비약적으로 증가했으며, 베터리 관리를 위한 기술이 추가되어 블루투스를 탑재한 소형 제품에서도 베터리 사용 시간이 비약적으로 증가하게 되었습니다. 이로인해 블루투스 기기간에 대용량 그림이나, 동영상을 전송할 수 있게 되었고, 스마트폰에 있는 사진을 프린터로 출력하는 등 다양한 분야에 접목될 수 있는 가능성을 열어주는 시기가 되었습니다.

블루투스 4.0 시대로 접어 들면서 Bluetooth Low Energy 프로토콜이 포함되었습니다. 이로인해 기존 블루투스 3.0 버전과 비교하여 소비전력이 대폭 낮아져 버튼형 전지 1개로 수년동안 구동이 가능할 정도로 소비전력이 낮아졌습니다. 이로인해 많은 무선 이어폰들이 이때부터 등장하기 시작하였습니다. 블루투스 4.0에서 Low Energy 프로토콜을 채택하게 되면 전송속도와 전송거리에 불리한 점이 있긴 하지만 무선 이어폰의 특성상 Low Energy 프로토콜을 채택하는 것이 더 유리하기 때문이죠. 이후 블루투스 4.1, 4.2 버전이 출시가 되었고 4.1 버전에서는 블루투스와 LTE 무선이 간섭되는 현상을 줄여줘 모바일에 최적화된 연결성을 보여주게 됩니다. 이후 블루투스는 사물인터넷을 위하여 전송속도를 개선하고 기존 IP가 IPv4 에서 IPv6 로 변경되어도 블루투스 기기가 다른 제품와 연결이 가능하도록 기술을 발전시켰습니다. 또 보안을 더 강화하였습니다. 

현재는 블루투스 5.0이 2017년 출시되었습니다. 블루투스 5.0은 기존의 블루투스와는 확연하게 다른 특징을 보여주고 있고 대부분의 변화는 사물인터넷을 위한 변화라고 볼 수 있습니다. Bluetooth Low Energy 프로토콜을 채택하면서 생긴 느린 전송속도와 전송거리를 각각 2배, 4배 늘렸습니다. 또 기존의 블루투스 제품 사이에 버전이 맞지 않으면 저버전으로 다운그레이드 되어 전송됩니다. 

 

 

 

 

가상이나 추상 인터페이스 같은 키워드를 사용하여 클래스 구조를 잡다보면 너무 복잡해지고 다른 사람이 내가 만든 클래스를 사용하다보면 혼란을 가져오게 됩니다. 물론 클래스 설계가 잘 되어있고 해당 문서가 있다면 더 좋겠지만, 개발하면서 이런 문서까지 만든다는 것은 쉽지 않은게 사실입니다. 따라서 이런 문제를 조금이나마 해결하기 위해 사용하는 sealed class에 대해서 알아보도록 하겠습니다. 이전에 가상, 추상에 대한 포스팅과 인터페이스에 대한 포스팅은 아래 있으니까 참고하세요.

https://math-development-geometry.tistory.com/40

불러오는 중입니다...

https://math-development-geometry.tistory.com/39

 

C# - interface 인터페이스 사용법과 원리

인터페이스는 상속 받을 클래스에 기능이나 속성을 지정하는 역할을 합니다. 일반적인 상속관계와 비슷하다고 볼 수 있지만 살짝 다른 개념입니다. 우선 C#에서는 C++과 다르게 하나의 부모 클래스만 상속 받을 수..

math-development-geometry.tistory.com

sealed는 한국말로 "봉인된"이라는 뜻을 갖고 있죠. 즉 클래스를 봉인시키는 키워드인데요. 상속으로부터 봉인시키는 것입니다. 만약에 어떤 클래스에 sealed 키워드가 있다면 더 이상 상속이 불가능하다는 것을 표현하는 것입니다. 그리고 이 sealed는 클래스 뿐 아니라 속성이나 함수에서도 사용이 가능합니다. 클래스에 sealed가 없고 함수나 속성에 sealed가 있다면 해당 클래스를 상속 받은 클래스에서는 함수나 속성을 재정의 하는 것이 불가능합니다. 한번 코드를 통해서 알아보도록 하겠습니다. 

추상, 가상에 대한 포스팅해서 사용했던 예제인데요. 롤 캐릭터를 구현하는 방법을 예시로 만들었습니다.

추상 클래스로 BaseCharacter가 있고 저번 시간에 없었던 Hp와 Mp가 추가되었습니다. 이제 이 BaseCharacter를 상속 받아서 다양한 캐릭터를 구현해주었었죠. CharacterA에 대해서 코드를 보도록 하겠습니다.

이번 예제에서는 저번과 다르게 Attack과 Stop 함수에 sealed 라는 키워드가 추가된 것을 볼 수 있죠. 만약에 CharacterA를 상속받아 만든 다른 캐릭터의 경우 Attack과 Stop에 대한 기능은 재정의가 불가능하게 됩니다. 이런 식으로 한 클래스안에서도 다양하게 기능을 제한할 수 있기 때문에 여러 사람들이 함께 작업을 하는 경우 실수를 줄이고 처음 설계된 구조로 개발하는데 도움이 됩니다. 사실 제가 지금까지 개발을 하면서 sealed를 사용하는 사람들을 잘 못 봤는데요. sealed는 구조가 확실히 잡힌 프로젝트이거나 확실히 봉인 시켜줘야할 필요가 있다면 사용하는 것이 장기적으로 볼때 좋아요. 상속이 여러번 일어나면서 계층이 깊어지게 되면 나중에 코드를 구현하는 사람 입장에서는 어디까지 재정의를 해야하는지 파악하기 쉽지 않고, 불필요한 기능까지 구현을 하기 때문에 문제가 생길 수 있습니다. 따라서 구조를 잡는 입장에서 확실하게 sealed를 사용하는 습관을 가지면 좋을 것 같네요.

지난 포스팅 인터페이스에서 잠시 언급된 추상과 가상에 대한 이야기를 하도록 하겠습니다. 추상과 가상을 먼저 이야기 했으면 좋았겠지만, 제 포스팅은 그냥 의식의 흐름으로 적는 포스팅이기 때문에 순서가 엉망입니다. 우선 인터페이스에 대한 이야기가 궁금하시면 아래 포스팅을 참고해주세요.

https://math-development-geometry.tistory.com/39

 

C# - interface 인터페이스 사용법과 원리

인터페이스는 상속 받을 클래스에 기능이나 속성을 지정하는 역할을 합니다. 일반적인 상속관계와 비슷하다고 볼 수 있지만 살짝 다른 개념입니다. 우선 C#에서는 C++과 다르게 하나의 부모 클래스만 상속 받을 수..

math-development-geometry.tistory.com

우선 추상은 키워드 abstract를 사용합니다. 클래스나 함수, 속성, 인덱서 앞에 제한자로 사용이 가능합니다. 가상은 키워드 virtual을 사용하고 함수나 속성, 인덱서 앞에 사용할 수 있습니다. 여기서 abstract와 virtual은 대부분 비슷하게 사용되지만 차이점은 구현체의 존재 유무입니다. 

정리하면 abstract가 사용가능한 범위는 함수, 속성, 인덱서, 이벤트, 클래스

virtual은 함수, 속성, 인덱서, 이벤트에서 사용 가능합니다.

자, 이제 사용 범위에 대해서 알아봤는데요. 큰 차이점은 구현체의 유무라고 했는데요. 쉽게 이야기하면 abstract으로 선언된 것이 있는 경우 해당 위치에서 명시적으로 구현이 된 것이 아니고, 상속 받은 위치에서 구현을 하도록 맡기는 것입니다. 그리고 상속 받은 클래스에서는 abstract를 구현하지 않으면 에러가 나기 때문에 클래스를 구조화할 경우 해당 클래스를 상속 받아서 필수적으로 구현해야하는 것과 아닌 것을 나눌 수 있는데요. 여러명이 같은 프로젝트를 할때, 다른 사람의 의도를 정확히 알기 어렵기 때문에 이런 기능을 이용하면 해당 클래스를 상속 받아서 사용하는 프로그래머 입장에서는 따로 설명을 하지 않아도 이를 인지할 수 있게 됩니다. 이와 반대로 virtual은 상속 받은 클래스에서 따로 구현을 할 필요가 없습니다. 필요할 경우에만 구현을 하게 됩니다. 

그럼 예를 들어서 abstract와 virtual이 어떻게 사용되는지 알아보도록 하겠습니다. 이번에는 게임 캐릭터를 예로 들어보겠습니다. (제 머리 속에는 LoL 을 생각하고 글을 쓰고 있어요. )

일반적으로 A를 누르면 공격이고 S를 누르면 멈추는 기능이 있죠? 이런 공통적인 기능은 virtual로 구현하면 됩니다. 모든 캐릭터가 공격과 멈추는 기능은 같기 때문입니다. 하지만 QWER와 같은 스킬은 전부 다르죠. 그런 경우 abstract으로 구현합니다. 왜냐면 모든 케릭터는 QWER에 스킬 3개와 궁극기가 있기 때문이죠. 코드를 보면서 이야기를 정리해보도록 하겠습니다.

BaseCharacter라는 클래스는 이렇게 구현할 수 있겠습니다. 물론 Attack() 과 Stop() 은 virtual 이 아닌 일반 함수로 구현하여도 상관없지만, 기본 공격동작 외에 다른 동작을 추가하고 싶다면 각 캐릭터마다 필요한 동작을 추가하면 됩니다. 그리고 나머지 abstract으로 정의된 함수들은 실제로 BaseCharacter에서 구현하지 않고 이를 상속한 클래스에서 구현하게 됩니다. 

이런 식으로 Character A를 구현할 수 있습니다. override 된 함수에 각 캐릭터마다 특별한 스킬을 구현해주면 한개의 캐릭터가 완성되는 것이죠. 이번에는 Character B를 구현해볼께요. 이때 Attack()과 Stop() 함수를 override 해보도록 하겠습니다.

CharacterA에 비해서 CharacterB는 Attack()과 Stop()을 override 하여 새로운 기능을 추가해주었습니다. 그리고 base.Attack()과 base.Stop()함수는 상속 받은 클래스의 구현된 함수로 들어가기 때문에 기존에 구현한 기능은 그대로 수행하게 됩니다. 만약에 base 함수를 지우게 되면 파생 클래스에서 구현한 동작은 실행되지 않습니다. 만약에 기존의 Attack() 기능을 사용하지 않고 완전 새로운 기능을 추가하고 싶다면 base 함수를 삭제하여도 되는 것이죠.

+ Recent posts