C++ hình họa không gian: C++ Vector2D
C++ là một trong những ngôn ngữ lập trình hướng đối tượng, với một danh sách phong phú các thư viện open source.
Chúng ta có thể sử dụng C++ cho rất nhiều các ngành ứng dụng…
Một trong số đó là ngành lập trình mô phỏng đồ họa 2d, 3d.
Nói đến mô phỏng đồ họa, thì là nói đến việc sử dựng các đối tượng hình học, như point, line, rectange, block3d….
Do đó để xây dựng được các dự án đồ họa, người ta bao giờ cũng phải xây dựng được các thư viện hỗ trợ tính toán đồ họa.
Ví dụ xây dựng cách hàm vẽ các đối tượng hình học như vẽ line, vẽ điểm, vẽ lưới, vẽ các đối tượng hình học đại diện cho một thực thể nào đó, ví dụ như nhà cửa, cầu, đường…
Hôm nay tôi sẽ giới thiệu với các bạn các xây dựng một project c++ chuyên xử lý cho các vấn đề hình học.
Với bài đầu tiên, chúng ta cùng học các xây dựng 1 lớp vector2d.
I. Lý thuyết cơ bản.
1. Xây dựng project VS-2015.
Tạo project c++ trên visual studio 2015.
Các bạn hãy tạo 1 project c++ console application trên VS 2015 như minh họa dưới đây.
Tên các bạn đặt tùy ý.
Project dạng console.
Đôi tên file được tạo ra thành file main.cpp
Build thử và đảm bảo project build thành công.
Chuột phải vào project và chọn mục add, chọn class, và tạo một class có tên là tvector2D (tên đặt tùy ý, nhưng nên có chữ vector, hoặc vec)
2. Tính chất, thông số của một vector
a. Tọa độ x,y của một vector với kiểu số thực.
Thông thường biến của một thành viên nên được khuyến cáo để private hoặc protected.
Nhưng với class vector và point, có một sự ưu ái cho phép để quyền truy cập public.
b. Các phép toán cơ bản, cộng trừ, nhân chia, phép gán, phép so sánh bằng
+ hai vector cộng nhau ra một vector mới
+ hai vector trừ nhau ra một vector mới (thực ra là cộng với một vector đổi chiều)
+ nhân 1 vector với một hệ số, chia vector cho 1 hệ số
c. tối giản vector về vector đơn vị.
d. tính góc giữa 2 vector.
e. Tích vô hướng 2 vector.
f. Quay vector theo một góc
Các hàm sử lý khác mà bạn có thể nghĩ ra.
II. Code thực thi.
1. File header.
#ifndef TVEC2D_H_ #define TVEC2D_H_ #include <math.h> #define TEXP_2 0.01 #define TEXP_4 0.0001 class TVector2D { public: TVector2D(); TVector2D(float x, float y); TVector2D(float v1[2]); TVector2D(const TVector2D& v); ~TVector2D(); public: float GetLength(); float DotProduct(const TVector2D & v); float AngleTo(TVector2D& v); TVector2D CrossProduct(const TVector2D& v); TVector2D Unit(); public: float x_; float y_; const TVector2D &operator = (const TVector2D &v) { x_ = v.x_; y_ = v.y_; return *this; } const bool &operator == (TVector2D &v) { if (fabs(x_ - v.x_) < TEXP_4 && fabs(y_ - v.y_) < TEXP_4) { return true; } return false; } const TVector2D &operator + (TVector2D &v) { TVector2D vRet; vRet.x_ = x_ + v.x_; vRet.y_ = y_ + v.y_; return vRet; } const TVector2D &operator - (TVector2D &v) { TVector2D vRet; vRet.x_ = x_ - v.x_; vRet.y_ = y_ - v.y_; return vRet; } const TVector2D &operator *(double a) { TVector2D vRet; vRet.x_ = x_ * a; vRet.y_ = y_ * a; return vRet; } }; #endif
2. File cpp
#include "TVector2D.h" TVector2D::TVector2D() { } TVector2D::TVector2D(float x, float y) { x_ = x; y_ = y; } TVector2D::TVector2D(float v[2]) { x_ = v[0]; y_ = v[1]; } TVector2D::TVector2D(const TVector2D& v) { *this = v; } TVector2D::~TVector2D() { } float TVector2D::DotProduct(const TVector2D& v) { double ret = x_ * v.x_ + y_ * v.y_; return ret; } TVector2D TVector2D::Unit() { double d = sqrt(x_ * x_ + y_ * y_); this->x_ = x_ / d; this->y_ = y_ / d; return *this; } float TVector2D::GetLength() { float dis = sqrt(x_ * x_ + y_ * y_); return dis; } float TVector2D::AngleTo(TVector2D& v) { float dot = this->x_*v.x_ + this->y_*v.y_; float det = this->x_*v.y_ - this->y_*v.x_; float angle = atan2(det, dot); return angle; } TVectorD TVectorq2D::Rotate(float angle) { float xRot = x_*cos(angle) - y_sin(angle); float yRot = x_*sin(angle) + y_*cos(angle); TVector2D rVector(xRot, yRot); return rVector; }
Ok đó là toàn bộ lớp Vector2D.