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 {
16 public:
17  SimpleTorusParametrization(const Torus& torus);
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 
48 private:
49  const Torus* m_torus;
51 };
52 
53 void
54 SimpleTorusParametrization::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 
79 bool
80 SimpleTorusParametrization::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 
102 bool
103 SimpleTorusParametrization::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
Torus::IsAppleShaped
bool IsAppleShaped() const
Definition: Torus.h:78
GfxTL::HyperplaneCoordinateSystem< float, 3 >
SimpleTorusParametrization::WrapBitmap
void WrapBitmap(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, float epsilon, bool *uwrap, bool *vwrap) const
Definition: SimpleTorusParametrization.cpp:16
GfxTL::Vec3f
VectorXD< 3, float > Vec3f
Definition: VectorXD.h:733
Vector.h
Torus::MinorRadius
const float MinorRadius() const
Definition: Torus.h:54
Vec3f
Definition: basic.h:17
Torus.h
Torus
Definition: Torus.h:20
SimpleTorusParametrization::Shape
const Torus & Shape() const
Definition: SimpleTorusParametrization.h:21
GfxTL::Quaternion
Definition: VectorXD.h:749
SimpleTorusParametrization::InSpace
bool InSpace(float u, float v, Vec3f *p) const
Definition: SimpleTorusParametrization.h:80
SimpleTorusParametrization::Parameters
void Parameters(const Vec3f &p, std::pair< float, float > *param) const
Definition: SimpleTorusParametrization.h:54
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:418
MiscLib::Vector< int >
VectorXD.h
GfxTL::Math::Sign
static ScalarT Sign(ScalarT s)
Definition: MathHelper.h:25
Torus::AxisDirection
const Vec3f & AxisDirection() const
Definition: Torus.h:48
armarx::abs
std::vector< T > abs(const std::vector< T > &v)
Definition: VectorHelpers.h:281
AABox.h
HyperplaneCoordinateSystem.h
SimpleTorusParametrization::Serialize
void Serialize(std::ostream *o, bool binary) const
Definition: SimpleTorusParametrization.cpp:51
SimpleTorusParametrization
Definition: SimpleTorusParametrization.h:14
q
#define q
GfxTL::sqrt
VectorXD< D, T > sqrt(const VectorXD< D, T > &a)
Definition: VectorXD.h:704
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
SimpleTorusParametrization::WrapComponents
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
Definition: SimpleTorusParametrization.h:35
basic.h
Torus::MajorRadius
const float MajorRadius() const
Definition: Torus.h:60
SimpleTorusParametrization::SerializedSize
static size_t SerializedSize()
Definition: SimpleTorusParametrization.cpp:45
MathHelper.h
Torus::Center
const Vec3f & Center() const
Definition: Torus.h:42
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
GfxTL::AABox
Definition: AABox.h:19
SimpleTorusParametrization::Deserialize
void Deserialize(std::istream *i, bool binary)
Definition: SimpleTorusParametrization.cpp:66
Torus::AppleCutOffAngle
float AppleCutOffAngle() const
Definition: Torus.h:84
SimpleTorusParametrization::SimpleTorusParametrization
SimpleTorusParametrization(const Torus &torus)
Definition: SimpleTorusParametrization.cpp:3