3D Coordinate Converter

By ImArrow on Jul 18, 2012

got a little bored and thought i would make something useless to most....to simply show my method
it handles 3 coord systems. sphere , rectangular and cylinder systems.

//Three Dimension Coordinate Systems Converter
#include <iostream>
#include <math.h>
#include<cstring>
#include<cstdlib>

#define PI 3.1415926535897932384626433832795
#define FAC1 (180.0/PI)
#define FAC2 (PI/180.0)
using namespace std;

typedef struct
{
    double d1;
    double d2;
    double d3;
    string str;
    string str1[2];
    string str2[2];
    string str3[2];
} Coordinate;

class convt
{
  private:
  Coordinate cr;//Cartesian (rectangular)
  Coordinate cc;//Cylinderical
  Coordinate cs;//Spherical
  public:
  convt(){
  cr.str = "Cartesian coordinate system";
  cc.str = "Cylindrical coordinate system";
  cs.str = "Spherical coordinate system";
  //Cartesian
  cr.str1[0] = "x = ";
  cr.str2[0] = "y = ";
  cr.str3[0] = "z = ";
  cr.str1[1] = " Unit";
  cr.str2[1] = " Unit";
  cr.str3[1] = " Unit\n";

  //Cylindrical
  cc.str1[0] = "Rho = ";
  cc.str2[0] = "Phi = ";
  cc.str3[0] = "z   = ";
  cc.str1[1] = " Unit";
  cc.str2[1] = " Degree";
  cc.str3[1] = " Unit\n";
  //Spherical
  cs.str1[0] = "R     = ";
  cs.str2[0] = "Theta = ";
  cs.str3[0] = "Phi   = ";
  cs.str1[1] = " Unit";
  cs.str2[1] = " Degree";
  cs.str3[1] = " Degree\n";
  }
  void setVarr(double x,double y , double z){cr.d1 = x;cr.d2 = y; cr.d3 = z;}
  void setVarc(double x,double y , double z){cc.d1 = x;cc.d2 = y; cc.d3 = z;}
  void setVars(double x,double y , double z){cs.d1 = x;cs.d2 = y; cs.d3 = z;}

  void convertr_c()
  {
      //convert from Cartesian to Cylindrical
      cc.d1 = sqrtl(cr.d1*cr.d1 + cr.d2 * cr.d2);//Rho
      cc.d2 = atan(cr.d2/cr.d1);//Phi
      cc.d3 = cr.d3;//z
  }
  void convertc_s()
  {
      //Convert from cylinderical to spherical
      cs.d1 = sqrtl(cc.d1 * cc.d1 + cc.d3 * cc.d3);//r
      cs.d2 = atan(cc.d1/cc.d3);//theta
      cs.d3 = atan((cc.d1 * sin(cc.d2)) /(cc.d1 * cos(cc.d2)));//phi
  }
  void converts_r()
  {
      //convert from spherical to cartesian
      cr.d1 = cs.d1 * sin(cs.d2) * cos(cs.d3);
      cr.d2 = cs.d1 * sin(cs.d2) * sin(cs.d3);
      cr.d3 = cs.d1 * cos(cs.d2);
  }
 friend void disp(convt&);
  };
 void disp(convt &conv)
  {
      cout << endl << conv.cr.str << endl;//display rectangular
      cout <<"-------------------------------\n";
      cout << conv.cr.str1[0] << conv.cr.d1 << conv.cr.str1[1] << endl;
      cout << conv.cr.str2[0] << conv.cr.d2 << conv.cr.str2[1] << endl;
      cout << conv.cr.str3[0] << conv.cr.d3 << conv.cr.str3[1] << endl;

      cout << conv.cc.str << endl;//display cylindrical
      cout <<"-------------------------------\n";
      cout << conv.cc.str1[0] << conv.cc.d1 << conv.cc.str1[1] << endl;
      cout << conv.cc.str2[0] << FAC1 * conv.cc.d2 << conv.cc.str2[1] << endl;
      cout << conv.cc.str3[0] << conv.cc.d3 << conv.cc.str3[1] << endl;

      cout << conv.cs.str << endl;//display spherical
      cout <<"-------------------------------\n";
      cout << conv.cs.str1[0] << conv.cs.d1 << conv.cs.str1[1] << endl;
      cout << conv.cs.str2[0] << FAC1 * conv.cs.d2 << conv.cs.str2[1] << endl;
      cout << conv.cs.str3[0] << FAC1 * conv.cs.d3 << conv.cs.str3[1] << endl << endl;
  }
int main()
{
    convt con;
    double dx1,dx2,dx3;
    char ch;

    for(;;)
    {
    cout << "\n3D Coordinate Converter" << endl;
    cout << "\n\t1) Rectangular Coordinate System (x, y, z) " << endl;
    cout << "\t2) Cylinderical Coordinate System (Rho, Phi, z)" << endl;
    cout << "\t3) Spherical Coordinate System (R, Theta, Phi)" << endl;
    cout << "\t4) Exit " << endl << endl;
    cout << "Hint: The used angles are in degrees" << endl << endl;
    cout << "Choose one option : ";
        cin >> ch;

     if(ch == '1' || ch == '2' || ch == '3' )
        {
        cout << "\nEnter coordinates of the chosen system:";
        cout << "\nEnter 1st axis :";
        cin >> dx1;
        cout << "Enter 2nd axis :";
        cin >> dx2;
        cout << "Enter 3rd axis :";
        cin >> dx3;
        switch(ch)
            {
                case '1':
                    {
                    con.setVarr(dx1,dx2,dx3);
                    con.convertr_c();
                    con.convertc_s();
                    disp(con);
                    break;
                    }
                case '2':
                    {
                    dx2 = dx2 * FAC2;
                    con.setVarc(dx1,dx2,dx3);
                    con.convertc_s();
                    con.converts_r();
                    disp(con);
                    break;
                    }
                case '3':
                    {
                     dx2 = dx2 * FAC2;
                     dx3 = dx3 * FAC2;
                     con.setVars(dx1,dx2,dx3);
                     con.converts_r();
                     con.convertr_c();
                     disp(con);
                     break;
                    }
               }
            }
          else if( ch == '4')
           break;
          else
           cout << "Wrong number choosen. Try to choose right option :" << endl << endl;
    }
    return 0;
}

Comments

Sign in to comment.
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.