25#ifndef _MODELS_VERTEX_SOLVER_TF_MESH_OPS_H_
26#define _MODELS_VERTEX_SOLVER_TF_MESH_OPS_H_
33#include <unordered_set>
34#include <unordered_map>
38namespace TissueForge::models::vertex {
47static HRESULT definedBy(
const std::unordered_set<Vertex*> &verts, std::unordered_set<Surface*> &surfs) {
49 for(
auto &s : v->getSurfaces())
60static HRESULT definedBy(
const std::unordered_set<Vertex*> &verts, std::unordered_set<Body*> &bodys) {
62 for(
auto &b : v->getBodies())
74static HRESULT definedBy(
const std::unordered_set<Vertex*> &verts, std::unordered_set<Surface*> &surfs, std::unordered_set<Body*> &bodys) {
75 for(
auto &v : verts) {
76 for(
auto &s : v->getSurfaces())
78 for(
auto &b : v->getBodies())
90static HRESULT definedBy(
const std::unordered_set<Surface*> &surfs, std::unordered_set<Vertex*> &verts) {
92 for(
auto &v : s->getVertices())
103static HRESULT definedBy(
const std::unordered_set<Surface*> &surfs, std::unordered_set<Body*> &bodys) {
105 for(
auto &b : s->getBodies())
117static HRESULT definedBy(
const std::unordered_set<Surface*> &surfs, std::unordered_set<Vertex*> &verts, std::unordered_set<Body*> &bodys) {
118 for(
auto &s : surfs) {
119 for(
auto &v : s->getVertices())
121 for(
auto &b : s->getBodies())
133static HRESULT definedBy(
const std::unordered_set<Body*> &bodys, std::unordered_set<Vertex*> &verts) {
135 for(
auto &v : b->getVertices())
146static HRESULT definedBy(
const std::unordered_set<Body*> &bodys, std::unordered_set<Surface*> &surfs) {
148 for(
auto &s : b->getSurfaces())
160static HRESULT definedBy(
const std::unordered_set<Body*> &bodys, std::unordered_set<Vertex*> &verts, std::unordered_set<Surface*> &surfs) {
161 for(
auto &b : bodys) {
162 for(
auto &v : b->getVertices())
164 for(
auto &s : b->getSurfaces())
175static std::unordered_set<Vertex*> connectedTo(
const std::unordered_set<Vertex*> &verts) {
176 std::unordered_set<Vertex*> result;
178 for(
auto &nv : v->connectedVertices())
194 const std::unordered_set<Vertex*> &verts,
195 std::unordered_set<Vertex*> &connectedVerts,
196 std::unordered_map<
Surface*, std::unordered_set<Vertex*> > &vsmapConnected,
197 std::unordered_map<
Surface*, std::unordered_set<Vertex*> > &vsmapGiven)
199 for(
auto &v : verts) {
200 for(
auto &nv : v->connectedVertices())
201 connectedVerts.insert(nv);
202 for(
auto &s : v->getSurfaces()) {
203 auto itr = vsmapGiven.find(s);
204 if(itr == vsmapGiven.end()) vsmapGiven.insert({s, {v}});
205 else itr->second.insert(v);
209 connectedVerts.erase(v);
210 for(
auto &v : connectedVerts)
211 for(
auto &s : v->getSurfaces()) {
212 auto itr = vsmapConnected.find(s);
213 if(itr == vsmapConnected.end()) vsmapConnected.insert({s, {v}});
214 else itr->second.insert(v);
226static HRESULT connectedToMapConnected(
227 const std::unordered_set<Vertex*> &verts,
228 std::unordered_set<Vertex*> &connectedVerts,
229 std::unordered_map<
Surface*, std::unordered_set<Vertex*> > &vsmap)
232 for(
auto &nv : v->connectedVertices())
233 connectedVerts.insert(nv);
235 connectedVerts.erase(v);
236 for(
auto &v : connectedVerts)
237 for(
auto &s : v->getSurfaces()) {
238 auto itr = vsmap.find(s);
239 if(itr == vsmap.end()) vsmap.insert({s, {v}});
240 else itr->second.insert(v);
252static HRESULT connectedToMapGiven(
253 const std::unordered_set<Vertex*> &verts,
254 std::unordered_set<Vertex*> &connectedVerts,
255 std::unordered_map<
Surface*, std::unordered_set<Vertex*> > &vsmap)
257 for(
auto &v : verts) {
258 for(
auto &nv : v->connectedVertices())
259 connectedVerts.insert(nv);
260 for(
auto &s : v->getSurfaces()) {
261 auto itr = vsmap.find(s);
262 if(itr == vsmap.end()) vsmap.insert({s, {v}});
263 else itr->second.insert(v);
267 connectedVerts.erase(v);
276static std::unordered_set<Surface*> connectedTo(
const std::unordered_set<Surface*> &surfs) {
277 std::unordered_set<Surface*> result;
279 for(
auto ns : s->connectedSurfaces())
292 const std::unordered_set<Surface*> &surfs,
293 std::unordered_set<Surface*> &connectedSurfs,
294 std::unordered_map<
Body*, std::unordered_set<Surface*> > &sbmapConnected,
295 std::unordered_map<
Body*, std::unordered_set<Surface*> > &sbmapGiven)
297 for(
auto &s : surfs) {
298 for(
auto ns : s->connectedSurfaces())
299 connectedSurfs.insert(ns);
300 for(
auto b : s->getBodies()) {
301 auto itr = sbmapGiven.find(b);
302 if(itr == sbmapGiven.end()) sbmapGiven.insert({b, {s}});
303 else itr->second.insert(s);
307 connectedSurfs.erase(s);
308 for(
auto &s : connectedSurfs)
309 for(
auto &b : s->getBodies()) {
310 auto itr = sbmapConnected.find(b);
311 if(itr == sbmapConnected.end()) sbmapConnected.insert({b, {s}});
312 else itr->second.insert(s);
324static HRESULT connectedToMapConnected(
325 const std::unordered_set<Surface*> &surfs,
326 std::unordered_set<Surface*> &connectedSurfs,
327 std::unordered_map<
Body*, std::unordered_set<Surface*> > &sbmap)
330 for(
auto ns : s->connectedSurfaces())
331 connectedSurfs.insert(ns);
333 connectedSurfs.erase(s);
334 for(
auto &s : connectedSurfs)
335 for(
auto &b : s->getBodies()) {
336 auto itr = sbmap.find(b);
337 if(itr == sbmap.end()) sbmap.insert({b, {s}});
338 else itr->second.insert(s);
350static HRESULT connectedToMapGiven(
351 const std::unordered_set<Surface*> &surfs,
352 std::unordered_set<Surface*> &connectedSurfs,
353 std::unordered_map<
Body*, std::unordered_set<Surface*> > &sbmap)
355 for(
auto &s : surfs) {
356 for(
auto ns : s->connectedSurfaces())
357 connectedSurfs.insert(ns);
358 for(
auto &b : s->getBodies()) {
359 auto itr = sbmap.find(b);
360 if(itr == sbmap.end()) sbmap.insert({b, {s}});
361 else itr->second.insert(s);
365 connectedSurfs.erase(s);
374static std::unordered_set<Body*> connectedTo(
const std::unordered_set<Body*> &bodys) {
375 std::unordered_set<Body*> result;
377 for(
auto nb : b->connectedBodies())
389static std::unordered_set<Vertex*> connectingThrough(
const std::unordered_set<Surface*> surfs) {
390 std::unordered_multimap<Surface*, Vertex*> cpmap;
391 std::unordered_set<Vertex*> result;
393 for(
auto &ns : s->connectedSurfaces())
394 for(
auto &v : ns->connectingVertices(s))
395 cpmap.insert({ns, v});
399 result.insert(p.second);
408static std::unordered_set<Surface*> connectingThrough(
const std::unordered_set<Body*> bodys) {
409 std::unordered_multimap<Body*, Surface*> cpmap;
410 std::unordered_set<Surface*> result;
412 for(
auto &nb : b->connectedBodies())
413 for(
auto &s : nb->findInterface(b))
414 cpmap.insert({nb, s});
418 result.insert(p.second);
428static HRESULT connectingThrough(
const std::unordered_set<Body*> bodys, std::unordered_set<Vertex*> &result) {
429 std::unordered_multimap<Body*, Vertex*> cpmap;
431 for(
auto &v : b->getVertices())
432 for(
auto &nb : v->getBodies())
434 cpmap.insert({nb, v});
438 result.insert(p.second);
449static HRESULT connectingThrough(
450 const std::unordered_set<Body*> bodys,
451 std::unordered_set<Surface*> &interfaceSurfs,
452 std::unordered_set<Vertex*> &interfaceVerts)
454 std::unordered_multimap<Body*, Vertex*> bvmap;
455 std::unordered_multimap<Body*, Surface*> bsmap;
457 for(
auto &nb : b->adjacentBodies()) {
458 bool hasInterface =
false;
459 for(
auto &s : nb->findInterface(b)) {
461 bsmap.insert({nb, s});
464 for(
auto v : nb->sharedVertices(b))
465 bvmap.insert({nb, v});
467 for(
auto &b : bodys) {
472 interfaceSurfs.insert(p.second);
474 interfaceVerts.insert(p.second);
484static std::unordered_set<Body*> adjacentTo(
const std::unordered_set<Body*> &bodys) {
485 std::unordered_set<Body*> result;
487 for(
auto &nb : b->adjacentBodies())
499static std::unordered_set<Vertex*> orphanedVertices(
const std::unordered_set<Surface*> &toRemove) {
500 std::unordered_set<Vertex*> result, affected;
501 for(
auto &r : toRemove)
502 for(
auto &a : r->getVertices())
504 for(
auto &a : affected) {
505 int numChildren = a->getSurfaces().size();
506 for(
auto &r : toRemove)
520static std::unordered_set<Surface*> orphanedSurfaces(
const std::unordered_set<Body*> &toRemove) {
521 std::unordered_set<Surface*> result, affected;
522 for(
auto &r : toRemove)
523 for(
auto &a : r->getSurfaces())
525 for(
auto &a : affected) {
526 int numChildren = a->getBodies().size();
527 for(
auto &r : toRemove)
543static std::unordered_set<Surface*> removedChildrenByRemovedParents(
const std::unordered_set<Vertex*> &toRemove) {
548 std::vector<Surface*> affectedSurfacesTotal;
549 std::unordered_set<Surface*> affectedSurfacesSet;
550 for(
auto &v : toRemove)
551 for(
auto &s : v->getSurfaces()) {
552 affectedSurfacesSet.insert(s);
553 affectedSurfacesTotal.push_back(s);
555 if(affectedSurfacesSet.empty())
558 std::vector<Surface*> affectedSurfaces(affectedSurfacesSet.begin(), affectedSurfacesSet.end());
559 std::vector<unsigned int> removedSurfCount(affectedSurfaces.size(), 0);
562 for(
auto &s : affectedSurfacesTotal)
563 for(
int i = 0; i < affectedSurfaces.size(); i++)
564 if(affectedSurfaces[i] == s)
565 removedSurfCount[i]++;
568 std::unordered_set<Surface*> result;
569 for(
int i = 0; i < affectedSurfaces.size(); i++) {
570 Surface *s = affectedSurfaces[i];
571 if(s->getVertices().size() - removedSurfCount[i] < 3)
584static std::vector<Surface*> removedChildrenByRemovedParents(
const std::vector<Vertex*> &toRemove) {
585 std::unordered_set<Surface*> result = removedChildrenByRemovedParents(std::unordered_set<Vertex*>(toRemove.begin(), toRemove.end()));
586 return std::vector<Surface*>(result.begin(), result.end());
594static std::unordered_set<Body*> removedChildrenByRemovedParents(
const std::unordered_set<Surface*> &toRemove) {
599 std::vector<Body*> affectedBodiesTotal;
600 std::unordered_set<Body*> affectedBodiesSet;
601 for(
auto &s : toRemove)
602 for(
auto &b : s->getBodies()) {
603 affectedBodiesSet.insert(b);
604 affectedBodiesTotal.push_back(b);
606 if(affectedBodiesSet.empty())
609 std::vector<Body*> affectedBodies(affectedBodiesSet.begin(), affectedBodiesSet.end());
610 std::vector<unsigned int> removedSurfCount(affectedBodies.size(), 0);
613 for(
auto &b : affectedBodiesTotal)
614 for(
int i = 0; i < affectedBodies.size(); i++)
615 if(affectedBodies[i] == b)
616 removedSurfCount[i]++;
619 std::unordered_set<Body*> result;
620 for(
int i = 0; i < affectedBodies.size(); i++) {
621 Body *b = affectedBodies[i];
622 if(b->getSurfaces().size() - removedSurfCount[i] < 4)
633static std::vector<Body*> removedChildrenByRemovedParents(
const std::vector<Surface*> &toRemove) {
634 std::unordered_set<Body*> result = removedChildrenByRemovedParents(std::unordered_set<Surface*>(toRemove.begin(), toRemove.end()));
635 return std::vector<Body*>(result.begin(), result.end());
645static std::unordered_set<Surface*> removedSurfacesByS2V(
const Surface *toRemove) {
646 std::unordered_set<Surface*> result;
647 for(
auto &s : toRemove->connectedSurfaces())
648 if(s->getVertices().size() - s->connectingVertices(toRemove).size() < 2)
658static std::unordered_set<Surface*> connectedSurfacesToS2V(
const std::unordered_set<Surface*> &removed) {
659 std::unordered_set<Surface*> result;
660 for(
auto &s : removed)
661 for(
auto &ns : s->connectedSurfaces())
663 for(
auto &s : removed)
673static std::unordered_set<Surface*> connectedSurfacesToS2V(
const Surface *toRemove) {
674 std::unordered_set<Surface*> result = connectedSurfacesToS2V(removedSurfacesByS2V(toRemove));
675 result.erase(
const_cast<Surface*
>(toRemove));
679static std::unordered_map<Surface*, std::unordered_set<Vertex*> > mapSurfaceReplacementsByB2V(
680 std::unordered_set<Body*> &removedBodies,
681 std::unordered_set<Surface*> &removedSurfaces)
683 std::unordered_map<Surface*, std::unordered_set<Vertex*> > result;
685 std::unordered_set<Surface*> connectingSurfs;
686 std::unordered_set<Vertex*> connectingVerts;
687 connectingThrough(removedBodies, connectingSurfs, connectingVerts);
689 std::unordered_multimap<Body*, std::pair<Surface*, std::unordered_set<Vertex*> > > bsmap;
690 for(
auto &v : connectingVerts)
691 for(
auto &s : v->getSurfaces())
692 for(
auto &b : s->getBodies())
693 bsmap.insert({b, {s, {v}}});
694 for(
auto &s : connectingSurfs)
695 for(
auto &ns : s->connectedSurfaces()) {
696 std::vector<Vertex*> connectingVertices = s->connectingVertices(ns);
697 std::pair<Surface*, std::unordered_set<Vertex*> > p = {ns, {connectingVertices.begin(), connectingVertices.end()}};
698 for(
auto &b : ns->getBodies())
699 bsmap.insert({b, p});
701 for(
auto &b : removedBodies)
703 std::unordered_multimap<Surface*, std::unordered_set<Vertex*> > svmap;
705 svmap.insert({p.second.first, p.second.second});
706 for(
auto &s : removedSurfaces)
708 for(
unsigned int i = 0; i < svmap.bucket_count(); i++) {
710 std::unordered_set<Vertex*> vs;
711 for(
auto itr = svmap.begin(i); itr != svmap.end(i); itr++) {
714 for(
auto &v : itr->second)
719 if(s->getVertices().size() - vs.size() < 2)
720 removedSurfaces.
insert(s);
722 result.insert({s, vs});
738static HRESULT transformedByB2V(
740 std::unordered_set<Vertex*> &removedVertices,
741 std::unordered_set<Surface*> &removedSurfaces,
742 std::unordered_set<Body*> &removedBodies,
743 std::unordered_map<
Surface*, std::unordered_set<Vertex*> > &replacementMap)
745 std::unordered_set<Body*> _removedBodies = {
const_cast<Body*
>(
body)};
746 std::unordered_set<Vertex*> _removedVertices;
747 std::unordered_set<Surface*> _removedSurfaces;
749 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
750 size_t num_surfs = _removedSurfaces.size();
751 std::unordered_map<Surface*, std::unordered_set<Vertex*> > _replacementMap = mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
753 while(_removedSurfaces.size() > num_surfs) {
754 num_surfs = _removedSurfaces.size();
755 _removedBodies = removedChildrenByRemovedParents(_removedSurfaces);
756 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
757 _replacementMap = mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
760 for(
auto &v : _removedVertices)
761 removedVertices.insert(v);
762 for(
auto &s : _removedSurfaces)
763 removedSurfaces.insert(s);
764 for(
auto &b : _removedBodies)
765 removedBodies.insert(b);
766 for(
auto &p : _replacementMap)
767 replacementMap.insert(p);
777static std::unordered_set<Vertex*> removedVerticesByB2V(
const Body *body) {
778 std::unordered_set<Body*> _removedBodies = {
const_cast<Body*
>(
body)};
779 std::unordered_set<Vertex*> _removedVertices;
780 std::unordered_set<Surface*> _removedSurfaces;
782 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
783 size_t num_surfs = _removedSurfaces.size();
784 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
786 while(_removedSurfaces.size() > num_surfs) {
787 num_surfs = _removedSurfaces.size();
788 _removedBodies = removedChildrenByRemovedParents(_removedSurfaces);
789 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
790 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
793 return _removedVertices;
801static std::unordered_set<Surface*> removedSurfacesByB2V(
const Body *body) {
802 std::unordered_set<Body*> _removedBodies = {
const_cast<Body*
>(
body)};
803 std::unordered_set<Vertex*> _removedVertices;
804 std::unordered_set<Surface*> _removedSurfaces;
806 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
807 size_t num_surfs = _removedSurfaces.size();
808 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
810 while(_removedSurfaces.size() > num_surfs) {
811 num_surfs = _removedSurfaces.size();
812 _removedBodies = removedChildrenByRemovedParents(_removedSurfaces);
813 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
814 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
817 return _removedSurfaces;
825static std::unordered_set<Body*> removedBodiesByB2V(
const Body *body) {
826 std::unordered_set<Body*> _removedBodies = {
const_cast<Body*
>(
body)};
827 std::unordered_set<Vertex*> _removedVertices;
828 std::unordered_set<Surface*> _removedSurfaces;
830 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
831 size_t num_surfs = _removedSurfaces.size();
832 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
834 while(_removedSurfaces.size() > num_surfs) {
835 num_surfs = _removedSurfaces.size();
836 _removedBodies = removedChildrenByRemovedParents(_removedSurfaces);
837 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
838 mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
841 return _removedBodies;
844static std::unordered_map<Surface*, std::unordered_set<Vertex*> > surfaceReplacementsByB2V(
const Body *body)
846 std::unordered_set<Body*> _removedBodies = {
const_cast<Body*
>(
body)};
847 std::unordered_set<Vertex*> _removedVertices;
848 std::unordered_set<Surface*> _removedSurfaces;
850 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
851 size_t num_surfs = _removedSurfaces.size();
852 std::unordered_map<Surface*, std::unordered_set<Vertex*> > _replacementMap = mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
854 while(_removedSurfaces.size() > num_surfs) {
855 num_surfs = _removedSurfaces.size();
856 _removedBodies = removedChildrenByRemovedParents(_removedSurfaces);
857 definedBy(_removedBodies, _removedVertices, _removedSurfaces);
858 _replacementMap = mapSurfaceReplacementsByB2V(_removedBodies, _removedSurfaces);
861 return _replacementMap;
871static std::unordered_set<Vertex*> removedVerticesByS2V(
const Surface *toRemove) {
872 std::unordered_set<Vertex*> result;
873 definedBy(removedSurfacesByS2V(toRemove), result);
The mesh body is a volume-enclosing object of mesh surfaces.
Definition tfBody.h:59
The mesh surface is an area-enclosed object of implicit mesh edges defined by mesh vertices.
Definition tfSurface.h:65
HRESULT insert(Vertex *v, const int &idx)
Insert a vertex at a location in the list of vertices.
HRESULT body(MeshObjActor *a, BodyType *b)
Bind an actor to a body type.
int32_t HRESULT
Definition tf_port.h:255