-
Lecture 2 - Vector2D ClassDSP/Lecture 2024. 4. 23. 09:11
벡터 클래스 (Vector2D)
개요
- Vector2D 클래스는 2차원 벡터를 표현합니다. 이 클래스는 벡터와 관련된 기본 연산을 수행하고 벡터의 상태를 관리합니다.
주요 멤버 함수 및 연산자
- 생성자 (Vector2D(float aX = 1.0f, float aY = 0.0f) noexcept): 초기 x 및 y 값을 가지고 벡터 객체를 생성합니다. 기본값은 (1.0, 0.0) 입니다.
- x(): 벡터의 x 좌표를 반환합니다.
- y(): 벡터의 y 좌표를 반환합니다.
- operator+ (Vector2D operator+(const Vector2D& aOther) const noexcept): 두 벡터를 더하는 연산자입니다.
- operator- (Vector2D operator-(const Vector2D& aOther) const noexcept): 두 벡터를 빼는 연산자입니다.
- operator* (Vector2D operator*(const float aScalar) const noexcept): 벡터에 스칼라 값을 곱합니다.
- dot (float dot(const Vector2D& aOther) const noexcept): 두 벡터의 내적을 계산합니다.
- cross (float cross(const Vector2D& aOther) const noexcept): 두 벡터의 외적을 계산합니다 (2차원에서는 스칼라 값을 반환).
- length (float length() const noexcept): 벡터의 길이 (또는 크기)를 계산합니다.
- normalize (Vector2D normalize() const noexcept): 벡터를 정규화합니다 (길이가 1인 단위 벡터를 반환).
- direction (float direction() const noexcept): 벡터의 방향 (각도)를 계산합니다.
- align (Vector2D align(float aAngleInDegrees) const noexcept): 벡터를 특정 각도로 정렬합니다.
입출력 지원
- 이 클래스는 C++의 입출력 스트림을 사용하여 벡터 데이터를 읽고 쓸 수 있도록 지원합니다. 친구 함수(friend)를 통해 std::istream과 std::ostream에 대한 접근을 허용합니다.
벡터 (Vector) 이해하기
컴퓨터 과학과 프로그래밍에서 벡터는 사전에 정의된 함수가 아닌 수학적 벡터를 나타내는 데이터 구조 또는 객체 유형입니다. 2차원 공간에서 벡터는 x좌표와 y좌표 두 가지 구성 요소를 가지고 있습니다. 이 좌표들은 2차원 공간에서의 방향과 크기(길이)를 설명합니다.
PDF에서 설명된 Vector2D 클래스는 2차원 벡터의 기능을 캡슐화한 사용자 정의 클래스로, 벡터를 조작하고 작업하는 메소드를 제공합니다. 이 클래스는 C++ 또는 어떠한 윈도 시스템의 사전 만들어진 함수가 아니라, 프로그램의 특정 요구에 맞게 조정할 수 있는 사용자 정의 타입입니다. 예를 들어, 기하학적 변환 처리, 물리 계산 또는 2D 공간 조작이 필요한 다른 상황에 유용합니다.
벡터의 기본 개념
- 방향(Direction): 벡터는 특정 방향을 가리키며, 이는 화살표가 가리키는 방향과 같습니다. 예를 들어, "동쪽으로 5미터"라고 할 때 '동쪽'이 방향이 됩니다.
- 크기(Magnitude) 또는 길이(Length): 벡터의 크기는 화살표의 길이로, 얼마나 멀리 뻗어 있는지를 나타냅니다. "5미터"라는 부분이 벡터의 크기를 말해 줍니다. 크기는 항상 양수이거나 0입니다.
2차원 벡터
Vector2D와 같은 2차원 벡터는 두 축, 보통 x축과 y축을 사용하여 표현됩니다. 이를 통해 평면상의 어떤 점을 가리키거나, 평면 상에서의 움직임을 설명할 수 있습니다. 예를 들어, 벡터 (3, 4)는 x축으로 3의 단위만큼, y축으로 4의 단위만큼 움직이라는 의미입니다. 이 벡터의 길이는 피타고라스 정리를 사용하여 계산할 수 있으며, √(3² + 4²) = 5가 됩니다.
벡터의 연산
벡터는 다양한 수학적 연산을 통해 다룰 수 있습니다:
- 덧셈과 뺄셈: 두 벡터를 더하면 각각의 x성분과 y성분을 더한 새로운 벡터가 생성됩니다. 뺄셈도 비슷하게 각 성분을 빼서 계산합니다.
- 스칼라 곱셈: 벡터에 스칼라(숫자)를 곱하면 벡터의 방향은 유지하되 길이가 스칼라만큼 조절됩니다.
- 내적(Dot Product): 두 벡터의 내적은 각 성분의 곱을 모두 더한 것으로, 두 벡터 사이의 각도 정보를 추출하거나 투영된 길이를 계산하는 데 사용됩니다.
- 정규화(Normalization): 벡터의 길이를 1로 만드는 과정으로, 방향은 유지하면서 길이만 조정합니다.
1. 스칼라 곱셈 (Scalar Multiplication)
스칼라는 단순한 숫자를 의미하며, 스칼라 곱셈은 벡터의 각 성분을 스칼라 값으로 곱하는 연산입니다. 이 연산은 벡터의 길이를 변경하지만 방향은 유지합니다. 예를 들어, 벡터 (3, 4)에 스칼라 2를 곱하면, 결과는 (6, 8)이 됩니다. 길이는 원래의 2배가 되지만, 방향은 동일하게 유지됩니다. 스칼라를 곱하는 것은 벡터를 확장하거나 축소하는 효과가 있습니다.
2. 내적 (Dot Product)
내적은 두 벡터 간의 연산으로, 결과는 스칼라 값입니다. 내적은 다음과 같이 계산됩니다:
벡터 A=(𝑎1,𝑎2),벡터 B=(𝑏1,𝑏2)내적=𝑎1×𝑏1+𝑎2×𝑏2내적의 결과는 두 벡터 간의 각도 정보를 포함하고 있습니다. 만약 내적이 양수이면 두 벡터는 뾰족한 각도를 이루고 있으며, 0이면 두 벡터는 직각을 이루고, 음수이면 두 벡터는 둔각을 이룹니다. 내적은 물리학에서 힘의 투영, 컴퓨터 그래픽에서는 빛의 강도 계산 등에 사용됩니다.
3. 정규화 (Normalization)
정규화는 벡터의 길이를 1로 만드는 과정으로, 벡터의 방향만을 유지하게 됩니다. 이는 단위 벡터(unit vector)라고 불리며, 다양한 계산에서 방향은 중요하지만 크기는 중요하지 않을 때 유용하게 사용됩니다. 벡터 (a, b)를 정규화하는 공식은 다음과 같습니다:
정규화된 벡터=(𝑎𝑎2+𝑏2,𝑏𝑎2+𝑏2)여기서 𝑎2+𝑏2는 벡터의 길이입니다. 정규화를 통해 얻은 벡터는 길이가 1이고, 원래 벡터와 같은 방향을 가집니다.
Vector2D 클래스의 역할
Vector2D 클래스가 실제로 할 수 있는 몇 가지 실용적인 사용 예와 기능을 좀 더 상황에 맞게 설명해 보겠습니다:
- 연산:
- 덧셈 및 뺄셈: 두 벡터를 더하거나 빼는 연산을 할 수 있습니다. 이는 게임이나 시뮬레이션에서 위치를 계산하거나 위치 변경을 계산하는 데 유용합니다.
- 스칼라 곱셈: 벡터를 숫자(스칼라)와 곱하는 것은 벡터의 크기를 방향을 변경하지 않고 조절합니다. 이는 객체의 속도를 변경하거나 그래픽 요소의 크기를 조절할 때 유용합니다.
- 내적 및 외적:
- 내적: 두 벡터 사이의 각도를 결정하거나 한 벡터를 다른 벡터에 투영하는 것을 계산합니다. 물리학에서 힘을 계산하거나 그래픽에서 조명 계산을 할 때 필수적입니다.
- 외적: 2D에서 외적은 두 벡터의 방향성(어느 벡터가 다른 벡터의 왼쪽 또는 오른쪽에 있는지)을 결정하는 데 사용됩니다.
- 크기 및 정규화:
- 크기(길이): 벡터의 길이를 계산합니다. 게임이나 물리학에서 객체의 속도나 에너지를 계산하는 데 도움이 됩니다.
- 정규화: 벡터를 단위 벡터(길이가 1인 벡터)로 변환합니다. 이는 방향 계산을 할 때 크기의 영향을 받지 않도록 합니다.
- 방향 및 정렬:
- 방향: 벡터의 각도를 기준에 비해 계산합니다. 시뮬레이션 또는 애니메이션에서 조종 행동을 할 때 사용됩니다.
- 정렬: 벡터를 특정 각도로 회전시킵니다. 이는 객체나 카메라 뷰를 정렬하는 데 유용합니다.
class Vector2D { private: float fX; float fY; public: Vector2D(float aX = 1.0f, float aY = 0.0f) noexcept; float x() const noexcept { return fX; } float y() const noexcept { return fY; } Vector2D operator+(const Vector2D& aOther) const noexcept; Vector2D operator-(const Vector2D& aOther) const noexcept; Vector2D operator*(const float aScalar) const noexcept; float dot(const Vector2D& aOther) const noexcept; float cross(const Vector2D& aOther) const noexcept; float length() const noexcept; Vector2D normalize() const noexcept; float direction() const noexcept; Vector2D align(float aAngleInDegrees) const noexcept; };
코드 설명
- 클래스 정의:
- class Vector2D: Vector2D라는 이름의 클래스를 선언합니다. 클래스는 데이터와 기능을 하나의 단위로 묶는 방법입니다.
- 접근 지정자:
- private: 이 키워드 뒤에 나오는 멤버들은 클래스 내부에서만 접근 가능합니다.
- public: 이 키워드 뒤에 나오는 멤버들은 클래스 외부에서도 접근 가능합니다.
- 멤버 변수(Member Variables) :
- float fX;와 float fY;: Vector2D 객체의 x와 y 좌표를 저장하기 위한 실수형 변수입니다.
- 생성자(Constructor) :
- Vector2D(float aX = 1.0f, float aY = 0.0f) noexcept: 클래스의 객체를 생성할 때 초기값을 제공합니다. aX와 aY는 매개변수로, 기본값으로 1.0f와 0.0f가 설정되어 있습니다. noexcept는 이 함수에서 예외가 발생하지 않음을 보장합니다.
- 멤버 함수( Member Functions 또는 Methods ):
- float x() const noexcept: fX 값을 반환하는 함수입니다. const 키워드는 이 함수가 멤버 변수를 수정하지 않는다는 것을 의미합니다.
- float y() const noexcept: fY 값을 반환하는 함수입니다.
- 연산자 오버로딩:
- operator+, operator-, operator*: 벡터의 덧셈, 뺄셈, 스칼라 곱셈을 수행하는 연산자를 오버로딩합니다. 오버로딩은 같은 이름의 함수나 연산자에 다른 작업을 할당하는 것입니다.
- dot과 cross: 벡터의 내적과 외적을 계산합니다.
- 기타 함수:
- float length() const noexcept: 벡터의 길이(크기)를 계산합니다.
- Vector2D normalize() const noexcept: 벡터를 정규화합니다 (길이를 1로 만듭니다).
- float direction() const noexcept: 벡터의 방향(각도)을 계산합니다.
- Vector2D align(float aAngleInDegrees) const noexcept: 벡터를 주어진 각도로 정렬합니다.
벡터 연산의 예시와 설명
1.덧셈 연산자 오버로딩 (operator+):
- 두 벡터의 좌표를 각각 더하는 연산자 오버로딩입니다. 이는 두 벡터를 합쳐 새로운 벡터를 생성합니다.
Vector2D operator+(const Vector2D& other) const { return Vector2D(fX + other.fX, fY + other.fY); }
2. 뺄셈 연산자 오버로딩 (operator-):
- 한 벡터에서 다른 벡터를 빼는 연산을 구현합니다. 이는 두 벡터의 차이를 나타내는 새로운 벡터를 반환합니다.
Vector2D operator-(const Vector2D& other) const { return Vector2D(fX - other.fX, fY - other.fY); }
3.스칼라 곱 연산자 오버로딩 (operator*):
- 벡터의 각 요소를 스칼라 값으로 곱하는 연산을 구현합니다. 이 연산은 벡터의 크기를 조정합니다.
Vector2D operator*(float scalar) const { return Vector2D(fX * scalar, fY * scalar); }
4.내적 연산 (dot 메서드):
- 두 벡터 간의 내적을 계산합니다. 내적은 두 벡터의 방향성이 얼마나 유사한지 또는 한 벡터가 다른 벡터에 투영되는 크기를 측정하는 데 사용됩니다.
float dot(const Vector2D& other) const { return fX * other.fX + fY * other.fY; }
5.정규화 연산 (normalize 메서드):
- 벡터의 길이를 1로 만드는 연산으로, 방향은 유지하면서 크기만 변경합니다.
Vector2D normalize() const { float length = sqrt(fX * fX + fY * fY); return Vector2D(fX / length, fY / length); }
'DSP > Lecture' 카테고리의 다른 글
Lecture3 Vector2D 입력 연산자 >> (0) 2024.05.23 Lecture 2 - 정적 캐스트(static_cast) (0) 2024.04.25 Lecture 2 - Operator, Overloading and Vector (1) 2024.04.25 Lecture 2 - Header file, Constructor (0) 2024.04.25 Lecture 2 - noexcept, const and reference (L-value,R-value) (0) 2024.04.23