@@ -630,9 +630,8 @@ void GlyphGeom::generateComet(const Point& p1, const Point& p2,
630630 Vector tangent = dir.getArbitraryTangent ();
631631 Vector bitangent = Cross (dir, tangent);
632632
633- Transform rotate (Point (0.0 , 0.0 , 0.0 ), tangent, bitangent, dir);
634- Transform trans = rotate;
635- trans.pre_translate ((Vector) p2);
633+ Transform trans, rotate;
634+ generateTransforms (p2, tangent, bitangent, dir, trans, rotate);
636635
637636 trans.post_scale ( Vector (1.0 ,1.0 ,1.0 ) * radius );
638637 rotate.post_scale ( Vector (1.0 ,1.0 ,1.0 ) / radius );
@@ -752,7 +751,7 @@ void reorderTensor(std::vector<Vector>& eigvectors, Vector& eigvals)
752751
753752void GlyphGeom::generateBox (const Point& center, Tensor& t, double scale, ColorRGB& node_color, bool normalize)
754753{
755- double zeroThreshold = 0.000001 ;
754+ static const double zeroThreshold = 0.000001 ;
756755 double eigval1, eigval2, eigval3;
757756 t.get_eigenvalues (eigval1, eigval2, eigval3);
758757
@@ -797,31 +796,30 @@ void GlyphGeom::generateBox(const Point& center, Tensor& t, double scale, ColorR
797796 }
798797 }
799798
800- Transform rotate (Point (0.0 , 0.0 , 0.0 ), eigvectors[0 ], eigvectors[1 ], eigvectors[2 ]);
801- Transform trans = rotate;
802- trans.pre_translate ((Vector) center);
799+ Transform trans, rotate;
800+ generateTransforms (center, eigvectors[0 ], eigvectors[1 ], eigvectors[2 ], trans, rotate);
803801
804802 // Rotate and translate points
805- Vector p1 = Vector (trans * Point (eigvals * Vector (- 1.0 , 1.0 , 1.0 ))) ;
806- Vector p2 = Vector (trans * Point (eigvals * Vector (- 1.0 , 1.0 , - 1.0 )));
807- Vector p3 = Vector (trans * Point (eigvals * Vector ( 1.0 , 1.0 , 1.0 )));
808- Vector p4 = Vector (trans * Point (eigvals * Vector ( 1.0 , 1.0 , - 1.0 )));
809- Vector p5 = Vector (trans * Point (eigvals * Vector (- 1.0 , - 1.0 , 1.0 )));
810- Vector p6 = Vector (trans * Point (eigvals * Vector (- 1.0 , -1.0 , - 1.0 )));
811- Vector p7 = Vector (trans * Point (eigvals * Vector ( 1.0 , - 1.0 , 1.0 )));
812- Vector p8 = Vector (trans * Point (eigvals * Vector ( 1.0 , - 1.0 , - 1.0 )));
813-
814- // Rotate norms
815- Vector x_vec = rotate * Vector ( 1 , 0 , 0 );
816- Vector y_vec = rotate * Vector ( 0 , 1 , 0 );
817- Vector z_vec = rotate * Vector ( 0 , 0 , 1 );
818-
819- generateBoxSide (p7, p8, p3, p4, x_vec , node_color);
820- generateBoxSide (p3, p4, p1, p2, y_vec , node_color);
821- generateBoxSide (p5, p7, p1, p3, z_vec , node_color);
822- generateBoxSide (p1, p2, p5, p6 , -x_vec , node_color);
823- generateBoxSide (p5, p6, p7, p8 , -y_vec , node_color);
824- generateBoxSide (p2, p4, p6, p8 , -z_vec , node_color);
803+ std::vector< Vector> points ;
804+ for ( int x = - 1 ; x < 2 ; x+= 2 )
805+ {
806+ for ( int y = - 1 ; y < 2 ; y+= 2 )
807+ {
808+ for ( int z = -1 ; z < 2 ; z+= 2 )
809+ {
810+ points. push_back ( Vector (trans * Point (x * eigvals. x (), y * eigvals. y (), z * eigvals. z () )));
811+ }
812+ }
813+ }
814+
815+ std::vector< Vector> column_vectors = rotate. get_column_vectors ( );
816+
817+ generateBoxSide (points[ 5 ], points[ 4 ], points[ 7 ], points[ 6 ], column_vectors[ 0 ] , node_color);
818+ generateBoxSide (points[ 7 ], points[ 6 ], points[ 3 ], points[ 2 ], column_vectors[ 1 ] , node_color);
819+ generateBoxSide (points[ 1 ], points[ 5 ], points[ 3 ], points[ 7 ], column_vectors[ 2 ] , node_color);
820+ generateBoxSide (points[ 3 ], points[ 2 ], points[ 1 ], points[ 0 ] , -column_vectors[ 0 ] , node_color);
821+ generateBoxSide (points[ 1 ], points[ 0 ], points[ 5 ], points[ 4 ] , -column_vectors[ 1 ] , node_color);
822+ generateBoxSide (points[ 2 ], points[ 6 ], points[ 0 ], points[ 4 ] , -column_vectors[ 2 ] , node_color);
825823}
826824
827825void GlyphGeom::generateBoxSide (const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4,
@@ -850,7 +848,7 @@ void GlyphGeom::generateBoxSide(const Vector& p1, const Vector& p2, const Vector
850848
851849void GlyphGeom::generateEllipsoid (const Point& center, Tensor& t, double scale, int resolution, const ColorRGB& color, bool half, bool normalize)
852850{
853- double zeroThreshold = 0.000001 ;
851+ static const double zeroThreshold = 0.000001 ;
854852 std::vector<Vector> eigvectors (3 );
855853 t.get_eigenvectors (eigvectors[0 ], eigvectors[1 ], eigvectors[2 ]);
856854
@@ -899,9 +897,8 @@ void GlyphGeom::generateEllipsoid(const Point& center, Tensor& t, double scale,
899897 }
900898 }
901899
902- Transform rotate (Point (0.0 , 0.0 , 0.0 ), eigvectors[0 ], eigvectors[1 ], eigvectors[2 ]);
903- Transform trans = rotate;
904- trans.pre_translate ((Vector) center);
900+ Transform trans, rotate;
901+ generateTransforms (center, eigvectors[0 ], eigvectors[1 ], eigvectors[2 ], trans, rotate);
905902
906903 trans.post_scale (Vector (1.0 ,1.0 ,1.0 ) * eigvals);
907904 rotate.post_scale (Vector (1.0 ,1.0 ,1.0 ) / eigvals);
@@ -1009,7 +1006,7 @@ inline double spow(double e, double x)
10091006
10101007void GlyphGeom::generateSuperEllipsoid (const Point& center, Tensor& t, double scale, int resolution, const ColorRGB& color, bool normalize, double emphasis)
10111008{
1012- double zeroThreshold = 0.000001 ;
1009+ static const double zeroThreshold = 0.000001 ;
10131010 std::vector<Vector> eigvectors (3 );
10141011 t.get_eigenvectors (eigvectors[0 ], eigvectors[1 ], eigvectors[2 ]);
10151012
@@ -1058,9 +1055,8 @@ void GlyphGeom::generateSuperEllipsoid(const Point& center, Tensor& t, double sc
10581055 }
10591056 }
10601057
1061- Transform rotate (Point (0.0 , 0.0 , 0.0 ), eigvectors[0 ], eigvectors[1 ], eigvectors[2 ]);
1062- Transform trans = rotate;
1063- trans.pre_translate ((Vector) center);
1058+ Transform trans, rotate;
1059+ generateTransforms (center, eigvectors[0 ], eigvectors[1 ], eigvectors[2 ], trans, rotate);
10641060
10651061 trans.post_scale (Vector (1.0 ,1.0 ,1.0 ) * eigvals);
10661062 rotate.post_scale (Vector (1.0 ,1.0 ,1.0 ) / eigvals);
@@ -1130,7 +1126,6 @@ void GlyphGeom::generateSuperEllipsoid(const Point& center, Tensor& t, double sc
11301126void GlyphGeom::generateTorus (const Point& p1, const Point& p2, double major_radius, double minor_radius,
11311127 int resolution, const ColorRGB& color)
11321128{
1133- std::cout << " minor, major rad: " << minor_radius << " , " << major_radius << std::endl;
11341129 int nv = resolution;
11351130 int nu = nv + 1 ;
11361131
@@ -1533,3 +1528,12 @@ void GlyphGeom::generateTransforms(const Point& center, const Vector& normal,
15331528
15341529 rotate.post_rotate (zrotangle, zrotaxis);
15351530}
1531+
1532+ void GlyphGeom::generateTransforms (const Point& center, const Vector& eigvec1, const Vector& eigvec2,
1533+ const Vector& eigvec3, Transform& translate, Transform& rotate)
1534+ {
1535+ static const Point origin (0.0 , 0.0 , 0.0 );
1536+ rotate = Transform (origin, eigvec1, eigvec2, eigvec3);
1537+ translate = rotate;
1538+ translate.pre_translate ((Vector) center);
1539+ }
0 commit comments