| 116 | } |
| 117 | |
| 118 | size_t ObtuseTriangleRemoval::split_obtuse_triangles(Float max_angle) { |
| 119 | size_t num_splited = 0; |
| 120 | IndexHeap<Float> candidates(m_face_angles); |
| 121 | while (!candidates.empty()) { |
| 122 | size_t ext_idx = candidates.top(); |
| 123 | candidates.pop(); |
| 124 | if (m_face_angles[ext_idx] < max_angle) break; |
| 125 | if (!edge_can_be_splited(ext_idx)) continue; |
| 126 | |
| 127 | split_triangle(ext_idx); |
| 128 | num_splited ++; |
| 129 | } |
| 130 | return num_splited; |
| 131 | } |
| 132 | |
| 133 | void ObtuseTriangleRemoval::split_triangle(size_t ext_idx) { |
| 134 | Edge edge = m_edges[ext_idx]; |