벡터

반응형
참고 : 2005.02.21.noerror.벡터와행렬 kasa study에서 noerror님이 발표하신 내용.

vector_and_matrix.pdf



원래 웹상에서 내적관련 검색하다가 나온 스터디 자료인데 아주 오래전 것인듯..무려 7년전이다~!!!.
별생각 없이 보다가 4번째 장에 벡터 의미 라는 제목으로 space : direction, postion 이라는 단락이 있는데
이게 아무리 생각해 봐도 이해가 안되더라능...

이게 무슨 말일까....
벡터는 그냥 크기와 방향인데....위치?? 위치는 점이 가지는 특성이고....
벡터 의미에 방향은 왜 들어가 있는 거지? 하면서 vector space에 그러한 문구가 있었던가?
생각하다 보니 그냥 처음부터 천천히 정리해보자는 심정으로 다시 정리중.....
2005년도에도 참여해서 스터디 들었으면 좋았을 텐데.ㅜㅜ. 슬프군...


카테시안 좌표계(cartesian coordinates)
http://chanmi101.blog.me/120123706418
 

2차원 카테시안 좌표계 (x,y)
 

2차원 극 좌표계 (r,θ )
x = rcosθ y = rsinθ

 



왼손 좌표계와 오른손 좌표계 개념에 대한 혼재가 나타나는 이유는?
http://dwha.blogspot.com/2009/05/%EC%99%BC%EC%86%90-vs-%EC%98%A4%EB%A5%B8%EC%86%90-%EC%A2%8C%ED%91%9C%EA%B3%84-%ED%96%89%EC%9A%B0%EC%84%A0-vs-%EC%97%B4%EC%9A%B0%EC%84%A0-%ED%91%9C%ED%98%84%EB%B2%95.html

위 링크를 보면 조심스레 두가지 추측을 하는데 묘하게 설득력 있다.
두가지 추측 내용은 아래와 같다.
1. 왼손 좌표계를 쓰는 사람과 오른손 좌표계를 쓰는 사람들이 서로 다른 좌표계를 쓰는 것에 대한
   타당한(합당한) 이유를 찾고자 하기 때문.
2. 행우선과 열우선 방식이 왼손이나 오른손 좌표계와 연관이 있다고 오해 하는 것.
   즉 왼손좌표계를 따르는 DirectX오른손 좌표계를 따르는 OpenGl이 각각 

   행우선(vector * matrix)열우선(matrix * vector) 방식 이라서 이러한 오해가 일어났을 듯 하다.

벡터의 의미는?
1. 좋은 게임을 만드는 핵심 원리 : 크기와 방향을 나타내는 수학적인 도구.
2. dx9 셰이더 프로그래밍 : 방향과 크기를 가지는 것.       
3. 해골책 : 가속도나 속도처럼 크기와 방향을 동시에 표현해야만 정확히 표현할 수 있는 수치.  
4. 게임&인터랙티브 애플리케이션을 위한 수학 : 기하학적인 벡터 v는 크기(또는 길이)와 방향을 가지는 요소이고
                                                 그래픽적으로 끝이 화살표인 선분으로 표현된다.

결론
벡터를 표현하는데 있어 핵심적인 단어는 크기와 방향이다. 
여기서 방향을 뺀, 크기만을 나타내는 것을 스칼라 라고 한다. (ex : 음료수의 양, 생수통 500ml 등)

벡터공간은 머냐?
우선 벡터공간을 왜 알아야 할까?
벡터의 개념들을 캡슐화할 수 있는 형식적인 수단을 제공하고 벡터를 기호로 표현할 수 있도록 해준다.
기본 성분들이 실수집합의 원소이기 때문에 실벡터 공간이라고 불리는 벡터공간의 부분집합에 대해서 살펴보자.
일반적으로 이러한 경우 V가 R위에 존재한다고 말하고 이 경우에 R의 원소는 스칼라라고 한다.
실수란 0, 모든 정수 집합 Z, 모든 유리수의 집합(분수),  그리고 π 와 e 같이 분수로 표현할수 없는 무리수를 포함한다.
실벡터 공간의 예를 들어 보자.
1. 단순한 실수 집합 R.
2. 실수의 모든 순서쌍의 집합 R2.
    이를 수식으로 나타내면 R2 = {(x,y) | x,y ∈ R) 
    수식을 풀어 말하면 "모든 가능한 순서쌍 (x,y)의 집합이 있고 x,y는 실수집합의 원소이다".
3. R3도 위와 마찬가지 이다.
    수식으로 적으면 R3 = {(x,y,z) | x,y,z ∈ R) 
4. R4를 수식으로 적으면 R4 = {(x,y,z,w) | x,y,z,w ∈ R) 

결국은 Rn = {(x0, x1, ..., xn-1) | x0, x1, ..., xn-1 ∈ R}

위의 1~4까지의 예를 보면 이것들이 적합한 벡터공간일 수도 있고 단순한 숫자들의 열거일 수도 있다.
그래서 대수학적인 법칙을 따르는 두가지 연산자를 정의해야 하며 이는 벡터의 덧셈과 스칼라 곱셈이다.
1. V안에 임의의 u, 그리고 v에 대해서 u+v가 V안에 있다.
2. 실수집합 R 안에 a, 그리고 V안에 v에 대해서 av가 V안에 있다.

닫혀있다의 의미
http://mgun.tistory.com/1143

결론 
덧셈과 스칼라 곱셈 각각의 연산에 대해 닫혀있고 다음과 같은 성질을 만족하는 실수집합 R 위에 존재하는 집합 V.
V안의 모든 u,v,w,0 그리고 R안의 모든 a,b에 대해서 살펴 보면.
1. v + w = w + v     교환법칙
2. u + (v + w) = (u + v) + w      결합법칙
3. v + 0 = v 식을 만족시키는 원소 0이 존재    덧셈의 항등원
4. 모든 v에 대해서 v + (-v) = 0의 식을 만족시키는 -v원소가 존재      덧셈의 역원
5. (ab)v = a(bv)      결합법칙
6. (a + b)v = av + bv      분배법칙
7. a(v + w) = av + aw      분배법칙
8. 1 * v = v     곱셈의 항등원

부동 소수점
http://winapi.co.kr/clec/cpp2/18-1-4.htm

항등원과 역원에 대한 이야기
http://blog.naver.com/at3650/40118590797
항등원 : 자기자신이 나오게 하는 수
역원 : 항등원값이 나오게 하는 수

벡터 공간
http://srkhs123.egloos.com/184436

실벡터 공간, 표준 좌표계, 기저벡터, 선형결합, 선형독립적, 선형종속적
http://glog.springnote.com/pages/9437380?print=1
선형 결합 : S={v0,...vn-1}인 n개의 벡터들의 집합 s.
                a0,...an-1이 임의의 실수일 때 새로운 벡터 v를 생성하기 위해 벡터들을 결합.
                v = a0v0 + a1v1 + ... + an-1vn-1.
생성 : 선형 결합에 의해 생성되는 벡터들의 집합 T는 S의 생성. 집합 S가 T를 생성한다.
선형 종속적 : S안에 하나의 벡터 vi가 다른 원소들의 선형 결합과 동일하다 가정하고 vi가 존재한다.
                   vi = a0v0 + a1v1 + ... + an-1vn-1.
선형 독립적 : vi가 존재하지 않는다면 벡터들 v0,...,vn-1은 선형 독립적.
기저 벡터 : 주어진 벡터공간 V에서 V를 생성하는 V안의 n개의 선형 독립 벡터의 집합 β를 찾을 수 있다고 가정하자. 
                β를V의 기저라고 하고 β의각 원소들을 기저 벡터라고 한다.
차원 : 일반적으로 벡터공간의 차원은 그 공간을 생성하는 데 필요한 기저 벡터들의 숫자와 동일하다고 정의.

"게임&인터랙티브 어플리케이션을 위한 수학"의 벡터, 벡터공간에 대한 내용을
처음 읽었을 때는 "무슨 개솔" 하다가 두번쨰 읽었을때는 "그럴듯 한데?" 였다가
세번째 읽었을 때는 "흐음 그렇군" 이었는데 네번째 읽었더니~!!!! "그냥 외워졌다.ㅡㅡ; "....시밤..
나처럼 머리가 잘 안돌아간다면 그냥 외우는 것도 맘편할 듯...헐헐...젠장.

벡터공간에서 기저와 차원이 의미하는 것.
http://mgun.tistory.com/4
http://blog.naver.com/hellow1002/68274995

기저 벡터
http://www.gpgstudy.com/forum/viewtopic.php?t=2728
http://klaizard.tistory.com/entry/%EA%B8%B0%EC%A0%80-%EB%B2%A1%ED%84%B0basis-vector
http://hoholife.egloos.com/1379622

그렇다면 이런 벡터공간, 기저벡터, 선형 독립적, 차원 등의 것들을 왜 알아야 하는가?
그것은 수학적 또는 기하학적 벡터를 대수적으로 표현하기 위한 문제를 해결하기 위해서 이다.
벡터공간을 정의함으로써 벡터를 기호로 표시할 수 있고 이는 컴퓨터에 단위로 저장해서 계산하는데 도움이 된다.

affine space은 원점이 어딘지 모르는 벡터공간이다
http://spaurh.egloos.com/4019460

affine space에 관한 강좌 (수학 공부하시는 분인듯. 쉽게 잘 설명해줌)
http://www.youtube.com/watch?v=w_jOKawgNuA&feature=player_embedded    (유튜브 링크)

벡터가 위치를 다루지 않기 때문에 점을 벡터공간에 추가하여 위치를 표시.
점과 벡터의 덧셈이 가능해지므로 affine space에서는 점과 벡터의 덧셈에 의해 어떤 점을 표기할 수 있다.
http://blog.naver.com/laster40/94418794

affine transformation : 한 벡터 공간을 다른 벡터공간으로 대응시키는 변환.
http://ko.wikipedia.org/wiki/%EC%95%84%ED%95%80%EB%B3%80%ED%99%98

서울대 이구철 명예교수님의 Affine 변환 강좌.
http://phya.snu.ac.kr/~kclee/lects/lect11/lect11.htm
http://phya.snu.ac.kr/~kclee/lects/lect12/lect12.htm

affine translation
http://mathya.com.ne.kr/lecture_flash/the%20advanced%20course%20of%20flash/advanced%20I%20lecture/lecture_8/lecture8-affine%20translation-.htm


affine matrix
http://kant0105.egloos.com/4179216

벡터 합 :
u = v + w 를 그리고자 한다면 v의 시작(꼬리부분)과 w의 화살표부분(머리부분)을 연결하면 된다.

벡터 빼기 :
u = v - w 를 그리고자 한다면 w(두번쨰 벡터)의 머리에서 v(첫번째 벡터)의 머리로 연결하면 된다.

벡터 길이 :
벡터의 크기, |V|으로 표시, Norm이라고도 하며 피타고라스의 정의를 이용하여 얻을 수 있다.
Length = sqrt(x*x + y*y + z*z);

단위 벡터 :
방향만을 나타내는 벡터로 벡터의 성질인 크기와 방향에서 크기를 1로 하는 벡터이다.
정규화(normalize)라고 하며 벡터를 자신의 크기로 나누어 줌으로써 얻을 수 있다.
vector(x/Length, y/Length, z/Length);

벡터의 내적의 의미는?
내적의 결과값이 스칼라이므로 스칼라곱(scalar product) 또는 점곱(dot product)라고 불린다.
벡터의 방향 관계를 얻는 도구로 사용된다.
벡터의 내적공식 ->   AB=AxBx + AyBy
수학적 정의 ->         A∙B= |A| |B| cosθ

 

 

벡터 B의 크기에 cosθ를 곱하면
밑변의 길이가 나온다.
 

벡터 A의 크기에 cosθ를 곱하면
직각삼각형의 밑변이 나온다.


두번째 그림으로 내적인 |A| |B| cosθ을 설명하면  벡터A에 투영된 B의 길이에 A의 길이를 곱한 스칼라값이라고 할 수 있다.
세번째 그림으로 보면 벡터 B에 투영된 A의 길이를 곱한 스칼라 값이라고도 할 수 있다.

세번째 그림을 기준으로 B벡터에 투영된 A벡터를 구해보자.
A∙B= |A||B| cosθ 이므로 cosθ = (A∙B) / (|A||B|) 이렇게 된다.
그러므로  |A|cosθ = |A| * ( (A∙B) / (|A||B|) ) 요렇게 표현가능 하며 분모분자 정리로 |A|를 날리면
|A|cosθ =(A∙B) / |B| 이렇게 된다.
이 값은 A를 B에 투영한 크기라 하며 B방향의 단위 벡터를 곱해주면 B에 투영한 A의 분해벡터를 구할 수 있다.
B방향의 단위벡터는 Bunit = B / |B| 로 표시하며
A투영B = |A|cosθBunit =  ( (A∙B) / |B| )  *  (B / |B|) 가 되며 이를 좀 정리해주면
A투영B = |A|cosθBunit =  ( (A∙B) / |B| )  *  (B / |B|) = (A∙B / |B|2 )*B 이 된다.
또는 A∙A는 같은 벡터를 내적하는 것이므로 θ는 0이 되고 결국 cosθ는 1이므로
A∙A = |A||A|cosθ = |A||A|*1의 성질을 이용해 위의 식을 한번 더 정리하면
A투영B = |A|cosθBunit =  ( (A∙B) / |B| )  *  (B / |B|) = (A∙B / (B∙B)  )*B 이 된다.

다시 세번째 그림에서 B벡터와 A벡터를 점선으로 잇는 벡터를 구해보자.
위에서 언급했던 벡터의 뺼셈을 생각해 보자.
"벡터 빼기는 u = v - w 를 그리고자 한다면 w(두번쨰 벡터)의 머리에서 v(첫번째 벡터)의 머리로 연결하면 된다"
라고 위에서 언급하였다.
즉, 세번째 그림을 기준으로 한다면

여기서 두번쨰 벡터의 머리는 |A|cosθ가 되고 첫번쨰 벡터의 머리는 A가 되므로

u = v - w = A - |A|cosθ 이 되고 이 식에서 A투영값은 위의 빨간글씨대로 치환하면
A - |A|cosθ = A - (A∙B / (B∙B)  )*B 이 된다.


AB = 0이면 A⊥B          A와 B의 내적이 0이면 A와 B는 직교한다.
AB < 0이면 θ>90°        A와 B의 내적이 0보다 작으면 두 벡터가 이루는 각도는 90도 보다 크다
AB > 0이면 θ<90°        A와 B의 내적이 0보다 크다면 두 벡터가 이루는 각도는 90도 보다 자다

이 정의는 cos(x)로 얻어지는 것과 관련이 있다.
아래 원 그림을 보자.

 

 


BA를 보면 B랑 A는 90도 이고 삼각함수에서 cos90°은 0이다.
공식상(|A| |B| cosθ) 벡터 A와 벡터 B의 크기를 곱하더라도 cos90°가 0이기 때문에 결과값은 스칼라 0이 된다.
DA는 90도 이하이므로 0보다 큰 양수가 되고 CA는 90도 이상이지만 90°~180° 값이며 이 cos 값은 음수이다.
그래서 벡터의 크기인 양수와 곱하더라도 0보다 작은 음수의 값이 나오게 된다.
결론적으로 |A|와 |B|는 항상 양수이므로 cosθ에 의해 부호가 결정된다.

내적의 활용?
내적의 활용은 사실 공식 자체에 이미 나와있다.

짜잔~!. 각도를 구할수있다..빠밤...
내적은 한 벡터에 다른 벡터의 투영을 계산할 수 있기 때문에 사용되는 곳이 많다.
ex) 가시성 판단 : 삼각평면에 수직한 벡터와 카메라의 방향 벡터간의 내적으로 그 삼각평면이 보일지 결정.

구현 예)
float Vector::Dot(const Vector& other)
{
   return (x*other.x + y*other.y + z*other.z);
}

벡터 외적의 의미는?
내적도 했으니 당연히 외적도 해야 겠지?
벡터의 곱셈에는 두가지 방법이 있는데 하나는 위에서 소개한 결과값이 스칼라가 되는 내적이고
하나는 결과값이 벡터가 되는 외적이다.
벡터의 내적이 두 벡터간의 사잇각 관계를 나타낸다면 외적은 두 벡터에 모두 수직인 벡터를 결과로 얻는다.

벡터의 외적 공식 : A×B= a2b3−a3b2 , a3b1−a1b3 ,(a1b2−a2b1)
수학적 정의 : AxB = (|A||B|sinθ)E
여기서 E는 AxB방향의 단위벡터
외적의 결과 벡터의 방향은 오른손의 법칙을 사용하는데 외적은 교환법칙이 성립하지 않으므로
A와B의 순서에 신경을 써 줘야 한다.

그렇다면 외적은 어디에서 많이 사용되는가?
표면의 법선을 만들때 많이 사용된다.

위 그림을 보면 평면위의 세점에서 두벡터를 만들고 그 두벡터를 직교하는 법선벡터를 만들 수 있는데
외적의 수학적 의미 중 하나는 외적으로 나온 벡터의 크기는 두 벡터로 만들어진 평행사변형의 면적이라는 것이다.


외적의 구현 예)
Vector::Cross(const Vector& u, const Vector& v)
{
  x = u.y*v.z -u.z*v.y;
  y = u.z*v.x -u.x*v.z;
  z = u.x*v.y -u.y*v.x;
}

이렇게 해서 얼추 벡터에 대한 정리가 끝났다...
아..힘들었어..ㅜㅜ..

결론은... 처음 벡터 관련 정리 동기를 부여한 의문점은 안풀렸다는 거.ㅜㅜ..


Reference Link

- 포프TV, 왼손/오른손 좌표

- Max좌표계를 OpenGL에 사용하기

-




'Study > M's Lecture' 카테고리의 다른 글

3. 왜 물은 물처럼 보이는 걸까?  (0) 2013.01.17
2. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
1. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
감마 보정 (gamma correction)  (0) 2012.02.27
가우스 필터  (0) 2012.01.31
TAGS.

Comments