Browse Source

fix refactor

main
mckay 2 months ago
parent
commit
46eae8e02d
  1. 75
      code/pre_processing/FeatureSample/Source.cpp

75
code/pre_processing/FeatureSample/Source.cpp

@ -117,7 +117,7 @@ int check_mesh_edge_convex(Mesh3d* m, HE_edge<double>* he)
} }
void normalize_mesh(Mesh3d& mesh, std::string outputfile); void normalize_mesh(Mesh3d& mesh, std::string outputfile);
void generate_feature_sample(Mesh3d& mesh, std::string outputfile); int generate_feature_sample(Mesh3d& mesh,std::string inputfile, std::string outputfile, FeatureSampleConfig& config);
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
@ -130,24 +130,17 @@ int main(int argc, char** argv)
if (!config.Validate()) { if (!config.Validate()) {
throw std::runtime_error("Invalid configuration"); throw std::runtime_error("Invalid configuration");
} }
int n_nonfeature_sample = 50000; // int n_nonfeature_sample = 50000;
int n_feature_sample = 0; // int n_feature_sample = 0;
int min_sample_perpatch = 50; // int min_sample_perpatch = 50;
double sigma = -1.0; // double sigma = -1.0;
double sigma_n = -1.0; // double sigma_n = -1.0;
int processing_mode = config.processing.mode; int processing_mode = config.processing.mode;
auto& inputfile = config.files.input_mesh; auto& inputfile = config.files.input_mesh;
auto& outputfile = config.files.output_file; auto& outputfile = config.files.output_file;
//output pts by colors
int last_dot = (int)outputfile.find_last_of(".");
auto output_prefix = outputfile.substr(0, last_dot);
int flag_csg = 0;
bool flag_sample_pts = true; //simply generate mask and csg tree of a given point cloud
if (config.files.input_pointcloud.empty())
{
flag_sample_pts = false;
}
std::string inputext = GetFileExtension(inputfile); std::string inputext = GetFileExtension(inputfile);
Mesh3d mesh; Mesh3d mesh;
@ -156,17 +149,7 @@ int main(int argc, char** argv)
else if (inputext == "off") else if (inputext == "off")
mesh.load_off(inputfile.c_str()); mesh.load_off(inputfile.c_str());
std::cout << "verts: " << mesh.get_vertices_list()->size() << " face: " << mesh.get_faces_list()->size() << std::endl; std::cout << "verts: " << mesh.get_vertices_list()->size() << " face: " << mesh.get_faces_list()->size() << std::endl;
bool flag_verbose = false;
if (config.processing.verbose)
{
flag_verbose = (bool)config.processing.verbose;
}
bool flag_strict = false;
if (config.processing.strict_mode)
{
flag_strict = true;
}
if (processing_mode == 0) if (processing_mode == 0)
{ {
@ -175,6 +158,7 @@ int main(int argc, char** argv)
} }
else if (processing_mode == 1) else if (processing_mode == 1)
{ {
return generate_feature_sample(mesh, inputfile, outputfile, config);
} }
} }
@ -228,32 +212,31 @@ void normalize_mesh(Mesh3d& mesh, std::string outputfile)
} }
void generate_feature_sample(Mesh3d& mesh, std::string outputfile) int generate_feature_sample(Mesh3d& mesh, std::string inputfile, std::string outputfile, FeatureSampleConfig& config)
{ {
//first sample feature parts then non-feature parts //first sample feature parts then non-feature parts
//mask: //mask:
//feature: 0 //feature: 0
//non feature: 1,2,3...indicating coloring //non feature: 1,2,3...indicating coloring
assert(!config.files.input_feature.empty() && !config.files.output_mask.empty()); assert(!config.files.input_feature.empty() && !config.files.output_mask.empty());
auto& inputfeaturefile = config.files.input_feature; auto& inputfeaturefile = config.files.input_feature;
auto& outputmaskfile = config.files.output_mask; auto& outputmaskfile = config.files.output_mask;
if (config.sampling.feature_samples) int n_feature_sample = config.sampling.feature_samples ? config.sampling.feature_samples : 0;
n_feature_sample = config.sampling.feature_samples; int n_nonfeature_sample = config.sampling.nonfeature_samples ? config.sampling.nonfeature_samples : 50000;
if (config.sampling.nonfeature_samples) int min_sample_perpatch = 50;
n_nonfeature_sample = config.sampling.nonfeature_samples; double sigma = config.sampling.sigma ? config.sampling.sigma : -1.0;
if (config.sampling.sigma) double sigma_n = config.sampling.sigma_normal ? config.sampling.sigma_normal : -1.0;
sigma = config.sampling.sigma;
if (config.sampling.sigma_normal) //output pts by colors
sigma_n = config.sampling.sigma_normal; int last_dot = (int)outputfile.find_last_of(".");
bool flag_repair_turn_features = true; auto output_prefix = outputfile.substr(0, last_dot);
if (config.processing.repair_turn) int flag_csg = 0;
flag_repair_turn_features = true; bool flag_sample_pts = false ? config.files.input_pointcloud.empty():true; //simply generate mask and csg tree of a given point cloud
bool flag_verbose = (bool)config.processing.verbose ? config.processing.verbose : false;
bool flag_repair_tree_features = false; bool flag_strict = (bool)config.processing.strict_mode ? config.processing.strict_mode : false;
if (config.processing.repair_tree) bool flag_repair_turn_features = config.processing.repair_turn;
{ bool flag_repair_tree_features = true ?config.processing.repair_tree:false;
flag_repair_tree_features = true;
}
if (config.processing.generate_csg) if (config.processing.generate_csg)
@ -267,6 +250,7 @@ void generate_feature_sample(Mesh3d& mesh, std::string outputfile)
std::vector<size_t> sample_pts_tris; //used for assign labels of sample pts std::vector<size_t> sample_pts_tris; //used for assign labels of sample pts
if (!flag_sample_pts) if (!flag_sample_pts)
{ {
// 从点云文件中加载点云数据
auto& inputpcfile = config.files.input_pointcloud; auto& inputpcfile = config.files.input_pointcloud;
load_xyz_file(inputpcfile.c_str(), sample_pts, sample_pt_normals); load_xyz_file(inputpcfile.c_str(), sample_pts, sample_pt_normals);
@ -285,12 +269,16 @@ void generate_feature_sample(Mesh3d& mesh, std::string outputfile)
} }
else else
{ {
// 如果未提供点云面文件,则从网格中提取顶点和面信息。
//search id by aabb //search id by aabb
std::vector<std::array<double, 3>> tri_verts; std::vector<std::array<double, 3>> tri_verts;
std::vector<std::vector<size_t>> tri_faces; std::vector<std::vector<size_t>> tri_faces;
// 从给定的网格 mesh 中提取顶点和面信息。
get_mesh_vert_faces(mesh, tri_verts, tri_faces); get_mesh_vert_faces(mesh, tri_verts, tri_faces);
// 将提取的顶点和面信息转换为 Eigen 库的矩阵格式。
Eigen::MatrixXd input_pts(tri_verts.size(), 3); Eigen::MatrixXd input_pts(tri_verts.size(), 3);
Eigen::MatrixXi input_faces(tri_faces.size(), 3); Eigen::MatrixXi input_faces(tri_faces.size(), 3);
// 将顶点信息从 tri_verts 复制到 input_pts。
for (size_t i = 0; i < tri_verts.size(); i++) for (size_t i = 0; i < tri_verts.size(); i++)
{ {
for (size_t j = 0; j < 3; j++) for (size_t j = 0; j < 3; j++)
@ -310,6 +298,7 @@ void generate_feature_sample(Mesh3d& mesh, std::string outputfile)
std::vector<vec3d> closest; std::vector<vec3d> closest;
std::vector<double> dist; std::vector<double> dist;
// 计算样本点与输入网格之间的最短距离。
compute_shortest_dist_AABB(input_pts, input_faces, sample_pts, closest, dist, sample_pts_tris); compute_shortest_dist_AABB(input_pts, input_faces, sample_pts, closest, dist, sample_pts_tris);
} }

Loading…
Cancel
Save