#include "tin.h" #include "iostream" #include "fstream" #include "iomanip" #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" int main(int argc, char const *argv[]) { if (argc < 2) { std::cerr << "Usage: ./tin \n"; std::cerr << "Options:\n"; std::cerr << "grid-file = \n"; std::cerr << "grid-para = /////\n"; std::cerr << "maxi-error = 0>\n"; std::cerr << "log-file = (optional)\n"; std::cerr << "neighbor-file = (optional)\n"; std::cerr << "single-z = yes|no\n"; return -1; } gctl::getoption gopt(argv[1]); gopt.show_options(); // read dem grid 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 topo(xnum*ynum); double tmp_d; std::ifstream infile(gopt.get_value(GRID_FILE)); if (gopt.get_value(SINGLE_Z, false) != "NullValue") { 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(); } double maxi_err = std::atof(gopt.get_value(MAXI_ERR).c_str()); std::vector err_records; std::vector tin_vert; std::vector tin_ele; dem2tin(topo, xmin, xmax, ymin, ymax, dx, dy, tin_vert, tin_ele, maxi_err, &err_records); // Write a Gmsh's .msh file std::ofstream outfile(gopt.get_value(GRID_FILE)+".msh"); outfile << "$MeshFormat" << std::endl << "2.2 0 8" << std::endl << "$EndMeshFormat "<id + 1 << " " << std::setprecision(16) << tin_vert[i]->x << " " << tin_vert[i]->y << " " << tin_vert[i]->elev << std::endl; } outfile<<"$EndNodes"<vert[j]->id + 1; } outfile << std::endl; } outfile << "$EndElements"<< std::endl; outfile<<"$NodeData"<id + 1 << " " << std::setprecision(16) << tin_vert[i]->elev << std::endl; } outfile << "$EndNodeData" << std::endl; outfile.close(); // write a neighbor file std::string neigh_name = gopt.get_value(NEIGH_FILE, false); if (neigh_name != "NullValue") { outfile.open(neigh_name+".neigh"); outfile << tin_ele.size() << std::endl; for (int i = 0; i < tin_ele.size(); i++) { outfile << i + 1; for (int j = 0; j < 3; j++) { if (tin_ele[i]->neigh[j] != nullptr) { outfile << " " << tin_ele[i]->neigh[j]->id + 1; } else outfile << " -1"; } outfile << std::endl; } 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(); } // 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]; } return 0; }