gctl_toolkits/archive/xyzdiff/datafunc.h
2024-09-10 20:25:18 +08:00

204 lines
3.9 KiB
C++

#include "iostream"
#include "fstream"
#include "iomanip"
#include "stdio.h"
#include "stdlib.h"
#include "cmath"
#include "string.h"
#include "sstream"
#include "vector"
#define ADD "-a"
#define MINUS "-m"
#define RANGE "-r"
#define INTERVAL "-i"
#define OUTFILE "-o"
#define BOLDRED "\033[1m\033[31m"
#define RESET "\033[0m"
#define MAX 1e+30
using namespace std;
typedef vector<double> _1dArray;
int xyz_add_minus(char* filename1,
char* filename2,
char* outname,
double* range,
double* interval,
int caltype)
{
string temp_str;
stringstream temp_ss;
double xmin,xmax,ymin,ymax,dx,dy;
double x,y,data;
xmin = *range; xmax = *(range+1);
ymin = *(range+2); ymax = *(range+3);
dx = *interval; dy = *(interval+1);
int M = int (xmax - xmin)/dx + 1;
int N = int (ymax - ymin)/dy + 1;
double** data1 = new double* [M];
for (int i=0;i<M;i++)
data1[i] = new double [N];
double** data2 = new double* [M];
for (int i=0;i<M;i++)
data2[i] = new double [N];
ifstream infile1(filename1);
ifstream infile2(filename2);
if(!infile1||!infile2) return -1;
for (int i = 0; i < M*N; i++)
{
getline(infile1,temp_str);
if (*(temp_str.begin()) == '#') continue;
else
{
temp_ss.clear();
temp_ss << temp_str;
if (temp_ss >> x >> y >> data)
{
data1[int ((x - xmin)/dx)][int ((y - ymin)/dy)] = data;
}
else cout << "wrong enterence of " << filename1 << ": " << temp_str << endl;
}
}
for (int i = 0; i < M*N; i++)
{
getline(infile2,temp_str);
if (*(temp_str.begin()) == '#') continue;
else
{
temp_ss.clear();
temp_ss << temp_str;
if (temp_ss >> x >> y >> data)
{
data2[int ((x - xmin)/dx)][int ((y - ymin)/dy)] = data;
}
else cout << "wrong enterence of " << filename2 << ": " << temp_str << endl;
}
}
infile1.close();
infile2.close();
ofstream outfile(outname);
if (caltype==1)
{
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
outfile << xmin+dx*i << " " << ymin+dy*j << " " << setprecision(16) << data1[i][j] - data2[i][j] << endl;
}
}
}
else if (caltype==2)
{
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
outfile << xmin+dx*i << " " << ymin+dy*j << " " << setprecision(16) << data1[i][j] + data2[i][j] << endl;
}
}
}
else
{
cout<<"error - wrong caltype"<<endl;
return -1;
}
outfile.close();
for (int i=0;i<M;i++)
delete[] data1[i];
delete[] data1;
for (int i=0;i<M;i++)
delete[] data2[i];
delete[] data2;
return 0;
}
int xyz_add_minus(char* filename1,
char* filename2,
char* outname,
int caltype)
{
string temp_str;
stringstream temp_ss;
_1dArray x,y,data,data2;
double temp_x,temp_y,temp_data;
ifstream infile1(filename1);
ifstream infile2(filename2);
if(!infile1||!infile2) return -1;
while(getline(infile1,temp_str))
{
if (*(temp_str.begin()) == '#') continue;
else
{
temp_ss.clear();
temp_ss << temp_str;
if (temp_ss >> temp_x >> temp_y >> temp_data)
{
x.push_back(temp_x);
y.push_back(temp_y);
data.push_back(temp_data);
}
else cout << "wrong enterence of " << filename1 << ": " << temp_str << endl;
}
}
while(getline(infile2,temp_str))
{
if (*(temp_str.begin()) == '#') continue;
else
{
temp_ss.clear();
temp_ss << temp_str;
if (temp_ss >> temp_x >> temp_y >> temp_data)
{
x.push_back(temp_x);
y.push_back(temp_y);
data2.push_back(temp_data);
}
else cout << "wrong enterence of " << filename2 << ": " << temp_str << endl;
}
}
infile1.close();
infile2.close();
ofstream outfile(outname);
if (caltype==1)
{
for (int i = 0; i < data.size(); i++)
{
outfile << x.at(i) << " " << y.at(i) << " " << setprecision(16) << data.at(i) - data2.at(i) << endl;
}
}
else if (caltype==2)
{
for (int i = 0; i < data.size(); i++)
{
outfile << x.at(i) << " " << y.at(i) << " " << setprecision(16) << data.at(i) + data2.at(i) << endl;
}
}
else
{
cout<<"error - wrong caltype"<<endl;
return -1;
}
outfile.close();
return 0;
}