본문 바로가기
Study/프로그래밍 수학

벡터의 내적과 외적

by 황금표정 2012. 2. 1.
1. 벡터와 스칼라

벡터 : 크기와 방향을 갖는 물리량.
스칼라 : 크기만 갖는 물리량.

2차원 좌표상에 점을 표시할때 일반적으로 x, y 두 개의 좌표를 가지고 화면의 점을 그린다 .
이때 수학적으로 점이란 눈에 안보이는것이지만 점을 구성하는 좌표 성분으로 P(x, y)라고 지정한다.
벡터란 원점을 기준으로 한 점이라고 생각하면 쉽게 설명할수 있을 것 이다.

V(x,y)를 표시할때 결국 (0,0) 에서 (x,y)의 방향을 가르키는 발이며 v(2,2) v(3,3)은 결국 크기만
다르지 같은 방향을 가르키고 있다. (그림, 1 참조)



(그림, 1)

2. 단위 벡터


영어로 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이 나와야 한다.



3. 벡터의 내적


벡터의 내적은 영어로 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

4. 벡터의 외적

벡터의 외적은 무엇일까요?
영어로 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;


반응형