벡터 : 크기와 방향을 갖는 물리량.
스칼라 : 크기만 갖는 물리량.
2차원 좌표상에 점을 표시할때 일반적으로 x, y 두 개의 좌표를 가지고 화면의 점을 그린다 .
이때 수학적으로 점이란 눈에 안보이는것이지만 점을 구성하는 좌표 성분으로 P(x, y)라고 지정한다.
벡터란 원점을 기준으로 한 점이라고 생각하면 쉽게 설명할수 있을 것 이다.
V(x,y)를 표시할때 결국 (0,0) 에서 (x,y)의 방향을 가르키는 발이며 v(2,2) v(3,3)은 결국 크기만
다르지 같은 방향을 가르키고 있다. (그림, 1 참조)
(그림, 1)
영어로 Normalize라고 한다.
단위 벡터란 크기가 1인 벡터를 얘기한다.
0 ~ 1 까지의 실수는 아무리 곱해도 절대로 1을 넘지 않는다.
이 특성이 단위 벡터에서도 나타난다. 단위 벡터끼리 곱하는 연산은 10000만번 하더라도 단위 벡터이다.
사실위의 애기는 아주 중요한 얘기이며, 이 간단한 사실만으로 연산을 아주 간소화 할 수 있다.
앞에서 v(1, 1)와 v(2, 2)는 크기가 다르지만 방향을 같다고 했다.
두 벡터를 크기는 무시하구 오직 방향을 같다고 했다.
두 벡터를 크기는 무시하구 오직 방향만 계산하고 싶다고 했을때 단위 벡터를 만든다.
어짜피 단위 벡터의 크기는 1이니까.
벡터 v(x, y)가 있을때 벡터의 크기는 sqrt(x*x + y*y)이다.
v = sqrt(x*x + y*y);
vx /= v;
vy /= v;
이때 벡터의 크기를 구해보자
크기 = sqrt(x*x + y*y)는 1이 나와야 한다.
벡터의 내적은 영어로 DotProduct 혹은 inner-Product, Scala-Product 라고 한다.
벡터의 내적 공식은 두 벡터가 있을때 두 벡터 사이의 각도를 구하는 공식이다.
여기서 theta는 각도를 의미한다.
cos(theta) = a · b 로 간략화 한다면
a · b벡터의 연산은 성분끼리 곱하면 됩니다.
theta = (a_x * b_x) + (a_y * b_y);
예)
float v; ///< 먼저 두 벡터를 단위 벡터로 만든다. v = sqrt(Vector1.x*Vector1.x + Vector1.y*Vector1.y + Vector1.z*Vector1.z); Vector1.x /= v; Vector1.y /= v; Vector1.z /= v; v = sqrt(Vector2.x*Vector2.x + Vector2.y*Vector2.y + Vector2.z*Vector2.z); Vector2.x /= v; Vector2.y /= v; Vector2.z /= v; ///< 내적하기 float theta; float degree; theta = Vector1.x*Vector2.x + Vector1.y*Vector2.y + Vector1.z*Vector2.z; theta = acos(theta); degree = theta * (180 / 3.141592);
벡터를 내적하게되면 cos(theta)가 나오게된다.
그래서 theta만 뽑아내기위해서 acos을 해주게된다.
(참고) 라디안 값
일반적으로 sin, cos, tan 함수에서 sin(theta) = rad일때
theta = asin(rad) 이렇게 역함수가 존재 합니다.
그리고 각도를 얘기 할때 0~360도 얘기하는것은 Degrees값이라고 하며
수학에서는 보통 Radian값을 사용합니다.
180 : 3.14 = degree : rad
각도 -> 라디안 변환방법
rad = degree * 3.14 / 180
라디안 -> 각도 변환방법
degree = rad * 180 / 3.14
벡터의 외적은 무엇일까요?
영어로 CrossProduct 라고 하지요
벡터사이의 각이 아닌 반대 방향 각을 구하는 공식일까요? 아닙니다.
벡터의 내적과는 성격이 좀 다릅니다.
벡터의 내적은 결국 라디안 실수 값이 나오지만 외적을 구하는 공식은 그냥 벡터가 하나 더 생깁니다.
두 개의 벡터가 있을 기준점에 수직으로 못을 하나 꽂으면 못방향으로 벡터가 하나 생깁니다.
두 벡터에 수직인 벡터 가 하나 더 생기는 셈이지요 v1(x,y,z) v2(x,y,z)가 있을 (0, 0, 0)을 출발점으로 한 위로 우뚝선
벡터 n(x, y, z)가 하나 더 생긴단 말이지요.
두 벡터에 수직인 벡터는 사실 두 개 있습니다. 위, 아래입니다.
보통 시계 방향이냐, 반시케 방향이냐 따라서 한 가지만 뽑아 냅니다.
다음은 외적을 구하는 연산입니다.
float n_x, n_y, n_z; n_x = Vector1.y * Vector2.z - Vector1.z * Vector2.y; n_y = Vector1.z * Vector2.x - Vector1.x * Vector2.z; n_z = Vector1.x * Vector2.y - Vector1.y * Vector2.x;
[출처] 백터 내적과 외적에 대해서 누가쓰거 발췌|작성자 차윤석
'Study > 프로그래밍 수학' 카테고리의 다른 글
라디안 (호도법에 의한 각도의 단위) (0) | 2012.06.10 |
---|---|
(기본) 삼각함수 (0) | 2012.06.10 |
DirectX 3D - 전치행렬, 정방행렬, 역행렬, 가우스소거법, 아핀변환 - (0) | 2012.02.08 |
벡터의 내적(dot-product) (0) | 2012.02.01 |