libtin/demo.cpp

146 lines
3.9 KiB
C++
Raw Normal View History

2021-09-22 16:36:30 +08:00
#include "tin.h"
2021-09-15 16:55:14 +08:00
#include "iostream"
2021-09-15 23:39:19 +08:00
#include "fstream"
#include "iomanip"
2021-09-15 16:55:14 +08:00
2021-09-27 20:19:42 +08:00
#include "gctl/utility.h"
#define GRID_FILE "grid-file|grid_file"
#define GRID_PARA "grid-para|grid_para"
#define MAXI_ERR "maxi-error|maxi_error"
#define LOG_FILE "log-file|log_file"
#define NEIGH_FILE "neighbor-file|neighbor_file|neigh-file|neigh_file"
#define SINGLE_Z "single-z"
2021-09-15 16:55:14 +08:00
int main(int argc, char const *argv[])
{
2021-09-27 20:19:42 +08:00
if (argc < 2)
{
std::cerr << "Usage: ./tin <config-file>\n";
2021-09-27 20:24:35 +08:00
std::cerr << "Options:\n";
std::cerr << "grid-file = <filename>\n";
std::cerr << "grid-para = <xmin>/<dx>/<xmax>/<ymin>/<dy>/<ymax>\n";
std::cerr << "maxi-error = <value > 0>\n";
std::cerr << "log-file = <filename> (optional)\n";
std::cerr << "neighbor-file = <filename> (optional)\n";
std::cerr << "single-z = yes|no\n";
2021-09-27 20:19:42 +08:00
return -1;
}
gctl::getoption gopt(argv[1]);
gopt.show_options();
2021-09-15 23:39:19 +08:00
// read dem grid
2021-09-27 20:19:42 +08:00
double xmin, xmax, ymin, ymax, dx, dy;
gctl::parse_string_to_value(gopt.get_value(GRID_PARA), '/', xmin, dx, xmax, ymin, dy, ymax);
int xnum = round((xmax - xmin)/dx) + 1;
int ynum = round((ymax - ymin)/dy) + 1;
std::vector<double> topo(xnum*ynum);
2021-09-15 23:39:19 +08:00
2021-09-27 20:19:42 +08:00
double tmp_d;
std::ifstream infile(gopt.get_value(GRID_FILE));
if (gopt.get_value(SINGLE_Z, false) != "NullValue")
2021-09-15 23:39:19 +08:00
{
2021-09-27 20:19:42 +08:00
for (int i = 0; i < xnum*ynum; ++i)
{
infile >> topo[i];
}
infile.close();
}
else
{
for (int i = 0; i < xnum*ynum; ++i)
{
infile >> tmp_d >> tmp_d >> topo[i];
}
infile.close();
2021-09-15 23:39:19 +08:00
}
2021-09-27 20:19:42 +08:00
double maxi_err = std::atof(gopt.get_value(MAXI_ERR).c_str());
2021-09-16 17:09:53 +08:00
std::vector<double> err_records;
2021-09-15 23:39:19 +08:00
std::vector<vertex2dc*> tin_vert;
std::vector<triangle*> tin_ele;
2021-09-27 20:19:42 +08:00
dem2tin(topo, xmin, xmax, ymin, ymax, dx, dy, tin_vert, tin_ele, maxi_err, &err_records);
2021-09-15 23:39:19 +08:00
// Write a Gmsh's .msh file
2021-09-27 20:19:42 +08:00
std::ofstream outfile(gopt.get_value(GRID_FILE)+".msh");
2021-09-15 23:39:19 +08:00
outfile << "$MeshFormat" << std::endl << "2.2 0 8" << std::endl << "$EndMeshFormat "<<std::endl;
outfile << "$Nodes" << std::endl << tin_vert.size() << std::endl;
for (int i = 0; i < tin_vert.size(); i++)
{
outfile << tin_vert[i]->id + 1 << " " << std::setprecision(16)
<< tin_vert[i]->x << " " << tin_vert[i]->y << " " << tin_vert[i]->elev << std::endl;
}
outfile<<"$EndNodes"<<std::endl;
outfile << "$Elements" << std::endl << tin_ele.size() <<std::endl;
for (int i = 0; i < tin_ele.size(); i++)
{
outfile << i + 1 << " 2 0";
for (int j = 0; j < 3; j++)
{
outfile << " " << tin_ele[i]->vert[j]->id + 1;
}
outfile << std::endl;
}
outfile << "$EndElements"<< std::endl;
outfile<<"$NodeData"<<std::endl;
outfile<<1<<std::endl
<<"\"Topography (m)\"" <<std::endl
<< 1 <<std::endl<< 0.0 <<std::endl
<< 3 <<std::endl<< 0<<std::endl
<< 1 <<std::endl<< tin_vert.size() <<std::endl;
for (int i = 0; i < tin_vert.size(); i++)
{
outfile << tin_vert[i]->id + 1 << " " << std::setprecision(16) << tin_vert[i]->elev << std::endl;
}
outfile << "$EndNodeData" << std::endl;
outfile.close();
2021-09-22 08:53:23 +08:00
// write a neighbor file
2021-09-27 20:19:42 +08:00
std::string neigh_name = gopt.get_value(NEIGH_FILE, false);
if (neigh_name != "NullValue")
2021-09-22 08:53:23 +08:00
{
2021-09-27 20:19:42 +08:00
outfile.open(neigh_name+".neigh");
outfile << tin_ele.size() << std::endl;
for (int i = 0; i < tin_ele.size(); i++)
2021-09-22 08:53:23 +08:00
{
2021-09-27 20:19:42 +08:00
outfile << i + 1;
for (int j = 0; j < 3; j++)
2021-09-22 08:53:23 +08:00
{
2021-09-27 20:19:42 +08:00
if (tin_ele[i]->neigh[j] != nullptr)
{
outfile << " " << tin_ele[i]->neigh[j]->id + 1;
}
else outfile << " -1";
2021-09-22 08:53:23 +08:00
}
2021-09-27 20:19:42 +08:00
outfile << std::endl;
2021-09-22 08:53:23 +08:00
}
2021-09-27 20:19:42 +08:00
outfile.close();
}
// Write a log file
std::string log_name = gopt.get_value(LOG_FILE, false);
if (log_name != "NullValue")
{
std::ofstream logfile(log_name+".log");
logfile << "# Insertion Maxi-Error\n";
for (int i = 0; i < err_records.size(); ++i)
{
logfile << i+1 << " " << err_records[i] << std::endl;
}
logfile.close();
2021-09-22 08:53:23 +08:00
}
2021-09-15 23:39:19 +08:00
// Destroy memories allocated by the dem2tin function
for (int i = 0; i < tin_vert.size(); ++i)
{
delete tin_vert[i];
}
for (int i = 0; i < tin_ele.size(); ++i)
{
delete tin_ele[i];
}
2021-09-15 16:55:14 +08:00
return 0;
}