#include "iostream" #include "fstream" #include "iomanip" #include "stdio.h" #include "stdlib.h" #include "unistd.h" #include "cmath" #include "string.h" #include "sstream" #include "vector" #include "string.h" #define pi (atan(1.0)*4.0) #define BOLDRED "\033[1m\033[31m" #define RESET "\033[0m" using namespace std; struct dpoint { double x,y,val; dpoint() { x = y = val = 0.0; } }; typedef vector _dpointArray; typedef vector _1dArray; int open_infile(ifstream &infile,char* filename) { infile.open(filename); if (!infile) { cout << BOLDRED << "error ==> " << RESET << "file not found: " << filename << endl; return -1; } return 0; } int open_outfile(ofstream &outfile,char* filename) { outfile.open(filename); if (!outfile) { cout << BOLDRED << "error ==> " << RESET << "fail to create the file: " << filename << endl; return -1; } return 0; } class linearmap { public: linearmap(){} ~linearmap(){} _dpointArray readxyz(char*,char*,char*,char*); int outRes(char*); int thetaMap(char*,char*,char*,char*,char*,char*); int THDR(char*,char*,char*,char*,char*,char*); int ASA(char*,char*,char*,char*,char*,char*,char*); int TAHG(char*,char*,char*,char*,char*,char*,char*); private: _dpointArray gradx; _dpointArray grady; _dpointArray gradz; _dpointArray res; }; _dpointArray linearmap::readxyz(char* filename,char* range,char* interval,char* order) { _dpointArray input_data; _1dArray tempRow; double x,y,data,temp_d; double xmin,xmax,ymin,ymax; double dx,dy; int xnum,ynum; int orders[3]; int data_index; string temp_str; stringstream temp_ss; //解析数据范围 if (4 != sscanf(range,"%lf/%lf/%lf/%lf",&xmin,&xmax,&ymin,&ymax)) { cout << BOLDRED << "error ==> " << RESET << "wrong range parameters for the file: " << filename << endl; return input_data; } else if (2 != sscanf(interval,"%lf/%lf",&dx,&dy)) { cout << BOLDRED << "error ==> " << RESET << "wrong interval parameters for the file: " << filename << endl; return input_data; } else if (3 != sscanf(order,"%d,%d,%d",&orders[0],&orders[1],&orders[2])) { cout << BOLDRED << "error ==> " << RESET << "wrong order parameters for the file: " << filename << endl; return input_data; } //打开文件 ifstream datain; if (open_infile(datain,filename)) return input_data; //设置input_data大小 xnum = round((xmax-xmin)/dx)+1; ynum = round((ymax-ymin)/dy)+1; input_data.resize(xnum*ynum); //读入数据 while (getline(datain,temp_str)) { if (*(temp_str.begin()) == '#') continue; else { //读入行 temp_ss.str(""); temp_ss.clear(); temp_ss.str(temp_str); //解析数据行 if(!tempRow.empty()) tempRow.clear(); while (temp_ss >> temp_d) { tempRow.push_back(temp_d); } //读入指定位置的数据 x = tempRow.at(orders[0]); y = tempRow.at(orders[1]); data = tempRow.at(orders[2]); //存入input_data 从左下到右上 data_index = round((x-xmin)/dx) + round((y-ymin)/dy)*xnum; input_data.at(data_index).x = x; input_data.at(data_index).y = y; input_data.at(data_index).val = data; } } datain.close(); return input_data; } int linearmap::outRes(char* filename) { ofstream outfile; if (open_outfile(outfile,filename)) return -1; for (int i = 0; i < res.size(); i++) { outfile << res.at(i).x << " " << res.at(i).y << " " << setprecision(16) << res.at(i).val << endl; } outfile.close(); return 0; } int linearmap::thetaMap(char* xfile,char* zfile,char* ofile,char* ran,char* inter,char* col) { gradx = readxyz(xfile,ran,inter,col); if (gradx.empty()) return -1; gradz = readxyz(zfile,ran,inter,col); if (gradz.empty()) return -1; if (gradx.size() != gradz.size()) { cout << BOLDRED << "error ==> " << RESET << "data amount does not match for thetaMap" << endl; return -1; } res.resize(gradx.size()); for (int i = 0; i < res.size(); i++) { res.at(i).x = gradx.at(i).x; res.at(i).y = gradx.at(i).y; if (fabs(gradx.at(i).val) < 1e-20 && gradz.at(i).val > 0) { res.at(i).val = 0.5*pi; } else if (fabs(gradx.at(i).val) < 1e-20 && gradz.at(i).val < 0) { res.at(i).val = -0.5*pi; } else res.at(i).val = atan(gradz.at(i).val/gradx.at(i).val); //转换为度 res.at(i).val = res.at(i).val*180.0/pi; } if (outRes(ofile)) return -1; return 0; } int linearmap::THDR(char* xfile,char* yfile,char* ofile,char* ran,char* inter,char* col) { gradx = readxyz(xfile,ran,inter,col); if (gradx.empty()) return -1; grady = readxyz(yfile,ran,inter,col); if (grady.empty()) return -1; if (gradx.size() != grady.size()) { cout << BOLDRED << "error ==> " << RESET << "data amount does not match for thetaMap" << endl; return -1; } res.resize(gradx.size()); for (int i = 0; i < res.size(); i++) { res.at(i).x = gradx.at(i).x; res.at(i).y = gradx.at(i).y; res.at(i).val = sqrt(grady.at(i).val*grady.at(i).val + gradx.at(i).val*gradx.at(i).val); } if (outRes(ofile)) return -1; return 0; } int linearmap::ASA(char* xfile,char* yfile,char* zfile,char* ofile,char* ran,char* inter,char* col) { gradx = readxyz(xfile,ran,inter,col); if (gradx.empty()) return -1; grady = readxyz(yfile,ran,inter,col); if (grady.empty()) return -1; gradz = readxyz(zfile,ran,inter,col); if (gradz.empty()) return -1; if (gradx.size() != grady.size() || gradx.size() != gradz.size() || grady.size() != gradz.size()) { cout << BOLDRED << "error ==> " << RESET << "data amount does not match for thetaMap" << endl; return -1; } res.resize(gradx.size()); for (int i = 0; i < res.size(); i++) { res.at(i).x = gradx.at(i).x; res.at(i).y = gradx.at(i).y; res.at(i).val = sqrt(grady.at(i).val*grady.at(i).val + gradx.at(i).val*gradx.at(i).val + gradz.at(i).val*gradz.at(i).val); } if (outRes(ofile)) return -1; return 0; } int linearmap::TAHG(char* xfile,char* yfile,char* zfile,char* ofile,char* ran,char* inter,char* col) { gradx = readxyz(xfile,ran,inter,col); if (gradx.empty()) return -1; grady = readxyz(yfile,ran,inter,col); if (grady.empty()) return -1; gradz = readxyz(zfile,ran,inter,col); if (gradz.empty()) return -1; if (gradx.size() != grady.size() || gradx.size() != gradz.size() || grady.size() != gradz.size()) { cout << BOLDRED << "error ==> " << RESET << "data amount does not match for thetaMap" << endl; return -1; } res.resize(gradx.size()); for (int i = 0; i < res.size(); i++) { res.at(i).x = gradx.at(i).x; res.at(i).y = gradx.at(i).y; res.at(i).val = sqrt(gradz.at(i).val/sqrt(grady.at(i).val*grady.at(i).val + gradx.at(i).val*gradx.at(i).val)); } if (outRes(ofile)) return -1; return 0; }