Xmipp  v3.23.11-Nereus
geometry.h
Go to the documentation of this file.
1 /***************************************************************************
2 *
3 * Authors: Carlos Oscar S. Sorzano (coss@cnb.csic.es)
4 *
5 * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 * 02111-1307 USA
21 *
22 * All comments concerning this program package may be sent to the
23 * e-mail address 'xmipp@cnb.csic.es'
24 ***************************************************************************/
25 
26 #ifndef CORE_GEOMETRY_H
27 #define CORE_GEOMETRY_H
28 
29 #include "multidim_array.h"
30 #include "multidim_array_generic.h"
31 
32 #ifndef FLT_EPSILON
33 #define FLT_EPSILON 1.19209e-07
34 #endif
35 
36 #include <vector>
37 #include <iostream>
38 
41 
42 
71  double distance,
72  Matrix1D< double >& result);
73 
106  double rot,
107  double tilt,
108  double psi,
109  Matrix1D< double >& result);
110 
145  const Matrix2D< double >& euler,
146  Matrix1D< double >& result);
147 
155  const Matrix1D< double >& r2);
156 
163  const Matrix1D< double >& a,
164  const Matrix1D< double >& v);
165 
172  const Matrix1D< double >& a,
173  const Matrix1D< double >& v)
174 {
175  static Matrix1D< double > p_a(3);
176 
177  V3_MINUS_V3(p_a, p, a);
178  return (dotProduct(p_a, v) / v.module());
179 }
180 
183 struct FitPoint
184 {
186  double x;
188  double y;
190  double z;
192  double w;
193 };
194 
213 void least_squares_plane_fit(FitPoint *IN_points,
214  int Npoints,
215  double& plane_A,
216  double& plane_B,
217  double& plane_C);
218 
225  double& plane_A,
226  double& plane_B,
227  double& plane_C);
228 
232 {
234  double x;
236  double y;
238  double w;
239 };
240 
258 void least_squares_line_fit(const std::vector< fit_point2D >& IN_points,
259  double& line_A,
260  double& line_B);
261 
274 {
275 public:
277  int l0;
279  int lF;
281  int m0;
283  int mF;
284 
286  double x0;
288  double y0;
289 
292 
294  double h_x;
296  double h_y;
297 
303 
305  double evaluate(double x, double y) const;
306 };
307 
325 void Bspline_model_fitting(const std::vector< FitPoint >& IN_points,
326  int SplineDegree,
327  int l0,
328  int lF,
329  int m0,
330  int mF,
331  double h_x,
332  double h_y,
333  double x0,
334  double y0,
335  Bspline_model& result);
336 
350  const Matrix1D< double >& vF,
351  const Matrix2D< double >& V,
352  Matrix1D< double >& corner1,
353  Matrix1D< double >& corner2);
354 
368  const Matrix1D< double >& vF,
369  const Matrix2D< double >& V,
370  Matrix1D< double >& corner1,
371  Matrix1D< double >& corner2);
372 
379 bool point_inside_polygon(const std::vector< Matrix1D< double > > & polygon,
380  const Matrix1D< double >& point);
381 
385 void def_affinity(double u1x, double u1y, double u2x, double u2y, double u3x, double u3y, double t1x,
386  double t1y, double t2x, double t2y, double t3x, double t3y, Matrix2D<double> &A, Matrix1D<double> &T, Matrix2D<double> &invW);
387 
388 
389 
393 double triangle_area(double x1, double y1, double x2, double y2, double x3, double y3);
394 
453 int line_plane_intersection(const Matrix1D< double > normal_plane,
454  const Matrix1D< double > vector_line,
455  Matrix1D< double >& intersection_point,
456  const Matrix1D< double > point_line,
457  double point_plane_at_x_y_zero = 0.);
459 
462 
471 #define EULER_CLIPPING(rot,tilt,psi) \
472  rot = realWRAP(rot, 0, 360); \
473  tilt = realWRAP(tilt, 0, 360); \
474  psi = realWRAP(psi, 0, 360);
475 
480 #define EULER_CLIPPING_RAD(rot, tilt, psi) \
481  rot = realWRAP(rot, 0, 2.0*PI); \
482  tilt = realWRAP(tilt, 0, 2.0*PI); \
483  psi = realWRAP(psi, 0, 2.0*PI);
484 
496 template<typename T>
497 void Euler_angles2matrix(T a, T b, T g, Matrix2D<T>& A,
498  bool homogeneous=false);
499 
505 void Euler_anglesZXZ2matrix(double a, double b, double g, Matrix2D< double >& A,
506  bool homogeneous=false);
507 
513  const Matrix2D<double> &E2);
514 
518 template<typename T>
519 T Euler_distanceBetweenAngleSets(T rot1, T tilt1, T psi1,
520  T rot2, T tilt2, T psi2,
521  bool only_projdir);
522 
527 template<typename T>
529  T rot2, T tilt2, T psi2,
530  bool only_projdir, Matrix2D<T> &E2);
531 
540 void Euler_Angles_after_compresion(const double rot,
541  double tilt,
542  double psi,
543  double& new_rot,
544  double& new_tilt,
545  double& new_psi,
546  Matrix2D< double >& D);
547 
553 void Euler_direction(double alpha,
554  double beta,
555  double gamma,
556  Matrix1D< double >& v);
557 
564  double& alpha,
565  double& beta,
566  double& gamma);
567 
583  double& alpha,
584  double& beta,
585  double& gamma,bool homogeneous=false);
586 
608 void Euler_up_down(double rot,
609  double tilt,
610  double psi,
611  double& newrot,
612  double& newtilt,
613  double& newpsi);
614 
631 void Euler_another_set(double rot,
632  double tilt,
633  double psi,
634  double& newrot,
635  double& newtilt,
636  double& newpsi);
637 
664 void Euler_mirrorY(double rot,
665  double tilt,
666  double psi,
667  double& newrot,
668  double& newtilt,
669  double& newpsi);
670 
697 void Euler_mirrorX(double rot,
698  double tilt,
699  double psi,
700  double& newrot,
701  double& newtilt,
702  double& newpsi);
703 
731 void Euler_mirrorXY(double rot,
732  double tilt,
733  double psi,
734  double& newrot,
735  double& newtilt,
736  double& newpsi);
737 
766  const Matrix2D< double >& R,
767  double rot,
768  double tilt,
769  double psi,
770  double& newrot,
771  double& newtilt,
772  double& newpsi);
773 
779  double rot,
780  double tilt,
781  double psi,
782  MultidimArray< double >& result);
783 
788 void Euler_rotate(const MultidimArrayGeneric &V,
789  double rot,
790  double tilt,
791  double psi,
792  MultidimArray<double> &result);
804  double angCircle, double angStep, std::vector<double> &outputEulerAngles);
806 
809 
818  const Matrix1D< double >& r);
819 
832  const Matrix1D< double >& r);
833 
842  const Matrix1D< double >& r);
844 
845 #endif
double spherical_distance(const Matrix1D< double > &r1, const Matrix1D< double > &r2)
Definition: geometry.cpp:73
bool point_inside_polygon(const std::vector< Matrix1D< double > > &polygon, const Matrix1D< double > &point)
Definition: geometry.cpp:418
double module() const
Definition: matrix1d.h:983
double y0
y0
Definition: geometry.h:288
double point_line_distance_3D(const Matrix1D< double > &p, const Matrix1D< double > &a, const Matrix1D< double > &v)
Definition: geometry.cpp:85
void least_squares_plane_fit(FitPoint *IN_points, int Npoints, double &plane_A, double &plane_B, double &plane_C)
Definition: geometry.cpp:101
void Euler_angles2matrix(T a, T b, T g, Matrix2D< T > &A, bool homogeneous=false)
Definition: geometry.cpp:624
doublereal * g
int lF
lF;
Definition: geometry.h:279
void Euler_direction(double alpha, double beta, double gamma, Matrix1D< double > &v)
Definition: geometry.cpp:721
void Euler_direction2angles(Matrix1D< double > &v, double &alpha, double &beta, double &gamma)
Definition: geometry.cpp:746
double beta(const double a, const double b)
void def_affinity(double u1x, double u1y, double u2x, double u2y, double u3x, double u3y, double t1x, double t1y, double t2x, double t2y, double t3x, double t3y, Matrix2D< double > &A, Matrix1D< double > &T, Matrix2D< double > &invW)
Definition: geometry.cpp:441
double z
z coordinate, assumed to be a function of x and y
Definition: geometry.h:190
void Euler_another_set(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:1002
double x
x coordinate
Definition: geometry.h:186
#define V3_MINUS_V3(a, b, c)
Definition: matrix1d.h:202
void Euler_mirrorY(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:1011
void Bspline_model_fitting(const std::vector< FitPoint > &IN_points, int SplineDegree, int l0, int lF, int m0, int mF, double h_x, double h_y, double x0, double y0, Bspline_model &result)
Definition: geometry.cpp:243
double w
Weight of the point in the Least-Squares problem.
Definition: geometry.h:192
double intersection_unit_cylinder(const Matrix1D< double > &u, const Matrix1D< double > &r)
Definition: geometry.cpp:1151
double x
x coordinate
Definition: geometry.h:234
double * gamma
void Euler_apply_transf(const Matrix2D< double > &L, const Matrix2D< double > &R, double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:1038
int l0
l0
Definition: geometry.h:277
int line_plane_intersection(const Matrix1D< double > normal_plane, const Matrix1D< double > vector_line, Matrix1D< double > &intersection_point, const Matrix1D< double > point_line, double point_plane_at_x_y_zero=0.)
Definition: geometry.cpp:588
double triangle_area(double x1, double y1, double x2, double y2, double x3, double y3)
Definition: geometry.cpp:511
double x0
x0
Definition: geometry.h:286
void computeCircleAroundE(const Matrix2D< double > &E, double angCircle, double angStep, std::vector< double > &outputEulerAngles)
Definition: geometry.cpp:1078
doublereal * b
void box_enclosing(const Matrix1D< double > &v0, const Matrix1D< double > &vF, const Matrix2D< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
Definition: geometry.cpp:366
void Euler_Angles_after_compresion(const double rot, double tilt, double psi, double &new_rot, double &new_tilt, double &new_psi, Matrix2D< double > &D)
Definition: geometry.cpp:955
#define y0
void rectangle_enclosing(const Matrix1D< double > &v0, const Matrix1D< double > &vF, const Matrix2D< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
Definition: geometry.cpp:328
#define x0
double point_plane_distance_3D(const Matrix1D< double > &p, const Matrix1D< double > &a, const Matrix1D< double > &v)
Definition: geometry.h:171
double intersection_unit_sphere(const Matrix1D< double > &u, const Matrix1D< double > &r)
Definition: geometry.cpp:1122
void least_squares_line_fit(const std::vector< fit_point2D > &IN_points, double &line_A, double &line_B)
Definition: geometry.cpp:212
double Euler_distanceBetweenMatrices(const Matrix2D< double > &E1, const Matrix2D< double > &E2)
Definition: geometry.cpp:671
void Euler_mirrorX(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:1020
int SplineDegree
Order of the Bspline.
Definition: geometry.h:291
T Euler_distanceBetweenAngleSets(T rot1, T tilt1, T psi1, T rot2, T tilt2, T psi2, bool only_projdir)
Definition: geometry.cpp:681
void Euler_up_down(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:993
void Euler_mirrorXY(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
Definition: geometry.cpp:1029
double y
y coordinate (assumed to be a function of x)
Definition: geometry.h:236
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
void Euler_rotate(const MultidimArray< double > &V, double rot, double tilt, double psi, MultidimArray< double > &result)
Definition: geometry.cpp:1061
double intersection_unit_cube(const Matrix1D< double > &u, const Matrix1D< double > &r)
Definition: geometry.cpp:1190
double y
y coordinate
Definition: geometry.h:188
double w
Weight of the point in the Least-Squares problem.
Definition: geometry.h:238
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
MultidimArray< double > c_ml
Definition: geometry.h:302
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
Definition: matrix1d.h:1140
void Euler_anglesZXZ2matrix(double a, double b, double g, Matrix2D< double > &A, bool homogeneous=false)
Definition: geometry.cpp:661
double psi(const double x)
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous=false)
Definition: geometry.cpp:839
doublereal * u
float r2
int mF
mF;
Definition: geometry.h:283
T Euler_distanceBetweenAngleSets_fast(const Matrix2D< T > &E1, T rot2, T tilt2, T psi2, bool only_projdir, Matrix2D< T > &E2)
Definition: geometry.cpp:693
double v0
double h_y
Scale Y.
Definition: geometry.h:296
void Uproject_to_plane(const Matrix1D< double > &point, const Matrix1D< double > &direction, double distance, Matrix1D< double > &result)
Definition: geometry.cpp:39
doublereal * a
void least_squares_plane_fit_All_Points(const MultidimArray< double > &Image, double &plane_A, double &plane_B, double &plane_C)
Definition: geometry.cpp:154
float r1
int m0
m0
Definition: geometry.h:281
double h_x
Scale X.
Definition: geometry.h:294