C++ hình họa không gian: C++ Vector3D
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 vector3d.
C++ vector 3d.
I. Lý thuyết cơ bản.
1. 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.
2. Tạo một class đặt tên class là: TVector3D.
Các bạn có thể đặt tên khác, nhưng nên có chữ vector3d hoặc vec3d, hoặc point3d.
3. Thêm header guard.
Tôi thích sử dụng header guard hơn là pragam one nên tôi sẽ thêm header guard.
4. Một class vector cần những gì.
a. Tọa độ x,y,z 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 và tích có hướng giữa 2 vector.
Các hàm sử lý khác mà bạn có thể nghĩ ra.
II. Code thực thi.
1. File header.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#ifndef TVEC3D_H_ #define TVEC3D_H_ #include <math.h> #define TEXP_2 0.01 #define TEXP_4 0.0001 class TVector3D { public: TVector3D(); TVector3D(float x, float y, float z); TVector3D(float v1[3]); TVector3D(const TVector3D& v); ~TVector3D(); public: float GetLength(); float DotProduct(const TVector3D & v); float AngleTo(TVector3D& v); TVector3D CrossProduct(const TVector3D& v); TVector3D Unit(); public: float x_; float y_; float z_; const TVector3D &operator = (const TVector3D &v) { x_ = v.x_; y_ = v.y_; z_ = v.z_; return *this; } const bool &operator == (TVector3D &v) { if (fabs(x_ - v.x_) < TEXP_4 && fabs(y_ - v.y_) < TEXP_4 && fabs(z_ - v.z_) < TEXP_4) { return true; } return false; } const TVector3D &operator + (TVector3D &v) { TVector3D vRet; vRet.x_ = x_ + v.x_; vRet.y_ = y_ + v.y_; vRet.z_ = z_ + v.z_; return vRet; } const TVector3D &operator - (TVector3D &v) { TVector3D vRet; vRet.x_ = x_ - v.x_; vRet.y_ = y_ - v.y_; vRet.z_ = z_ - v.z_; return vRet; } const TVector3D &operator *(double a) { TVector3D vRet; vRet.x_ = x_ * a; vRet.y_ = y_ * a; vRet.z_ = z_ * a; return vRet; } }; #endif |
2. File cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include "stdafx.h" #include "TVector3D.h" TVector3D::TVector3D() { } TVector3D::TVector3D(float x, float y, float z) { x_ = x; y_ = y; z_ = z; } TVector3D::TVector3D(float v[3]) { x_ = v[0]; y_ = v[1]; z_ = v[2]; } TVector3D::TVector3D(const TVector3D& v) { *this = v; } TVector3D::~TVector3D() { } float TVector3D::DotProduct(const TVector3D& v) { double ret = x_ * v.x_ + y_ * v.y_ + z_ * v.z_; return ret; } TVector3D TVector3D::Unit() { double d = sqrt(x_ * x_ + y_ * y_ + z_ * z_); this->x_ = x_ / d; this->y_ = y_ / d; this->z_ = z_ / d; return *this; } float TVector3D::GetLength() { float dis = sqrt(x_ * x_ + y_ * y_ + z_ * z_); return dis; } float TVector3D::AngleTo(TVector3D& v) { float dot = this->x_*v.x_ + this->y_*v.y_ + this->z_*v.z_; float xVal = this->x_*this->x_; float yVal = this->y_*this->y_; float zVal = this->z_*this->z_; float length1 = xVal + yVal + zVal; float length2 = v.x_*v.x_ + v.y_*v.y_ + v.z_*v.z_; float angle = acos(dot / sqrt(length1*length2)); return angle; } TVector3D TVector3D::CrossProduct(const TVector3D& v) { TVector3D vRet; vRet.x_ = (this->y_*v.z_) - (this->z_*v.y_); vRet.y_ = -((this->x_*v.z_) - (this->z_*v.x_)); vRet.z_ = (this->x_*v.y_) - (this->y_*v.x_); return vRet; } |
Ok đó là toàn bộ lớp Vector3D.