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

Method earclip

src/IO/OBJParser.cpp:359–475  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

357}
358
359OBJParser::FaceList OBJParser::earclip(const std::vector<size_t>& idx) {
360 // This method implements the naive ear clipping algorithm with complexity
361 // O(n^2). It may be slow for large n.
362 assert(idx.size() > 3);
363 using List = std::list<size_t>;
364 using Iterator = List::iterator;
365 FaceList tris;
366 List active_idx;
367 const size_t num_idx = idx.size();
368 for (size_t i=0; i<num_idx; i++) {
369 active_idx.push_back(i);
370 }
371
372 auto cyclic_next = [&active_idx](Iterator itr) {
373 itr++;
374 if (itr == active_idx.end()) itr = active_idx.begin();
375 return itr;
376 };
377 auto cyclic_prev = [&active_idx](Iterator itr) {
378 if (itr == active_idx.begin()) {
379 itr = active_idx.end();
380 }
381 itr--;
382 return itr;
383 };
384 auto estimate_normal = [this, &idx]() {
385 const size_t num_idx = idx.size();
386 assert(num_idx > 0);
387 Vector3F n(0.0, 0.0, 0.0);
388 Vector3F seed;
389 seed.segment(0, m_dim) = m_vertices[idx[0]];
390 for (size_t i=0; i<num_idx-1; i++) {
391 Vector3F vi,vj;
392 vi.segment(0, m_dim) = m_vertices[idx[i]];
393 vj.segment(0, m_dim) = m_vertices[idx[i+1]];
394 n += (vi - seed).cross(vj - seed);
395 }
396 n.normalize();
397 return n;
398 };
399 auto can_clip = [this, &idx, &cyclic_prev, &cyclic_next](const Iterator& itr, const Vector3F& normal) {
400 const auto curr = itr;
401 const auto next = cyclic_next(itr);
402 const auto prev = cyclic_prev(itr);
403 const size_t i = idx[*prev];
404 const size_t j = idx[*curr];
405 const size_t k = idx[*next];
406 Vector3F vi,vj,vk;
407 vi.segment(0, m_dim) = m_vertices[i];
408 vj.segment(0, m_dim) = m_vertices[j];
409 vk.segment(0, m_dim) = m_vertices[k];
410 const Vector3F nj = (vk-vj).cross(vi-vj);
411 if (nj.norm() <= 0.0) return false; // Degenerate ear.
412 if (nj.dot(normal) <= 0.0) return false; // Concave face.
413 for (Iterator itr = cyclic_next(next); itr != prev; itr=cyclic_next(itr)) {
414 const size_t l = idx[*itr];
415 const size_t m = idx[*cyclic_next(itr)];
416 Vector3F vl,vm;

Callers

nothing calls this directly

Calls 5

normalizeMethod · 0.80
normMethod · 0.80
sizeMethod · 0.45
endMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected