//-- FILE: coordinates.h
//-- CODER: KUBO Takuya (kubo@ees.hokudai.ac.jp)
//--
//-- (C)opyright 1999 KUBO Takuya (kubo@ees.hokudai.ac.jp).
//-- All rights are reserved.
//-- Do not modify without amending copyright,
//-- distribute freely but retain this paragraph.
//--
//-- CHANGE: Sat Aug 28 17:00:36 1999
// MODIFY: Sat Aug 21 19:26:47 1999
#if !defined(___Class_Coordinates)
#define ___Class_Coordinates
#include <iostream>
#include <vector>
using namespace std;
class Xyz;
class Polar;
ostream& operator<<(ostream&, const Xyz& );
ostream& operator<<(ostream&, const Polar& );
Xyz operator+( const Xyz&, const Xyz& );
Xyz operator-( const Xyz&, const Xyz& );
Polar operator+( const Polar&, const Polar& );
Polar operator-( const Polar&, const Polar& );
//-----------------------------------------------
//[ Xyz coordinates ]
//
// z+| /y+
// | /
// x- |/
// ------+------
// /| x+
// / |
// y-/ |z-
class Xyz {
friend ostream& operator<<( ostream&, const Xyz& );
friend Xyz operator+( const Xyz& v0, const Xyz& v1 );
friend Xyz operator-( const Xyz& v0, const Xyz& v1 );
private:
double x, y, z;
public:
Xyz( void ) { x = y = z = 0.0; }
Xyz( double x0, double y0, double z0 );
Xyz( const Xyz& xyz0 );
~Xyz( void ) { ; }
void Input( double x0, double y0, double z0 );
void Scaling( double, double, double );
double Scalar( void );
double X( void ) const { return x; }
double Y( void ) const { return y; }
double Z( void ) const { return z; }
Xyz& operator+=( const Xyz& );
Xyz& operator-=( const Xyz& );
Xyz& operator+=( const Polar& );
Xyz& operator-=( const Polar& );
};
//-----------------------------------------------
//[ Polar coordinates ]
//
// |y+ z+| /
// | | /
// x- | x+ x-y |/)phi
// ------+------ ------+------
// |\) theta |
// | \ |
// y-| \ z-|
class Polar {
friend ostream& operator<<( ostream&, const Polar& );
friend Polar operator+( const Polar& v0, const Polar& v1 );
friend Polar operator-( const Polar& v0, const Polar& v1 );
private:
double theta, phi, radius;
double px, py, pz;
vector<Xyz> components;
public:
Polar( void );
Polar( double theta0, double phi0, double radius0 );
Polar( Xyz );
Polar( const Polar& );
~Polar( void ) { ; }
void Input( double theta0, double phi0, double radius0 );
void Input( Xyz xyz );
Xyz ToXyz( void ) { return Xyz( px, py, pz ); };
void PlusTheta( double theta0 );
void PlusPhi( double phi0 );
void Multiple( double multiplier );
void ChangeRadius( double radius0 );
// Plane P : its normal vector is '*this'
// v1 : on (theta, 0 <= phi < 2 Pi ) plane ( _|_ x-y)
// v2 : on (0 <= theta < 2 Pi, phi = 0 ) plane ( == x-y)
// ---------------------
// |P v1 | *this
// | A | A .(`Rotated' vector)
// | v'o | | | /
// | \ | | | /
// | \ | | |/) phi_dash
// | theta_dash(\| | +------o v'
// | v2<----------+ | v1-v2 plane
// ---------------------
void Rotate( Polar* branch_angle );
double Px( void ) const { return px; }
double Py( void ) const { return py; }
double Pz( void ) const { return pz; }
double Scalar( void ) const { return radius; }
vector<Xyz>* Components( void ); // Scaled { 1, 1, 1 }
vector<Xyz>* Components( Xyz scale );
Polar& operator+=( const Polar& );
Polar& operator-=( const Polar& );
};
#endif