204 lines
3.9 KiB
C++
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;
|
|
}
|