Commit 28badcba authored by Heng Liu's avatar Heng Liu

add additional constraints

parent 8c5b3b92
libSCOF – Singularity-Constrained Octahedral Fields for Hexahedral Meshing
======
`libSCOF` is an implementation of [SCOF](https://www.meshing.rwth-aachen.de/publication/017/) \[[Liu et al. 2018] distributed under GPLv3.
`libSCOF` is an implementation of [SCOF](https://www.meshing.rwth-aachen.de/publication/017/) \[[Liu et al. 2018](https://dl.acm.org/citation.cfm?id=3197517.3201344)\] distributed under GPLv3.
Note: this is a preliminary version without including the branching as in our paper. The complete version will be committed soon.
If you make use of `libSCOF` in your scientific work, please cite our paper.
If you make use of `libSCOF` in your scientific work, please cite our paper. For your convenience,
you can use the following bibtex snippet:
@article{Liu:2018:SOF:3197517.3201344,
author = {Liu, Heng and Zhang, Paul and Chien, Edward and Solomon, Justin and Bommes, David},
title = {Singularity-constrained Octahedral Fields for Hexahedral Meshing},
journal = {ACM Trans. Graph.},
issue_date = {August 2018},
volume = {37},
number = {4},
month = jul,
year = {2018},
issn = {0730-0301},
pages = {93:1--93:17},
articleno = {93},
numpages = {17},
url = {http://doi.acm.org/10.1145/3197517.3201344},
doi = {10.1145/3197517.3201344},
acmid = {3201344},
publisher = {ACM},
address = {New York, NY, USA},
keywords = {hexahedral meshing, integer-grid maps, octahedral fields, singularity graph},
}
## What is SCOF?
SCOF is an algorithm for generating octahedral fields with the prescribed hexmeshable singularity graphs.
The input to the algorithm is a tetrahedral mesh together with singularity graph constraints in OpenVolumeMesh file format. For more details about the input file format, please refer to the Readme.txt in [InputFiles.] () Additional constraints that are necessary to uniquely specify the field topology for models of higher genus, independent sub-singularity graphs or cavities, are not stored in the files yet.
The input to the algorithm is a tetrahedral mesh together with singularity graph constraints in OpenVolumeMesh file format. For more details about the input file format, please refer to the Readme.txt in [InputFiles.] (https://www.meshing.rwth-aachen.de/publication/017/)
The output of the algorithm are a topological octahedral field encoded as matchings and field alignment as well as a smooth geometrical octahedral field in the form of rotation matrix.
......
This diff is collapsed.
......@@ -95,7 +95,7 @@ private:
void constrained_chart_mergingT();
void tangent_continuity(const EH _eh, const EH _eh_next);
void interior_singular_edge_closing(const EH _eh);
void shortest_dual_path_from_cell_to_edge_restricting_to_the_vertex(const CH _ch, const EH _eh, std::vector<HFH>& _hfs)const;
void shortest_dual_path_from_cell_to_edge_restricting_to_the_vertex(const CH _ch, const EH _eh, std::vector<HFH>& _hfs, bool _block_free = false)const;
bool cell_has_edge(const CH _ch, const EH _eh)const;
VH common_vertex_handle(const EH _eh0, const EH _eh1)const;
HEH common_halfedge_handle(const HFH _hf0, const HFH _hf1)const;
......@@ -163,26 +163,24 @@ private:
void update_chart_index_mapping(int _id0, int _id1);
//update component property
void update_interior_graph_component_property();
void update_boundary_graph_component_property();
void update_interior_graph_component_property(const int _id0, const int _id1);
void update_boundary_graph_component_property(const int _id0, const int _id1);
//used for additional constraints
//connect interior graph components
void connect_interior_graph_components();
void connect_via_dual_path(const std::vector<HFH>& _dpath, int _axis1, int _axis2);
void find_closest_parallel_singular_edges(const EH _eh0, const int _comp, EH &_eh1)const;
void connect_via_dual_path(const std::vector<HFH>& _dpath, const int _axis1, const int _axis2);
int additional_constraint_type(const std::vector<HFH>& _dpath, std::vector<HEH>& _hes);
void find_independent_unknown_halfface_transition(const std::vector<HFH>& _dpath, int& _pos);
void shortest_dual_path_from_cell_to_boundary(const CH _ch, std::vector<HFH>& _dpath)const;
void shortest_dual_path_between_cells(const CH _ch0, const CH _ch1, std::vector<HFH>& _dpath)const;
//for high genus models whose singularity graphs do not form a circle, e.g. kitten, add additional constraints to avoid twist
void add_constraint_to_avoid_twist();
//connect boundary graph components
void connect_boundary_graph_components(std::vector<int>& _chart_index);
void shortest_dual_path_between_faces_tri(TriMesh& _trimesh, const TriFH _fh0, const TriFH _fh1,
std::vector<TriHEH>& _tri_hes)const;
void get_dual_paths_on_trimesh(std::vector<std::vector<TriHEH> >& _tri_dps);
void get_singular_halfedge_in_halfface(const HFH _hf, HEH& _he);
void update_boundary_chart_index(std::vector<int>& _chart_index, const TriHEH _he0, const TriHEH _he1)const;
private:
TetMesh& mesh_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment