SimpleTorusParametrization.h
Go to the documentation of this file.
1#ifndef SIMPLETORUSPARAMETRIZATION_HEADER
2#define SIMPLETORUSPARAMETRIZATION_HEADER
3#include <iostream>
4#include <utility>
5
6#include "Torus.h"
7#include "basic.h"
8#include <GfxTL/AABox.h>
10#include <GfxTL/MathHelper.h>
11#include <GfxTL/VectorXD.h>
12#include <MiscLib/Vector.h>
13
15{
16public:
18 void Shape(const Torus& torus);
19
20 const Torus&
21 Shape() const
22 {
23 return *m_torus;
24 }
25
26 inline void Parameters(const Vec3f& p, std::pair<float, float>* param) const;
27 inline bool InSpace(float u, float v, Vec3f* p) const;
28 inline bool InSpace(float u, float v, Vec3f* p, Vec3f* n) const;
30 float epsilon,
31 bool* uwrap,
32 bool* vwrap) const;
33
34 void
36 float epsilon,
37 size_t uextent,
38 size_t vextent,
39 MiscLib::Vector<int>* componentImg,
40 MiscLib::Vector<std::pair<int, size_t>>* labels) const
41 {
42 }
43
44 static size_t SerializedSize();
45 void Serialize(std::ostream* o, bool binary) const;
46 void Deserialize(std::istream* i, bool binary);
47
48private:
49 const Torus* m_torus;
51};
52
53void
54SimpleTorusParametrization::Parameters(const Vec3f& p, std::pair<float, float>* param) const
55{
56 Vec3f s = p - m_torus->Center();
57 float planex = s.dot(m_hcs[0].Data());
58 float planey = s.dot(m_hcs[1].Data());
59 param->first = std::atan2(planey, planex); // major angle
60 float minory = s.dot(m_torus->AxisDirection());
61 float minorx = std::sqrt(planex * planex + planey * planey) - m_torus->MajorRadius();
62 param->second = std::atan2(minory, minorx); // minor angle
63 if (m_torus->IsAppleShaped())
64 {
65 if (abs(param->second) > m_torus->AppleCutOffAngle())
66 param->second = GfxTL::Math<float>::Sign(param->second) * m_torus->AppleCutOffAngle();
67 }
68 if (m_torus->MajorRadius() < m_torus->MinorRadius() * 2)
69 {
70 param->first *= m_torus->MajorRadius() + m_torus->MinorRadius();
71 }
72 else
73 {
74 param->first *= m_torus->MajorRadius();
75 }
76 param->second *= m_torus->MinorRadius();
77}
78
79bool
80SimpleTorusParametrization::InSpace(float u, float v, Vec3f* p) const
81{
82 float vangle = v / m_torus->MinorRadius();
83 float minorx = std::cos(vangle);
84 float minory = std::sin(vangle);
85 minorx = m_torus->MinorRadius() * minorx + m_torus->MajorRadius();
86 minory *= m_torus->MinorRadius();
87 Vec3f pp = minorx * Vec3f(m_hcs[0].Data()) + minory * m_torus->AxisDirection();
89 float majorRadius = (m_torus->MajorRadius() < m_torus->MinorRadius() * 2)
90 ? m_torus->MajorRadius() + m_torus->MinorRadius()
91 : m_torus->MajorRadius();
92 float uangle = u / majorRadius;
93 q.RotationRad(uangle,
94 m_torus->AxisDirection()[0],
95 m_torus->AxisDirection()[1],
96 m_torus->AxisDirection()[2]);
97 q.Rotate(pp, p);
98 *p += m_torus->Center();
99 return true;
100}
101
102bool
103SimpleTorusParametrization::InSpace(float u, float v, Vec3f* p, Vec3f* n) const
104{
105 float vangle = v / m_torus->MinorRadius();
106 float minorx = std::cos(vangle);
107 float minory = std::sin(vangle);
108 Vec3f nn = minorx * Vec3f(m_hcs[0].Data()) + minory * m_torus->AxisDirection();
109 minorx = m_torus->MinorRadius() * minorx + m_torus->MajorRadius();
110 minory *= m_torus->MinorRadius();
111 Vec3f pp = minorx * Vec3f(m_hcs[0].Data()) + minory * m_torus->AxisDirection();
113 float majorRadius = (m_torus->MajorRadius() < m_torus->MinorRadius() * 2)
114 ? m_torus->MajorRadius() + m_torus->MinorRadius()
115 : m_torus->MajorRadius();
116 float uangle = u / majorRadius;
117 q.RotationRad(uangle,
118 m_torus->AxisDirection()[0],
119 m_torus->AxisDirection()[1],
120 m_torus->AxisDirection()[2]);
121 q.Rotate(pp, p);
122 q.Rotate(nn, n);
123 *p += m_torus->Center();
124 return true;
125}
126
127#endif
static ScalarT Sign(ScalarT s)
Definition MathHelper.h:25
void WrapComponents(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, float epsilon, size_t uextent, size_t vextent, MiscLib::Vector< int > *componentImg, MiscLib::Vector< std::pair< int, size_t > > *labels) const
void Deserialize(std::istream *i, bool binary)
void Serialize(std::ostream *o, bool binary) const
void WrapBitmap(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, float epsilon, bool *uwrap, bool *vwrap) const
bool InSpace(float u, float v, Vec3f *p) const
void Parameters(const Vec3f &p, std::pair< float, float > *param) const
Definition Torus.h:21
Definition basic.h:18
#define q