This example extends the Vector2 and Vector3 classes from the 2D and 3D vector normalization and angle calculation in C++ example. The formulas for distance calculation in 2D and 3D are listed below.
Header files and classes for 2D and 3D vectors
#pragma once #include <math.h> class Vector2 { public: Vector2(void); Vector2(float X, float Y); ~Vector2(void); float Length(); Vector2 Normalize(); float DistanceTo(Vector2* vector); float X,Y; };
// Vector2.cpp #include "StdAfx.h" #include "Vector2.h" Vector2::Vector2(void) { } Vector2::Vector2(float X, float Y){ this->X = X; this->Y = Y; } // Returns the length of the vector float Vector2::Length(){ return sqrt(X * X + Y * Y); } // Normalizes the vector Vector2 Vector2::Normalize(){ Vector2 vector; float length = this->Length(); if(length != 0){ vector.X = X/length; vector.Y = Y/length; } return vector; } float Vector2::DistanceTo(Vector2* v){ float distance = sqrt(pow(v->X-X,2)+pow(v->Y-Y,2)); return distance; } Vector2::~Vector2(void) { }
#pragma once #include <math.h> class Vector3 { public: Vector3(void); Vector3(float X, float Y, float Z); ~Vector3(void); float Length(); Vector3 Normalize(); float DistanceTo(Vector3* vector); float X,Y,Z; };
// Vector3.cpp #include "StdAfx.h" #include "Vector3.h" Vector3::Vector3(void) { } Vector3::Vector3(float X, float Y, float Z){ this->X = X; this->Y = Y; this->Z = Z; } // Returns the length of the vector float Vector3::Length(){ return sqrt(X * X + Y * Y + Z * Z); } // Normalizes the vector Vector3 Vector3::Normalize(){ Vector3 vector; float length = this->Length(); if(length != 0){ vector.X = X/length; vector.Y = Y/length; vector.Z = Z/length; } return vector; } float Vector3::DistanceTo(Vector3* v){ float distance = sqrt(pow(v->X-X,2)+pow(v->Y-Y,2)+pow(v->Z-Z,2)); return distance; } Vector3::~Vector3(void) { }
The main program
// VectorNormalization.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Vector2.h" #include "Vector3.h" #include <iostream> #include <math.h> using namespace std; float Rad2Deg(float radians); int _tmain(int argc, _TCHAR* argv[]) { Vector2* vector2D = new Vector2(5,5); Vector3* vector3D = new Vector3(5,5,5); printf("2D vector at (%.2f,%.2f)\n",vector2D->X,vector2D->Y); printf("3D vector at (%.2f,%.2f,%.2f)\n",vector3D->X,vector3D->Y,vector3D->Z); printf("Length of 2D vector: %f\n",vector2D->Length()); printf("Length of 3D vector: %f\n",vector3D->Length()); // Normalize vectors Vector2* vector2DNormalized = &vector2D->Normalize(); Vector3* vector3DNormalized = &vector3D->Normalize(); printf("Normalized 2D vector (%f,%f)\n", vector2DNormalized->X,vector2DNormalized->Y); printf("Normalized 3D vector (%f,%f,%f)\n", vector3DNormalized->X,vector3DNormalized->Y,vector3DNormalized->Z); // Calculate angle for the 2D vector float angle = atan2(vector2DNormalized->X,vector2DNormalized->Y); angle = Rad2Deg(angle); printf("(2D) Angle from X-axis: %f\n",angle); // Calculate spherical coordinates for the 3D vector // Radius float r = vector3DNormalized->Length(); // Polar angle float theta = atan2(sqrt(pow(vector3DNormalized->X,2) +pow(vector3DNormalized->Y,2)),vector3DNormalized->Z); // Azimuthal angle float phi = atan2(vector3D->Y,vector3D->X); theta = Rad2Deg(theta); phi = Rad2Deg(phi); printf("(3D) Spherical coordinates: (%f,%f,%f)\n",r,theta,phi); // Create a second 2D vector Vector2* distanceVector2D = new Vector2(10,10); // Calculate the distance between the vectors float distance2D = vector2D->DistanceTo(distanceVector2D); printf("(2D) Distance: %f\n",distance2D); // Create a second 3D vector Vector3* distanceVector3D = new Vector3(10,10,10); // Calculate the distance between the vectors float distance3D = vector3D->DistanceTo(distanceVector3D); printf("(3D) Distance: %f\n",distance3D); system("pause"); return 0; } // Converts radians to degrees float Rad2Deg(float radians){ return radians*(180/3.141592653589793238); }
Output:
2D vector at (5.00,5.00) 3D vector at (5.00,5.00,5.00) Length of 2D vector: 7.071068 Length of 3D vector: 8.660254 Normalized 2D vector (0.707107,0.707107) Normalized 3D vector (0.577350,0.577350,0.577350) (2D) Angle from X-axis: 45.000000 (3D) Spherical coordinates: (1.000000,54.735611,45.000000) (2D) Distance: 7.071068 (3D) Distance: 8.660254 Press any key to continue . . .
You may download my VS 2010 project here.