Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ellipse.cpp
1 #include <Geometry/Ellipse.hh>
2 
3 #include <Base/Math/Vector2.hh>
4 #include <iostream>
5 #include <limits>
6 #include <fstream>
7 
8 
9 using namespace BIAS;
10 using namespace std;
11 
13 {}
14 
15 
16 void Ellipse::
17  SetParametric(const double scaleX, const double scaleY,
18  const double rotAngleDeg,
19  const double centerX, const double centerY)
20 {
21  //parametricTransform_.SetZero();
22 // parametricTransform_[0][0] = scaleX;
23 // parametricTransform_[1][1] = scaleY;
25  double rotAngleRAD = rotAngleDeg*M_PI/180.0;
26  parametricTransform_[0][0] =
27  parametricTransform_[1][1] = cos(rotAngleRAD);
28  parametricTransform_[0][0] *= scaleX;
29  parametricTransform_[1][1] *= scaleY;
30  parametricTransform_[0][1] = -sin(rotAngleRAD)*scaleY;
31  parametricTransform_[1][0] = sin(rotAngleRAD)*scaleX;
32  cout<<parametricTransform_<<endl;
33 
34  centerX_ = centerX;
35  centerY_ = centerY;
36 
37  CalcImplicitFromParameteric_();
38 
39 }
40 
41 void Ellipse::
42  CalculateAxisAlignedBoundingBox(double &minX, double &minY,
43  double &maxX, double &maxY) const
44 {
45  //use parametric form
46  // which is parametricTransform_ = M^T = (Ma Mc)
47  // (Mb Md)
48  const double Ma = parametricTransform_[0][0];
49  const double Mb = parametricTransform_[1][0];
50  const double Mc = parametricTransform_[0][1];
51  const double Md = parametricTransform_[1][1];
52 
53  double tx[2];
54  double ty[2];
55  tx[0]= atan(Mc / Ma);
56  ty[0] = atan(Md / Mb);
57  tx[1] = tx[0]+M_PI;
58  ty[1] = ty[0]+M_PI;
59 
60 // double xExt[2];
61 // double yExt[2];
62  minX = minY = numeric_limits<double>::max();
63  maxX = maxY = -minX;
64 // minY = DBL_MAX;
65 // maxY = -DBL_MAX;
66 
67  for(unsigned int i=0; i<2; i++){
68  double x = Ma*cos(tx[i])+Mc*sin(tx[i]);
69  double y = Mb*cos(ty[i])+Md*sin(ty[i]);
70 
71  if(minX>x) minX=x;
72  if(minY>y) minY=y;
73  if(x>maxX) maxX=x;
74  if(y>maxY) maxY=y;
75 
76  }
77  minX += centerX_;
78  maxX += centerX_;
79  minY += centerY_;
80  maxY += centerY_;
81 
82 // minX = Ma;
83 // minY = Mb;
84 // maxX = Mc;
85 // maxY = Md;
86 
87 
88 
89 }
90 
91 void Ellipse::
92  CalcImplicitFromParameteric_()
93 {
94  Matrix2x2<double> invParametricTransform = parametricTransform_.Invert();
95 
96  implicitForm_ = invParametricTransform.Transpose()*invParametricTransform;
97 
98 }
99 
100 
101 void Ellipse::
103  const double centerX, const double centerY)
104 {
105  implicitForm_ = implicitForm;
106 
107  CalcParametericFromImplicit_();
108 
109  centerX_ = centerX;
110  centerY_ = centerY;
111 
112 }
113 
114 void Ellipse::
115  SetGaussianFilterRange(const double& sigmaX, const double& sigmaY,
116  const double F)
117 {
118  Matrix2x2<double> Sigma;
119  Sigma.SetZero();
120  Sigma[0][0] = 1.0/(sigmaX*sigmaX);
121  Sigma[1][1] = 1.0/(sigmaY*sigmaY);
122  SetImplicit(Sigma, F, 0 , 0);
123 }
124 
125 void Ellipse::
127  const double F,
128  const double centerX, const double centerY)
129 {
130  implicitForm_ = implicitForm;
131 // cout<<"im form = "<<implicitForm_<<endl;
132  implicitForm_ /= F;
133 // cout<<"im form scaled = "<<implicitForm_<<endl;
134 
135  CalcParametericFromImplicit_();
136 
137  centerX_ = centerX;
138  centerY_ = centerY;
139 
140 }
141 
142 #define MYSGN(x) ((x<0) ? -1.0 : 1.0)
143 void Ellipse::
144  CalcParametericFromImplicit_()
145 {
146  //assumming implicitForm_ = Q = ( A B/2)
147  // ( B/2 C )
148  double B = implicitForm_[0][1] * 2;
149  // cout<<"B = "<<B<<endl;
150  double p = implicitForm_[0][0] - implicitForm_[1][1];
151 // cout<<"p = "<<p<<endl;
152 
153  double t = MYSGN(p)*sqrt(p*p + B*B);
154 // cout<<"t = "<<t<<endl;
155 
156  if(t != 0 ) {
157 
158  double q = implicitForm_[0][0] + implicitForm_[1][1];
159 // cout<<"q = "<<q<<endl;
160  parametricTransform_[0][0] = sqrt( (t+p)/(t*(q+t)) );
161  parametricTransform_[0][1] = MYSGN(B*p)*sqrt( (t-p)/(t*(q+t)) );
162  parametricTransform_[1][0] = -MYSGN(B*p)*sqrt( (t-p)/(t*(q-t)) );
163  parametricTransform_[1][1] = sqrt( (t+p)/(t*(q-t)) );
164  parametricTransform_.TransposeIP();
165  } else {
166  parametricTransform_.SetZero();
167  parametricTransform_[0][0] = parametricTransform_[1][1] =
168  1.0/sqrt(implicitForm_[0][0]);
169  }
170 // cout<<"calc pt = "<<parametricTransform_<<endl;
171 }
172 
175 {
176  return parametricTransform_;
177 }
178 
181 {
182  return implicitForm_;
183 }
void SetGaussianFilterRange(const double &sigmaX, const double &sigmaY, const double F=9.0)
Assumes ellipse to be a certain iso value line on a 2D gaussian without cross correlation (no rotatio...
Definition: Ellipse.cpp:115
int Invert(Matrix2x2< T > &result) const
analyticaly inverts matrix
Definition: Matrix2x2.cpp:115
BIAS::Matrix2x2< double > ReturnImplicitRepresentation() const
Definition: Ellipse.cpp:180
BIAS::Matrix2x2< double > ReturnParametricTransformation() const
Definition: Ellipse.cpp:174
Matrix2x2< T > Transpose() const
returns transposed matrix
Definition: Matrix2x2.hh:173
void SetImplicit(const BIAS::Matrix2x2< double > &implicitForm, const double centerX, const double centerY)
Uses quadric represenation.
Definition: Ellipse.cpp:102
void CalculateAxisAlignedBoundingBox(double &minX, double &minY, double &maxX, double &maxY) const
Definition: Ellipse.cpp:42
void SetZero()
set the elements of this matrix to zero
Definition: Matrix2x2.hh:258
void SetParametric(const double scaleX, const double scaleY, const double rotAngleDeg, const double centerX, const double centerY)
Initialisation via affine transformation.
Definition: Ellipse.cpp:17