MCPcopy Create free account
hub / github.com/PyMesh/PyMesh / split_edge

Method split_edge

tools/MeshUtils/EdgeSplitter.cpp:113–155  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

111
112template<typename AdjacencyVector>
113void EdgeSplitter::split_edge(const VectorI& edge,
114 const AdjacencyVector& adj_faces, Float max_length) {
115 const auto v0 = m_vertices.row(edge[0]);
116 const auto v1 = m_vertices.row(edge[1]);
117 Float length = (v0 - v1).norm();
118 if (length < max_length) return;
119
120 bool adj_faces_are_valid = true;
121 for (auto fi : adj_faces) {
122 adj_faces_are_valid = adj_faces_are_valid && m_face_is_valid[fi];
123 }
124 if (!adj_faces_are_valid) return;
125
126 const size_t base_v_idx = m_vertices.rows() + m_new_vertices.size();
127
128 std::list<VectorF> edge_vertices = {v0, v1};
129 split(edge_vertices, edge_vertices.begin(), length, max_length);
130 assert(edge_vertices.size() > 2);
131
132 const auto v_begin = std::next(edge_vertices.begin());
133 const auto v_end = std::prev(edge_vertices.end());
134 for (auto v_itr = v_begin; v_itr != v_end; v_itr++) {
135 m_new_vertices.push_back(*v_itr);
136 }
137
138 const size_t num_edge_vertices = edge_vertices.size();
139 for (auto fi : adj_faces) {
140 const auto& f = m_faces.row(fi);
141 size_t opposite_v_id = get_opposite_vertex_index(f, edge[0], edge[1]);
142 bool is_correctly_orientated = has_same_orientation(
143 f, opposite_v_id, edge[0], edge[1]);
144 for (size_t i=0; i<num_edge_vertices-1; i++) {
145 size_t curr_idx = i==0 ? edge[0] : i-1 + base_v_idx;
146 size_t next_idx = i==num_edge_vertices-2 ? edge[1] : i + base_v_idx;
147 if (is_correctly_orientated)
148 m_new_faces.emplace_back(opposite_v_id, curr_idx, next_idx);
149 else
150 m_new_faces.emplace_back(opposite_v_id, next_idx, curr_idx);
151 }
152
153 m_face_is_valid[fi] = false;
154 }
155}
156
157void EdgeSplitter::finalize_geometry() {
158 if (m_new_vertices.empty()) {

Callers

nothing calls this directly

Calls 8

nextFunction · 0.85
has_same_orientationFunction · 0.85
normMethod · 0.80
splitFunction · 0.70
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected