Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F62384427
spherical.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, May 12, 20:09
Size
3 KB
Mime Type
text/x-c
Expires
Tue, May 14, 20:09 (2 d)
Engine
blob
Format
Raw Data
Handle
17556317
Attached To
rLAMMPS lammps
spherical.cpp
View Options
/***************************************************************************
spherical.cpp
W. Michael Brown
-------------------
Stuff for working spherical coordinates
__________________________________________________________________________
Part of the Math Library
__________________________________________________________________________
begin : Tue Aug 29 2006
copyright : (C) 2006 by W. Michael Brown
email : wmbrown@sandia.gov
***************************************************************************/
#include "spherical.h"
// Empty construct. Not necessarily initialized to [0 0]
template<class numtyp>
Ball<numtyp>::Ball() {
}
// Assign theta and phi to the value
template<class numtyp>
Ball<numtyp>::Ball(numtyp value) : theta(value), phi(value) {
}
// Assignment Constructor
template<class numtyp>
Ball<numtyp>::Ball(numtyp thet, numtyp ph) : theta(thet), phi(ph) {
}
// Convert from cartesian
template<class numtyp>
Ball<numtyp>::Ball(const ThreeD<numtyp> &pt) {
theta=atan2(pt.y,pt.x);
if (theta<0)
theta+=TWOPI;
phi=acos(pt.z/pt.norm());
}
template<class numtyp>
numtyp & Ball<numtyp>::operator[](unsigned i) {
if (i==THETA)
return theta;
else
return phi;
}
template<class numtyp>
ostream & operator<< (ostream &out, const Ball<numtyp> &t) {
out << t.theta << " " << t.phi;
return out;
}
template<class numtyp>
istream & operator>> (istream &in, Ball<numtyp> &t) {
in >> t.theta >> t.phi;
return in;
}
// Distance between two points (along arc)
template<class numtyp>
numtyp Ball<numtyp>::dist(const Ball &two) const {
double dot=cPt(*this).dot(cPt(two));
if (dot>1.0)
dot=1.0;
return acos(dot);
}
// Distance squared between two points
template<class numtyp>
numtyp Ball<numtyp>::dist2(const Ball &two) const {
numtyp d=dist(two);
return d*d;
}
// Add both angles
template<class numtyp>
void Ball<numtyp>::operator += (const Ball<numtyp> &two) {
theta+=two.theta;
phi+=two.phi;
}
// Add to both angles
template<class numtyp>
Ball<numtyp> Ball<numtyp>::operator + (const numtyp two) const {
return Ball(theta+two,phi+two);
}
// Multiply both angles
template<class numtyp>
Ball<numtyp> Ball<numtyp>::operator * (const numtyp two) const {
return Ball(theta*two,phi*two);
}
// Divide both angles
template<class numtyp>
void Ball<numtyp>::operator /= (const numtyp two) {
theta/=two;
phi/=two;
}
// Add both angles
template<class numtyp>
Ball<numtyp> Ball<numtyp>::operator + (const Ball<numtyp> &two) {
return Ball(theta+two.theta,phi+two.phi);
}
// Move coordinates into array
template<class numtyp>
void Ball<numtyp>::to_array(numtyp *array) {
*array=theta;
array++;
*array=phi;
}
// Set coordinates from array
template<class numtyp>
void Ball<numtyp>::from_array(numtyp *array) {
theta=*array;
array++;
phi=*array;
}
// Returns 2
template<class numtyp>
unsigned Ball<numtyp>::dimensionality() {
return 2;
}
// Returns true
template<class numtyp>
bool Ball<numtyp>::check_bounds(numtyp min,numtyp max) {
return true;
}
template class Ball<double>;
template class Ball<float>;
template ostream & operator<< <double>(ostream &out, const Ball<double> &t);
template ostream & operator<< <float>(ostream &out, const Ball<float> &t);
template istream & operator>> <double>(istream &in, Ball<double> &t);
template istream & operator>> <float>(istream &in, Ball<float> &t);
Event Timeline
Log In to Comment