| 233 | } |
| 234 | |
| 235 | std::vector<size_t> LongEdgeRemoval::get_vertex_chain_around_triangle( |
| 236 | size_t fi, size_t& v0_idx, size_t& v1_idx, size_t& v2_idx) { |
| 237 | const auto& f = m_faces.row(fi); |
| 238 | const auto& chain_01 = m_edge_map[{f[0], f[1]}]; |
| 239 | const auto& chain_12 = m_edge_map[{f[1], f[2]}]; |
| 240 | const auto& chain_20 = m_edge_map[{f[2], f[0]}]; |
| 241 | |
| 242 | std::vector<size_t> chain; |
| 243 | chain.reserve(chain_01.size() + chain_12.size() + chain_20.size() - 3); |
| 244 | v0_idx = 0; |
| 245 | chain.push_back(f[0]); |
| 246 | if (f[0] == chain_01.front()) { |
| 247 | chain.insert(chain.end(), |
| 248 | std::next(chain_01.begin()), |
| 249 | std::prev(chain_01.end())); |
| 250 | } else { |
| 251 | assert(f[0] == chain_01.back()); |
| 252 | chain.insert(chain.end(), |
| 253 | std::next(chain_01.rbegin()), |
| 254 | std::prev(chain_01.rend())); |
| 255 | } |
| 256 | |
| 257 | v1_idx = chain.size(); |
| 258 | chain.push_back(f[1]); |
| 259 | if (f[1] == chain_12.front()) { |
| 260 | chain.insert(chain.end(), |
| 261 | std::next(chain_12.begin()), |
| 262 | std::prev(chain_12.end())); |
| 263 | } else { |
| 264 | assert(f[1] == chain_12.back()); |
| 265 | chain.insert(chain.end(), |
| 266 | std::next(chain_12.rbegin()), |
| 267 | std::prev(chain_12.rend())); |
| 268 | } |
| 269 | |
| 270 | v2_idx = chain.size(); |
| 271 | chain.push_back(f[2]); |
| 272 | if (f[2] == chain_20.front()) { |
| 273 | chain.insert(chain.end(), |
| 274 | std::next(chain_20.begin()), |
| 275 | std::prev(chain_20.end())); |
| 276 | } else { |
| 277 | assert(f[2] == chain_20.back()); |
| 278 | chain.insert(chain.end(), |
| 279 | std::next(chain_20.rbegin()), |
| 280 | std::prev(chain_20.rend())); |
| 281 | } |
| 282 | return chain; |
| 283 | } |