44 if (result.
size() != 3)
46 double xx = distance - (
XX(point) *
XX(direction) +
YY(point) *
YY(direction) +
47 ZZ(point) *
ZZ(direction));
48 XX(result) =
XX(point) + xx *
XX(direction);
49 YY(result) =
YY(point) + xx *
YY(direction);
50 ZZ(result) =
ZZ(point) + xx *
ZZ(direction);
75 double r1r2 =
XX(r1) *
XX(r2) +
YY(r1) *
YY(r2) +
ZZ(r1) *
ZZ(r2);
78 double argument = r1r2 / (R1 * R2);
79 double ang = acos(
CLIP(argument,-1.,1.));
80 double retVal = ang*R1;
120 for (
int i = 0;
i < Npoints;
i++)
122 point = &(IN_points[
i]);
123 W2 = point->
w * point->
w;
124 D += point->
x * point->
x * W2 ;
125 E += point->
x * point->
y * W2 ;
127 G += point->
y * point->
y * W2 ;
130 J += point->
x * point->
z * W2 ;
131 K += point->
y * point->
z * W2 ;
135 denom = F * F * G - 2 * E * F * H + D * H * H + E * E * I - D * G * I;
138 plane_a = (H * H * J - G * I * J + E * I * K + F * G * L - H * (F * K + E * L)) / denom;
140 plane_b = (E * I * J + F * F * K - D * I * K + D * H * L - F * (H * J + E * L)) / denom;
142 plane_c = (F * G * J - E * H * J - E * F * K + D * H * K + E * E * L - D * G * L) / denom;
170 double sumjValues=0.0;
189 sumElements += (*ref);
202 denom = F * F * G - 2 * E * F * H + D * H * H + E * E * I - D * G * I;
205 plane_a = (H * H * J - G * I * J + E * I * K + F * G * L - H * (F * K + E * L)) / denom;
207 plane_b = (E * I * J + F * F * K - D * I * K + D * H * L - F * (H * J + E * L)) / denom;
209 plane_c = (F * G * J - E * H * J - E * F * K + D * H * K + E * E * L - D * G * L) / denom;
225 int n = IN_points.size();
227 for (
int i = 0;
i <
n;
i++)
229 point = &(IN_points[
i]);
230 W2 = point->
w * point->
w;
231 sumx += point->
x * point->
w ;
232 sumy += point->
y * point->
w ;
233 sumxx += point->
x * point->
x * W2 ;
234 sumxy += point->
x * point->
y * W2 ;
237 line_a = (sumx*sumy - sumw*sumxy) / (sumx*sumx - sumw*sumxx) ;
238 line_b = (sumy - line_a*sumx) / sumw ;
244 int SplineDegree,
int l0,
int lF,
int m0,
int mF,
245 double h_x,
double h_y,
double x0,
double y0,
263 int Npoints = IN_points.size();
264 std::vector<FitPoint> AUX_points = IN_points;
265 for (
int i = 0;
i < Npoints; ++
i)
267 double sqrt_w =
sqrt(AUX_points[
i].
w);
268 AUX_points[
i].x *= sqrt_w;
269 AUX_points[
i].y *= sqrt_w;
270 AUX_points[
i].z *= sqrt_w;
281 for (
int i = 0;
i < Npoints; ++
i)
283 B(
i) = AUX_points[
i].z;
284 double xarg = (AUX_points[
i].x -
x0) / h_x;
285 double yarg = (AUX_points[
i].y -
y0) / h_y;
286 for (
int m = m0;
m <= mF; ++
m)
287 for (
int l = l0; l <= lF; ++l)
290 switch (SplineDegree)
317 A(
i, (
m - m0)*
XSIZE(result.
c_ml) + l - l0) = coeff;
322 for (
int m = m0;
m <= mF; ++
m)
323 for (
int l = l0; l <= lF; ++l)
338 double XX_v0 =
XX(v0);
339 double YY_v0 =
YY(v0);
340 double XX_vF =
XX(vF);
341 double YY_vF =
YY(vF);
350 #define DEFORM_AND_CHOOSE_CORNERS2D \ 351 M2x2_BY_V2x1(v,V,v); \ 352 XX(corner1)=XMIPP_MIN(XX(corner1),XX(v)); \ 353 XX(corner2)=XMIPP_MAX(XX(corner2),XX(v)); \ 354 YY(corner1)=XMIPP_MIN(YY(corner1),YY(v)); \ 355 YY(corner2)=XMIPP_MAX(YY(corner2),YY(v)); 376 double XX_v0 =
XX(v0);
377 double YY_v0 =
YY(v0);
378 double ZZ_v0 =
ZZ(v0);
379 double XX_vF =
XX(vF);
380 double YY_vF =
YY(vF);
381 double ZZ_vF =
ZZ(vF);
392 #define DEFORM_AND_CHOOSE_CORNERS3D \ 393 M3x3_BY_V3x1(v,V,v); \ 394 XX(corner1)=XMIPP_MIN(XX(corner1),XX(v)); \ 395 XX(corner2)=XMIPP_MAX(XX(corner2),XX(v)); \ 396 YY(corner1)=XMIPP_MIN(YY(corner1),YY(v)); \ 397 YY(corner2)=XMIPP_MAX(YY(corner2),YY(v)); \ 398 ZZ(corner1)=XMIPP_MIN(ZZ(corner1),ZZ(v)); \ 399 ZZ(corner2)=XMIPP_MAX(ZZ(corner2),ZZ(v)); 423 for (i = 0, j = polygon.size() - 1; i < polygon.size(); j = i++)
425 if ((((
YY(polygon[i]) <=
YY(point)) && (
YY(point) <
YY(polygon[j]))) ||
426 ((
YY(polygon[j]) <=
YY(point)) && (
YY(point) <
YY(polygon[i])))) &&
427 (
XX(point) < (
XX(polygon[j]) -
XX(polygon[i])) *
428 (
YY(point) -
YY(polygon[i])) /
429 (
YY(polygon[j]) -
YY(polygon[i])) +
XX(polygon[i])))
441 void def_affinity(
double u1x,
double u1y,
double u2x,
double u2y,
double u3x,
double u3y,
double t1x,
444 double den = (u1x*u2y - u1y*u2x - u1x*u3y + u1y*u3x + u2x*u3y - u2y*u3x);
472 double dettt = invW.
det();
511 double triangle_area(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3)
513 double trigarea = ((x2 - x1)*(y3 - y1) - (x3 - x1)*(y2 - y1))/2;
514 return (trigarea > 0) ? trigarea : -trigarea;
592 double point_plane_at_x_y_zero)
595 intersection_point.
resize(3);
600 intersection_point = point_line + vector_line;
609 l = -1.0 *
dotProduct(point_line, normal_plane) +
610 point_plane_at_x_y_zero;
613 intersection_point = point_line + l * vector_line;
627 static_assert(std::is_floating_point<T>::value,
"Only float and double are allowed as template parameters");
638 T ca = std::cos(
DEG2RAD(alpha));
639 T sa = std::sin(
DEG2RAD(alpha));
640 T cb = std::cos(
DEG2RAD(beta));
641 T sb = std::sin(
DEG2RAD(beta));
642 T cg = std::cos(
DEG2RAD(gamma));
643 T sg = std::sin(
DEG2RAD(gamma));
650 MAT_ELEM(A, 0, 0) = cg * cc - sg * sa;
651 MAT_ELEM(A, 0, 1) = cg * cs + sg * ca;
653 MAT_ELEM(A, 1, 0) = -sg * cc - cg * sa;
654 MAT_ELEM(A, 1, 1) = -sg * cs + cg * ca;
682 T rot2, T tilt2, T psi2,
685 static_assert(std::is_floating_point<T>::value,
"Only float and double are allowed as template parameters");
694 T rot2, T tilt2, T psi2,
697 static_assert(std::is_floating_point<T>::value,
"Only float and double are allowed as template parameters");
703 T axes_dist=std::acos(
CLIP(aux, -1, 1));
706 for (
int i = 0;
i < 2;
i++)
711 T dist=acos(
CLIP(aux, -1, 1));
724 double ca, sa, cb, sb;
747 double &alpha,
double &
beta,
double &
gamma)
749 double abs_ca, sb, cb;
752 double error, newerror;
764 if (fabs((cb)) > 0.999847695)
766 std::cerr <<
"\nWARNING: Routine Euler_direction2angles is not reliable\n" 767 "for small tilt angles. Up to 0.001 deg it should be OK\n" 768 "for most applications but you never know";
784 abs_ca = fabs(v(0)) / sb;
788 aux_alpha = acos(abs_ca);
790 v_aux(0) = sin(aux_beta) * cos(aux_alpha);
791 v_aux(1) = sin(aux_beta) * sin(aux_alpha);
792 v_aux(2) = cos(aux_beta);
798 v_aux(0) = sin(aux_beta) * cos(-1. * aux_alpha);
799 v_aux(1) = sin(aux_beta) * sin(-1. * aux_alpha);
800 v_aux(2) = cos(aux_beta);
802 if (error > newerror)
804 alpha = -1. * aux_alpha;
809 v_aux(0) = sin(-aux_beta) * cos(-1. * aux_alpha);
810 v_aux(1) = sin(-aux_beta) * sin(-1. * aux_alpha);
811 v_aux(2) = cos(-aux_beta);
813 if (error > newerror)
815 alpha = -1. * aux_alpha;
816 beta = -1. * aux_beta;
820 v_aux(0) = sin(-aux_beta) * cos(aux_alpha);
821 v_aux(1) = sin(-aux_beta) * sin(aux_alpha);
822 v_aux(2) = cos(-aux_beta);
825 if (error > newerror)
828 beta = -1. * aux_beta;
840 double &
beta,
double &
gamma,
bool homogeneous)
842 double abs_sb, sign_sb;
851 abs_sb =
sqrt(A(0, 2) * A(0, 2) + A(1, 2) * A(1, 2));
854 gamma = atan2(A(1, 2), -A(0, 2));
855 alpha = atan2(A(2, 1), A(2, 0));
857 sign_sb =
SGN(-A(0, 2) / cos(gamma));
861 sign_sb = (sin(gamma) > 0) ?
SGN(A(1, 2)) : -
SGN(A(1, 2));
862 beta = atan2(sign_sb * abs_sb, A(2, 2));
866 if (
SGN(A(2, 2)) > 0)
871 gamma = atan2(-A(1, 0), A(0, 0));
877 gamma = atan2(A(1, 0), -A(0, 0));
891 std::cout <<
"---\n";
892 std::cout <<
"Euler_matrix2angles: I have computed angles " 893 " which doesn't match with the original matrix\n";
894 std::cout <<
"Original matrix\n" << A;
895 std::cout <<
"Computed angles alpha=" << alpha <<
" beta=" << beta
896 <<
" gamma=" << gamma << std::endl;
897 std::cout <<
"New matrix\n" << Ap;
898 std::cout <<
"---\n";
903 std::cout <<
"abs_sb " << abs_sb << std::endl;
904 std::cout <<
"A(1,2) " << A(1, 2) <<
" A(0,2) " << A(0, 2) <<
" gamma " 905 << gamma << std::endl;
906 std::cout <<
"A(2,1) " << A(2, 1) <<
" A(2,0) " << A(2, 0) <<
" alpha " 907 << alpha << std::endl;
908 std::cout <<
"sign sb " << sign_sb <<
" A(2,2) " << A(2, 2)
909 <<
" beta " << beta << std::endl;
924 abs_sb =
sqrt((-A(2, 2) * A(1, 2) * A(2, 1) - A(0, 2) * A(2, 0)) / A(1, 1));
928 abs_sb =
sqrt((-A(2, 1) * A(2, 2) * A(0, 2) + A(2, 0) * A(1, 2)) / A(0, 1));
932 abs_sb =
sqrt((-A(2, 0) * A(2, 2) * A(0, 2) - A(2, 1) * A(1, 2)) / A(0, 0));
935 EXIT_ERROR(1,
"Don't know how to extract angles");
939 *
beta = atan2(abs_sb, A(2, 2));
940 *alpha = atan2(A(2, 1) / abs_sb, A(2, 0) / abs_sb);
941 *gamma = atan2(A(1, 2) / abs_sb, -A(0, 2) / abs_sb);
947 *gamma = atan2(A(1, 0), A(0, 0));
950 *gamma = rad2deg(*gamma);
952 *alpha = rad2deg(*alpha);
966 if (fabs(
w(2)) > 0.999847695)
974 new_tilt =
SGN(new_tilt) * fabs(
ACOSD(new_w(2)));
994 double &newrot,
double &newtilt,
double &newpsi)
997 newtilt = tilt + 180;
998 newpsi = -(180 +
psi);
1003 double &newrot,
double &newtilt,
double &newpsi)
1007 newpsi = -180 +
psi;
1012 double &newrot,
double &newtilt,
double &newpsi)
1015 newtilt = tilt + 180;
1021 double &newrot,
double &newtilt,
double &newpsi)
1024 newtilt = tilt + 180;
1030 double &newrot,
double &newtilt,
double &newpsi)
1050 temp = L * euler * R;
1066 applyGeometry(1, result, V, R, xmipp_transformation::IS_NOT_INV, xmipp_transformation::DONT_WRAP);
1073 #define APPLYGEO(type) applyGeometry(1, result, *((MultidimArray<type> *)V.im), R, xmipp_transformation::IS_NOT_INV, xmipp_transformation::DONT_WRAP); 1079 double angCircle,
double angStep, std::vector<double> &outputEulerAngles)
1081 outputEulerAngles.clear();
1085 E.
getRow(1,perpendicular);
1086 E.
getRow(2,projectionDirection);
1094 newEt = rotStep*newEt;
1095 for (
double i = 0;
i < 360;
i += angStep)
1097 newEt=sampling*newEt;
1100 for (
int c=0;
c<3;
c++)
1103 newEt.getCol(
c,aux);
1105 newEt.setCol(
c,aux);
1109 double newrot, newtilt, newpsi;
1111 outputEulerAngles.push_back(newrot);
1112 outputEulerAngles.push_back(newtilt);
1113 outputEulerAngles.push_back(newpsi);
1128 double A =
XX(u) *
XX(u) +
YY(u) *
YY(u) +
ZZ(u) *
ZZ(u);
1129 double B =
XX(r) *
XX(u) +
YY(r) *
YY(u) +
ZZ(r) *
ZZ(u);
1130 double C =
XX(r) *
XX(r) +
YY(r) *
YY(r) +
ZZ(r) *
ZZ(r) - 1.0;
1131 double B2_AC = B * B - A * C;
1144 B2_AC =
sqrt(B2_AC);
1145 double t1 = (-B - B2_AC) / A;
1146 double t2 = (-B + B2_AC) / A;
1156 double A =
XX(u) *
XX(u) +
YY(u) *
YY(u);
1157 double B =
XX(r) *
XX(u) +
YY(r) *
YY(u);
1158 double C =
XX(r) *
XX(r) +
YY(r) *
YY(r) - 1;
1160 double B2_AC = B * B - A * C;
1170 B2_AC =
sqrt(B2_AC);
1173 double t1 = (-B - B2_AC) / A;
1174 double t2 = (-B + B2_AC) / A;
1175 double z1 =
ZZ(r) + t1 *
ZZ(u);
1176 double z2 =
ZZ(r) + t2 *
ZZ(u);
1182 t1 = (
SGN(z1) * 0.5 -
ZZ(r)) /
ZZ(u);
1184 t2 = (
SGN(z2) * 0.5 -
ZZ(r)) /
ZZ(u);
1194 double t1=0., t2=0., t;
1197 #define ASSIGN_IF_GOOD_ONE \ 1198 if (fabs(XX(r)+t*XX(u))-XMIPP_EQUAL_ACCURACY<=0.5 && \ 1199 fabs(YY(r)+t*YY(u))-XMIPP_EQUAL_ACCURACY<=0.5 && \ 1200 fabs(ZZ(r)+t*ZZ(u))-XMIPP_EQUAL_ACCURACY<=0.5) {\ 1201 if (found_t==0) {found_t++; t1=t;} \ 1202 else if (found_t==1) {found_t++; t2=t;} \ 1208 t = (0.5 -
XX(r)) /
XX(u);
1210 t = (-0.5 -
XX(r)) /
XX(u);
1215 if (
YY(u) != 0 && found_t != 2)
1217 t = (0.5 -
YY(r)) /
YY(u);
1219 t = (-0.5 -
YY(r)) /
YY(u);
1224 if (
ZZ(u) != 0 && found_t != 2)
1226 t = (0.5 -
ZZ(r)) /
ZZ(u);
1228 t = (-0.5 -
ZZ(r)) /
ZZ(u);
1233 return fabs(t1 -t2);
1241 double x_arg = (x -
x0) /
h_x;
1242 double y_arg = (y -
y0) /
h_y;
1248 double columns = 0.0;
1249 for (
int m = m1;
m <= m2;
m++)
1252 for (
int l = l1; l <= l2; l++)
1254 double xminusl = x_arg - (double)l;
1255 double Coeff =
c_ml(
m, l);
1285 double yminusm = y_arg - (double)
m;
1321 float rot1,
float tilt1,
float psi1,
float rot2,
float tilt2,
float psi2,
1324 double rot1,
double tilt1,
double psi1,
double rot2,
double tilt2,
double psi2,
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
#define VECTOR_R2(v, x, y)
#define ASSIGN_IF_GOOD_ONE
double spherical_distance(const Matrix1D< double > &r1, const Matrix1D< double > &r2)
#define A2D_ELEM(v, i, j)
double Bspline05(double Argument)
bool point_inside_polygon(const std::vector< Matrix1D< double > > &polygon, const Matrix1D< double > &point)
double point_line_distance_3D(const Matrix1D< double > &p, const Matrix1D< double > &a, const Matrix1D< double > &v)
void least_squares_plane_fit(FitPoint *IN_points, int Npoints, double &plane_a, double &plane_b, double &plane_c)
#define REPORT_ERROR(nerr, ErrormMsg)
Problem with matrix size.
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
template void Euler_angles2matrix< double >(double, double, double, Matrix2D< double > &, bool)
void Euler_direction(double alpha, double beta, double gamma, Matrix1D< double > &v)
void Euler_direction2angles(Matrix1D< double > &v0, double &alpha, double &beta, double &gamma)
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)
double z
z coordinate, assumed to be a function of x and y
void Euler_another_set(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
void sqrt(Image< double > &op)
#define V3_MINUS_V3(a, b, c)
void Euler_mirrorY(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
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)
void inv(Matrix2D< T > &result) const
double w
Weight of the point in the Least-Squares problem.
Matrix2D< T > transpose() const
Matrix1D< T > vectorProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
double intersection_unit_cylinder(const Matrix1D< double > &u, const Matrix1D< double > &r)
void Euler_apply_transf(const Matrix2D< double > &L, const Matrix2D< double > &R, double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
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)
double triangle_area(double x1, double y1, double x2, double y2, double x3, double y3)
#define DEFORM_AND_CHOOSE_CORNERS3D
double Bspline04(double Argument)
void resizeNoCopy(int Ydim, int Xdim)
void computeCircleAroundE(const Matrix2D< double > &E, double angCircle, double angStep, std::vector< double > &outputEulerAngles)
#define MAT_ELEM(m, i, j)
template double Euler_distanceBetweenAngleSets< double >(double rot1, double tilt1, double psi1, double rot2, double tilt2, double psi2, bool only_projdir)
void box_enclosing(const Matrix1D< double > &v0, const Matrix1D< double > &vF, const Matrix2D< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
void Euler_Angles_after_compresion(const double rot, double tilt, double psi, double &new_rot, double &new_tilt, double &new_psi, Matrix2D< double > &D)
void rectangle_enclosing(const Matrix1D< double > &v0, const Matrix1D< double > &vF, const Matrix2D< double > &V, Matrix1D< double > &corner1, Matrix1D< double > &corner2)
#define M2x2_BY_V2x1(a, M, b)
double intersection_unit_sphere(const Matrix1D< double > &u, const Matrix1D< double > &r)
void least_squares_line_fit(const std::vector< fit_point2D > &IN_points, double &line_a, double &line_b)
#define XMIPP_EQUAL_ACCURACY
double Euler_distanceBetweenMatrices(const Matrix2D< double > &E1, const Matrix2D< double > &E2)
template double Euler_distanceBetweenAngleSets_fast< double >(const Matrix2D< double > &E1, double rot2, double tilt2, double psi2, bool only_projdir, Matrix2D< double > &E2)
void resize(size_t Xdim, bool copy=true)
void Euler_mirrorX(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
int SplineDegree
Order of the Bspline.
double Bspline03(double Argument)
T Euler_distanceBetweenAngleSets(T rot1, T tilt1, T psi1, T rot2, T tilt2, T psi2, bool only_projdir)
void Euler_up_down(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
double Bspline07(double Argument)
void Euler_mirrorXY(double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
double Bspline08(double Argument)
double y
y coordinate (assumed to be a function of x)
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)
double intersection_unit_cube(const Matrix1D< double > &u, const Matrix1D< double > &r)
template void Euler_angles2matrix< float >(float, float, float, Matrix2D< float > &, bool)
#define M3x3_BY_V3x1(a, M, b)
double w
Weight of the point in the Least-Squares problem.
TYPE distance(struct Point_T *p, struct Point_T *q)
double Bspline02(double Argument)
#define DEFORM_AND_CHOOSE_CORNERS2D
double evaluate(double x, double y) const
Evaluate the model at the point (x,y)
MultidimArray< double > c_ml
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
void Euler_anglesZXZ2matrix(double a, double b, double g, Matrix2D< double > &A, bool homogeneous)
double psi(const double x)
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous)
#define VECTOR_R3(v, x, y, z)
double Bspline09(double Argument)
template float Euler_distanceBetweenAngleSets< float >(float rot1, float tilt1, float psi1, float rot2, float tilt2, float psi2, bool only_projdir)
void initZeros(const MultidimArray< T1 > &op)
T Euler_distanceBetweenAngleSets_fast(const Matrix2D< T > &E1, T rot2, T tilt2, T psi2, bool only_projdir, Matrix2D< T > &E2)
double Bspline06(double Argument)
void getRow(size_t i, Matrix1D< T > &v) const
void Uproject_to_plane(const Matrix1D< double > &point, const Matrix1D< double > &direction, double distance, Matrix1D< double > &result)
void least_squares_plane_fit_All_Points(const MultidimArray< double > &Image, double &plane_a, double &plane_b, double &plane_c)
#define SWITCHDATATYPE(datatype, OP)
#define SPEED_UP_temps012