#include <symmetry.h>
Inheritance diagram for EMAN::PlatonicSym:
Public Member Functions | |
PlatonicSym () | |
virtual | ~PlatonicSym () |
virtual TypeDict | get_param_types () const |
Get a dictionary containing the permissable parameters of this class Platonic symmetries actually have no parameters. | |
virtual Dict | get_delimiters (const bool inc_mirror=false) const |
Returns the range of altitude and azimuth angles which encompass the asymmetric unit of the Platonic symmetry (and more). | |
virtual bool | is_in_asym_unit (const float &altitude, const float &azimuth, const bool inc_mirror) const |
A function to be used when generating orientations over portion of the unit sphere defined by parameters returned by get_delimiters. | |
virtual bool | is_platonic_sym () const |
Determines whether or not this Symmetry3D is the platonic type - returns true. | |
Protected Member Functions | |
void | init () |
Init - Called to initialize platonic_params, should be called in the constructor of all Platonic solids that derive from this. | |
float | platonic_alt_lower_bound (const float &azimuth, const float &alpha) const |
Returns the lower bound of the asymmetric unit, as dependent on azimuth, and on alpha - alpha is alt_max for icos and oct, but may be alt_max/2.0 for tet depending on mirror symmetry etc. | |
virtual vector< Vec3f > | get_asym_unit_points (bool inc_mirror=false) const |
virtual vector< vector< Vec3f > > | get_asym_unit_triangles (bool inc_mirror) const |
Get triangles that precisely occlude the projection area of the default asymmetric unit. | |
Protected Attributes | |
Dict | platonic_params |
A dictionary that stores important angles, in radians. | |
Private Member Functions | |
PlatonicSym (const PlatonicSym &) | |
Disallow copy construction. | |
PlatonicSym & | operator= (const PlatonicSym &) |
Disallow assignment. |
It cannot be instantieted on its own. Doctor Phil says: "see www.math.utah.edu/~alfeld/math/polyhedra/polyhedra.html for pictures of platonic solids" Also, see http://blake.bcm.edu/emanwiki/EMAN2/Symmetry for a good pictorial description of what's going on here This class has a fundamental role to play in terms of the Platonic symmetries that derive from it. It is based heavily on the manuscript Baldwin and Penczek, 2007. The Transform Class in SPARX and EMAN2. JSB 157(250-261), where the important angles of the asymmetric units in Platonic solids are described. The MOST IMPORTANT THING TO NOTE is anything that derives from this class must call init() in its constructor. However, because it is unlikey that any class will inherit from this one seeing as the set of Platonic symmetries is finite.
Definition at line 581 of file symmetry.h.
EMAN::PlatonicSym::PlatonicSym | ( | ) | [inline] |
virtual EMAN::PlatonicSym::~PlatonicSym | ( | ) | [inline, virtual] |
EMAN::PlatonicSym::PlatonicSym | ( | const PlatonicSym & | ) | [private] |
Disallow copy construction.
vector< Vec3f > PlatonicSym::get_asym_unit_points | ( | bool | inc_mirror = false |
) | const [protected, virtual] |
inc_mirror | whether or not to include the mirror portion of the asymmetric unit |
Implements EMAN::Symmetry3D.
Reimplemented in EMAN::TetrahedralSym.
Definition at line 1741 of file symmetry.cpp.
References b, EMAN::Symmetry3D::get_az_alignment_offset(), EMAN::Vec3< Type >::normalize(), platonic_params, and t.
Referenced by get_asym_unit_triangles().
01742 { 01743 vector<Vec3f> ret; 01744 01745 Vec3f b = Vec3f(0,0,1); 01746 ret.push_back(b); 01747 float theta_c_on_two = (float)platonic_params["theta_c_on_two"]; // already in radians 01748 float theta_c = 2*theta_c_on_two; 01749 01750 Vec3f c_on_two = Vec3f(0,-sin(theta_c_on_two),cos(theta_c_on_two)); 01751 Vec3f c = Vec3f(0,-sin(theta_c),cos(theta_c)); 01752 ret.push_back(c_on_two); 01753 01754 float cap_sig = platonic_params["az_max"]; 01755 Vec3f a = Vec3f(sin(theta_c)*sin(cap_sig),-sin(theta_c)*cos(cap_sig),cos(theta_c)); 01756 01757 Vec3f f = a+b+c; 01758 f.normalize(); 01759 01760 ret.push_back(f); 01761 01762 if ( inc_mirror ) { 01763 Vec3f a_on_two = Vec3f(sin(theta_c_on_two)*sin(cap_sig),-sin(theta_c_on_two)*cos(cap_sig),cos(theta_c_on_two)); 01764 ret.push_back(a_on_two); 01765 } 01766 01767 if ( get_az_alignment_offset() != 0 ) { 01768 Dict d("type","eman"); 01769 d["az"] = get_az_alignment_offset(); 01770 d["phi"] = 0.0f; 01771 d["alt"] = 0.0f; 01772 Transform t(d); 01773 for (vector<Vec3f>::iterator it = ret.begin(); it != ret.end(); ++it ) 01774 { 01775 *it = (*it)*t; 01776 } 01777 } 01778 // 01779 return ret; 01780 01781 }
vector< vector< Vec3f > > PlatonicSym::get_asym_unit_triangles | ( | bool | inc_mirror | ) | const [protected, virtual] |
Get triangles that precisely occlude the projection area of the default asymmetric unit.
This is used for collision detection in Symmetry3D::reduce
inc_mirror | whether to include the mirror portion of the asymmetric unit |
Implements EMAN::Symmetry3D.
Definition at line 1714 of file symmetry.cpp.
References get_asym_unit_points(), and v.
01714 { 01715 vector<Vec3f> v = get_asym_unit_points(inc_mirror); 01716 vector<vector<Vec3f> > ret; 01717 if (v.size() == 3) { 01718 vector<Vec3f> tmp; 01719 tmp.push_back(v[0]); 01720 tmp.push_back(v[2]); 01721 tmp.push_back(v[1]); 01722 ret.push_back(tmp); 01723 } 01724 else /* v.size() == 4*/ { 01725 vector<Vec3f> tmp; 01726 tmp.push_back(v[0]); 01727 tmp.push_back(v[2]); 01728 tmp.push_back(v[1]); 01729 ret.push_back(tmp); 01730 01731 vector<Vec3f> tmp2; 01732 tmp2.push_back(v[0]); 01733 tmp2.push_back(v[3]); 01734 tmp2.push_back(v[2]); 01735 ret.push_back(tmp2); 01736 } 01737 01738 return ret; 01739 }
Dict PlatonicSym::get_delimiters | ( | const bool | inc_mirror = false |
) | const [virtual] |
Returns the range of altitude and azimuth angles which encompass the asymmetric unit of the Platonic symmetry (and more).
As a general rule you may generate your orientations evenly over the range altitude range as accessed by "alt_max" key in the return dictionary, and over the azimuth range as accessed by the "az_max", but your must call the function is_in_asym_unit as you do it, to accomodate for orientations in the range that are actually beyond the asymmetric unit. See http://blake.bcm.edu/emanwiki/EMAN2/Symmetry for pictures and descriptions. If the inc_mirror is true, the return "az_max" key is twice as large as if not, but only if the platonic symmetry is Icos or Oct. If the symmetry is Tet, the mirror considerations are taken into account in is_in_asym_unit. This is a bit of a design flaw, but it works.
inc_mirror | whether or not to consider the mirror portion of the asymmetric unit (only changes the return values if the symmetry is Icos or Oct) |
Implements EMAN::Symmetry3D.
Definition at line 1652 of file symmetry.cpp.
References EMAN::FactoryBase::get_name(), EMAN::OctahedralSym::NAME, EMAN::IcosahedralSym::NAME, platonic_params, and EMAN::EMConsts::rad2deg.
Referenced by EMAN::TetrahedralSym::is_in_asym_unit(), and is_in_asym_unit().
01653 { 01654 Dict ret; 01655 ret["az_max"] = EMConsts::rad2deg * (float) platonic_params["az_max"]; 01656 // For icos and oct symmetries, excluding the mirror means halving az_maz 01657 if ( inc_mirror == false ) 01658 if ( get_name() == IcosahedralSym::NAME || get_name() == OctahedralSym::NAME ) 01659 ret["az_max"] = 0.5f*EMConsts::rad2deg * (float) platonic_params["az_max"]; 01660 //else 01661 //the alt_max variable should probably be altered if the symmetry is tet, but 01662 //this is taken care of in TetSym::is_in_asym_unit 01663 01664 ret["alt_max"] = (float)(EMConsts::rad2deg * (float) platonic_params["alt_max"]); 01665 return ret; 01666 }
virtual TypeDict EMAN::PlatonicSym::get_param_types | ( | ) | const [inline, virtual] |
Get a dictionary containing the permissable parameters of this class Platonic symmetries actually have no parameters.
Implements EMAN::FactoryBase.
Definition at line 591 of file symmetry.h.
void PlatonicSym::init | ( | ) | [protected] |
Init - Called to initialize platonic_params, should be called in the constructor of all Platonic solids that derive from this.
This function generates the important angles of the platonic symmetries which is dependent only on the function get_max_csym ( which must be defined in all classes that inherit from this class)
Definition at line 1631 of file symmetry.cpp.
References EMAN::Symmetry3D::get_max_csym(), and platonic_params.
Referenced by EMAN::IcosahedralSym::IcosahedralSym(), EMAN::OctahedralSym::OctahedralSym(), EMAN::TetrahedralSym::TetrahedralSym(), and EMAN::Icosahedral2Sym::~Icosahedral2Sym().
01632 { 01633 //See the manuscript "The Transform Class in Sparx and EMAN2", Baldwin & Penczek 2007. J. Struct. Biol. 157 (250-261) 01634 //In particular see pages 257-259 01635 //cap_sig is capital sigma in the Baldwin paper 01636 float cap_sig = 2.0f*M_PI/ get_max_csym(); 01637 //In EMAN2 projection cap_sig is really az_max 01638 platonic_params["az_max"] = cap_sig; 01639 01640 // Alpha is the angle between (immediately) neighborhing 3 fold axes of symmetry 01641 // This follows the conventions in the Baldwin paper 01642 float alpha = acos(1.0f/(sqrtf(3.0f)*tan(cap_sig/2.0f))); 01643 // In EMAN2 projection alpha is really al_maz 01644 platonic_params["alt_max"] = alpha; 01645 01646 // This is half of "theta_c" as in the conventions of the Balwin paper. See also http://blake.bcm.edu/emanwiki/EMAN2/Symmetry. 01647 platonic_params["theta_c_on_two"] = 1.0f/2.0f*acos( cos(cap_sig)/(1.0f-cos(cap_sig))); 01648 01649 }
bool PlatonicSym::is_in_asym_unit | ( | const float & | altitude, | |
const float & | azimuth, | |||
const bool | inc_mirror | |||
) | const [virtual] |
A function to be used when generating orientations over portion of the unit sphere defined by parameters returned by get_delimiters.
altitude and azimuth alone are not enough to correctly demarcate the asymmetric unit. See the get_delimiters comments.
altitude | the EMAN style altitude of the 3D orientation in degrees | |
azimuth | the EMAN style azimuth of the 3D orientation in degrees | |
inc_mirror | whether or not to include orientations if they are in the mirror portion of the asymmetric unit |
Implements EMAN::Symmetry3D.
Reimplemented in EMAN::TetrahedralSym.
Definition at line 1669 of file symmetry.cpp.
References EMAN::EMConsts::deg2rad, get_delimiters(), platonic_alt_lower_bound(), and platonic_params.
01670 { 01671 Dict d = get_delimiters(inc_mirror); 01672 float alt_max = d["alt_max"]; 01673 float az_max = d["az_max"]; 01674 01675 if ( altitude >= 0 && altitude <= alt_max && azimuth <= az_max && azimuth >= 0) { 01676 01677 // Convert azimuth to radians 01678 float tmpaz = (float)(EMConsts::deg2rad * azimuth); 01679 01680 float cap_sig = platonic_params["az_max"]; 01681 float alt_max = platonic_params["alt_max"]; 01682 if ( tmpaz > ( cap_sig/2.0f ) )tmpaz = cap_sig - tmpaz; 01683 01684 float lower_alt_bound = platonic_alt_lower_bound(tmpaz, alt_max ); 01685 01686 // convert altitude to radians 01687 float tmpalt = (float)(EMConsts::deg2rad * altitude); 01688 if ( lower_alt_bound > tmpalt ) { 01689 if ( inc_mirror == false ) 01690 { 01691 if ( cap_sig/2.0f < tmpaz ) return false; 01692 else return true; 01693 } 01694 else return true; 01695 } 01696 return false; 01697 } 01698 return false; 01699 }
virtual bool EMAN::PlatonicSym::is_platonic_sym | ( | ) | const [inline, virtual] |
Determines whether or not this Symmetry3D is the platonic type - returns true.
Reimplemented from EMAN::Symmetry3D.
Definition at line 627 of file symmetry.h.
PlatonicSym& EMAN::PlatonicSym::operator= | ( | const PlatonicSym & | ) | [private] |
Disallow assignment.
float PlatonicSym::platonic_alt_lower_bound | ( | const float & | azimuth, | |
const float & | alpha | |||
) | const [protected] |
Returns the lower bound of the asymmetric unit, as dependent on azimuth, and on alpha - alpha is alt_max for icos and oct, but may be alt_max/2.0 for tet depending on mirror symmetry etc.
azimuth | an EMAN style 3D azimuth angle, in radians | |
alpha | an EMAN style altitude angle that helps to define arcs on the unit sphere. See Baldwin and Penczek, 2007. The Transform Class in SPARX and EMAN2. JSB 157(250-261) where the angle alpha is described |
Definition at line 1701 of file symmetry.cpp.
References platonic_params.
Referenced by EMAN::TetrahedralSym::is_in_asym_unit(), and is_in_asym_unit().
01702 { 01703 float cap_sig = platonic_params["az_max"]; 01704 float theta_c_on_two = platonic_params["theta_c_on_two"]; 01705 01706 float baldwin_lower_alt_bound = sin(cap_sig/2.0f-azimuth)/tan(theta_c_on_two); 01707 baldwin_lower_alt_bound += sin(azimuth)/tan(alpha); 01708 baldwin_lower_alt_bound *= 1/sin(cap_sig/2.0f); 01709 baldwin_lower_alt_bound = atan(1/baldwin_lower_alt_bound); 01710 01711 return baldwin_lower_alt_bound; 01712 }
Dict EMAN::PlatonicSym::platonic_params [protected] |
A dictionary that stores important angles, in radians.
Definition at line 631 of file symmetry.h.
Referenced by EMAN::TetrahedralSym::get_asym_unit_points(), get_asym_unit_points(), get_delimiters(), init(), EMAN::TetrahedralSym::is_in_asym_unit(), is_in_asym_unit(), and platonic_alt_lower_bound().