19 #include <vnl/vnl_least_squares_function.h>
28 const std::vector<a_point> & cloud) :
32 void f(
const vnl_vector<double>& x, vnl_vector<double>& fx);
40 a_point center(x[0],x[1],x[2]);
42 for (
int i = 0; i< fx.size(); i++)
50 o <<
"***************" << std::endl;
51 o <<
"a_shape_sphere:" << std::endl;
52 o <<
"***************" << std::endl;
53 o <<
"This is a 'sphere' fitting class" << std::endl;
63 m(0,0)=p1.x(); m(0,1)=p1.y(); m(0,2)=p1.z(); m(0,3)=1.;
64 m(1,0)=p2.x(); m(1,1)=p2.y(); m(1,2)=p2.z(); m(1,3)=1.;
65 m(2,0)=p3.x(); m(2,1)=p3.y(); m(2,2)=p3.z(); m(2,3)=1.;
66 m(3,0)=p4.x(); m(3,1)=p4.y(); m(3,2)=p4.z(); m(3,3)=1.;
67 double M11 = m.determinant();
68 double t1 = p1.x()*p1.x()+p1.y()*p1.y()+p1.z()*p1.z();
69 double t2 = p2.x()*p2.x()+p2.y()*p2.y()+p2.z()*p2.z();
70 double t3 = p3.x()*p3.x()+p3.y()*p3.y()+p3.z()*p3.z();
71 double t4 = p4.x()*p4.x()+p4.y()*p4.y()+p4.z()*p4.z();
72 m(0,0)= t1; m(1,0)= t2; m(2,0)= t3; m(3,0)= t4;
73 double M12 = m.determinant();
74 m(0,1)= p1.x(); m(1,1)= p2.x(); m(2,1)= p3.x(); m(3,1)= p4.x();
75 double M13 = m.determinant();
76 m(0,2)= p1.y(); m(1,2)= p2.y(); m(2,2)= p3.y(); m(3,2)= p4.y();
77 double M14 = m.determinant();
78 m(0,3)= p1.z(); m(1,3)= p2.z(); m(2,3)= p3.z(); m(3,3)= p4.z();
79 double M15 = m.determinant();
80 a_point centre(.5*M12/M11,-.5*M13/M11,.5*M14/M11);
82 this->
radius(sqrt(centre.sumsq()-M15/M11));
87 a_point d = (
pt-this->
center()).normalise();
109 }
while ((i1==i3)||(i2==i3));
113 }
while ((i1==i4)||(i2==i4)||(i3==i4));
114 a_point p1 = pts[i1];
115 a_point p2 = pts[i2];
116 a_point p3 = pts[i3];
117 a_point p4 = pts[i4];
119 this->
p4pts(p1,p2,p3,p4);
124 std::vector<a_point> pts2;
125 int cs0 = pts.size();
138 const double pi = 3.14159265358979;
139 a_point ce = this->
center();
140 double r = this->
radius();
141 std::vector<a_point> points;
142 points.push_back(ce+a_point(0.,0.,r));
143 points.push_back(ce+a_point(0.,0.,-r));
144 int K = int((sqrt(
pi/4.*nseg))+.5);
145 for (
int i=0; i<K; i++)
147 double ui=
pi/2-i*(
pi/K);
148 double li = 2*
pi*cos(ui);
149 int Ki = int(li/(
pi/K)+.5);
150 for (
int j=0; j<Ki; j++)
152 double vi = 2*
pi*j/Ki;
153 a_point
dir(cos(ui)*cos(vi),cos(ui)*sin(vi),sin(ui));
154 points.push_back(ce+r*
dir);
157 std::cout << points.size() << std::endl;
158 for (
int i=0; i< points.size(); i++)
159 std::cout << points[i] << std::endl;
173 const double pi = 3.14159265358979;
174 a_point ce = this->
center();
175 double r = this->
radius();
176 std::vector<std::vector<a_point> *> points;
177 auto pt_line =
new std::vector<a_point>;
178 pt_line->push_back(ce+a_point(0.,0.,r));
179 points.push_back(pt_line);
180 auto pt_line2 =
new std::vector<a_point>;
181 pt_line2->push_back(ce+a_point(0.,0.,-r));
182 points.push_back(pt_line2);
183 int K = int(sqrt(
pi/8.*nseg)+.5);
185 std::cerr <<
"K = " << K << std::endl;
188 for (
int i=1; i<=K/2; i++)
191 pt_line =
new std::vector<a_point>;
192 pt_line2 =
new std::vector<a_point>;
193 double ui=
pi/2-i*(
pi/K);
194 double li = 2*
pi*cos(ui);
195 int Ki = int(li/(
pi/K)+.5);
196 for (
int j=0; j<Ki; j++)
198 double vi = 2*
pi*j/Ki;
199 a_point
dir(cos(ui)*sin(vi),cos(ui)*cos(vi),sin(ui));
200 pt_line->push_back(ce+r*
dir);
201 a_point dir2(cos(ui)*sin(vi),cos(ui)*cos(vi),-sin(ui));
202 pt_line2->push_back(ce+r*dir2);
206 points.push_back(pt_line);
207 points.push_back(pt_line2);
209 std::cout << npt_tot*2 << std::endl;
210 for (
int i=0; i<points.size();i++)
213 for (
int j=0; j<pt_line->size();j++)
214 std::cout << (*pt_line)[j] << std::endl;
216 int ref1 = npt_tot*2;
217 int ref2 = ref1-npt_i*2;
218 std::vector<int> refs;
219 for (
int i=points.size()-1; i>1; i--)
221 std::vector<a_point> * pt1, * pt2;
224 int l1 = pt1->size();
225 int l2 = pt2->size();
229 for (
int j=0; j<l1; j++)
232 double x1a, x1b, x2a, x2b;
234 x1b =
right(j,l1)/double(l1);
236 x2b =
right(j2,l2)/double(l2);
237 double d1 = dist((*pt1)[j],(*pt2)[
right(j2,l2)]);
238 double d2 = dist((*pt1)[
right(j,l1)],(*pt2)[j2]);
242 refs.push_back(ref1+j);
245 refs.push_back(ref1+
right(j,l1));
246 refs.push_back(ref2+
right(j2,l2));
249 refs.push_back(ref2+
right(j2,l2));
250 refs.push_back(ref1+
right(j,l1));
252 refs.push_back(ref1+j);
255 refs.push_back(ref2+
right(j2,l2));
256 refs.push_back(ref2+j2);
259 refs.push_back(ref2+j2);
260 refs.push_back(ref2+
right(j2,l2));
265 refs.push_back(ref1+j);
268 refs.push_back(ref1+
right(j,l1));
269 refs.push_back(ref2+j2);
272 refs.push_back(ref2+j2);
273 refs.push_back(ref1+
right(j,l1));
278 std::vector<a_point> * pt1 = points[points.size()-1];
279 std::vector<a_point> * pt2 = points[points.size()-2];
283 for (
int i=0; i<l; i++)
285 refs.push_back(ref1+i);
286 refs.push_back(ref1+
right(i,l));
287 refs.push_back(ref2+i);
288 refs.push_back(ref1+
right(i,l));
289 refs.push_back(ref2+
right(i,l));
290 refs.push_back(ref2+i);
292 std::cout << refs.size()/3 <<std::endl;
293 for (
int i=0; i< refs.size(); i+=3)
294 std::cout << refs[i] <<
" " << refs[i+1] <<
" " << refs[i+2] << std::endl;
int right(int ref, int max)
const std::vector< a_point > & cloud_
void f(const vnl_vector< double > &x, vnl_vector< double > &fx)
a_shape_sphere_function(a_shape_sphere &shape, const std::vector< a_point > &cloud)
void export_points(const unsigned int nseg, const std::vector< a_point > &pts) const
static const std::string help()
void fit_cloud(std::vector< a_point > &pts, short nl=1)
double dist_point(const a_point p) const
void p4pts(const a_point p1, const a_point p2, const a_point p3, const a_point p4)
void random_hint(const std::vector< a_point > &pts)
a_point closest_point(const a_point p) const
void export_triangles(const unsigned int nseg, const std::vector< a_point > &pts) const
void fit_cloud(const std::vector< a_point > &pts, vnl_least_squares_function &fn)
static const std::string help()
int best_fitting_cloud(const std::vector< a_point > &pts, std::vector< a_point > &pts2)
double max(double a, double b)
a_point dir(int i, int l)