#pragma once #include "BaseTool.h" /// /// //#define EIGEN_USE_MKL_ALL //#define EIGEN_VECTORIZE_SSE4_2 //#include #include "referenceHeader.h" #include #include #include #include //#include #include #include #include < io.h > #include < stdio.h > #include < stdlib.h > #include #include #include //#include #include //#include "ogrsf_frmts.h" #include #include #include "GeoOperator.h" #include "baseTool.h" using namespace std; using namespace Eigen; QString getCurrentTimeString() { struct tm ConversionTime; std::time_t t = std::time(NULL); char mbstr[100]; _localtime64_s(&ConversionTime, &t); std::strftime(mbstr, sizeof(mbstr), "%Y-%m-%d %H:%M:%S", &ConversionTime); QString strTime = mbstr; return strTime; } QString getCurrentShortTimeString() { struct tm ConversionTime; std::time_t t = std::time(NULL); char mbstr[100]; _localtime64_s(&ConversionTime, &t); std::strftime(mbstr, sizeof(mbstr), "%Y-%m-%d %H:%M:%S", &ConversionTime); QString strTime = mbstr; return strTime; } std::vector splitString(const QString& str, char delimiter) { QStringList tokens = str.split(delimiter); return convertQStringListToStdVector(tokens); } complex Cubic_Convolution_interpolation(double u, double v, Eigen::MatrixX> img) { if (img.rows() != 4 || img.cols() != 4) { throw exception("the size of img's block is not right"); } // 斤拷锟斤拷模锟斤拷 Eigen::MatrixX> wrc(1, 4);// 使锟斤拷 complex 斤拷锟斤拷要原斤拷为锟剿伙拷取值 Eigen::MatrixX> wcr(4, 1);// for (int i = 0; i < 4; i++) { wrc(0, i) = Cubic_kernel_weight(u + 1 - i); // u+1,u,u-1,u-2 wcr(i, 0) = Cubic_kernel_weight(v + 1 - i); } Eigen::MatrixX> interValue = wrc * img * wcr; return interValue(0, 0); } complex Cubic_kernel_weight(double s) { s = abs(s); if (s <= 1) { return complex(1.5 * s * s * s - 2.5 * s * s + 1, 0); } else if (s <= 2) { return complex(-0.5 * s * s * s + 2.5 * s * s - 4 * s + 2, 0); } else { return complex(0, 0); } } /// /// p11 p12 -- x /// p0(u,v) /// p21 p22 /// | /// y /// p11(0,0) /// p21(0,1) /// P12(1,0) /// p22(1,1) /// /// x,y,z /// x,y,z /// x,y,z /// x,y,z /// x,y,z /// double Bilinear_interpolation(Landpoint p0, Landpoint p11, Landpoint p21, Landpoint p12, Landpoint p22) { return p11.ati * (1 - p0.lon) * (1 - p0.lat) + p12.ati * p0.lon * (1 - p0.lat) + p21.ati * (1 - p0.lon) * p0.lat + p22.ati * p0.lon * p0.lat; } bool onSegment(Point_3d Pi, Point_3d Pj, Point_3d Q) { if ((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y) //叉乘 //保证Q点坐标在pi,pj之间 && min(Pi.x, Pj.x) <= Q.x && Q.x <= max(Pi.x, Pj.x) && min(Pi.y, Pj.y) <= Q.y && Q.y <= max(Pi.y, Pj.y)) return true; else return false; } Point_3d invBilinear(Point_3d p, Point_3d a, Point_3d b, Point_3d c, Point_3d d) { Point_3d res; Point_3d e = b - a; Point_3d f = d - a; Point_3d g = a - b + c - d; Point_3d h = p - a; double k2 = cross2d(g, f); double k1 = cross2d(e, f) + cross2d(h, g); double k0 = cross2d(h, e); double u, v; // if edges are parallel, this is a linear equation if (abs(k2) < 0.001) { v = -k0 / k1; u = (h.x - f.x * v) / (e.x + g.x * v); p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v; return p; } // otherwise, it's a quadratic else { float w = k1 * k1 - 4.0 * k0 * k2; if (w < 0.0) { // 可能在边界上 if (onSegment(a, b, p)) { Point_3d tt = b - a; Point_3d ttpa = p - a; double scater = ttpa / tt; if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; } p.z = a.z + scater * tt.z; return p; } else if (onSegment(b, c, p)) { Point_3d tt = c - b; Point_3d ttpa = p - b; double scater = ttpa / tt; if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; } p.z = b.z + scater * tt.z; return p; } else if (onSegment(c, d, p)) { Point_3d tt = d - c; Point_3d ttpa = p - c; double scater = ttpa / tt; if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; } p.z = c.z + scater * tt.z; return p; } else if (onSegment(d, a, p)) { Point_3d tt = a - d; Point_3d ttpa = p - d; double scater = ttpa / tt; if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; } p.z = d.z + scater * tt.z; return p; } return { -9999,-9999,-9999 }; } else { w = sqrt(w); float ik2 = 0.5 / k2; float v = (-k1 - w) * ik2; float u = (h.x - f.x * v) / (e.x + g.x * v); if (u < 0.0 || u>1.0 || v < 0.0 || v>1.0) { v = (-k1 + w) * ik2; u = (h.x - f.x * v) / (e.x + g.x * v); } p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v; return p; } } p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v; return p; } double sind(double degree) { return sin(degree * d2r); } double cosd(double d) { return cos(d * d2r); } string Convert(float Num) { ostringstream oss; oss << Num; string str(oss.str()); return str; } QString JoinPath(const QString& path, const QString& filename) { QDir dir(path); // Ensure the path ends with the appropriate separator if (!QDir::isAbsolutePath(path)) dir.makeAbsolute(); return dir.filePath(filename); } std::vector convertQStringListToStdVector(const QStringList& qStringList) { std::vector stdVector; for (const QString& str : qStringList) { stdVector.push_back(str); } return stdVector; };