From 627a0a0d9ec2f082b3365d1d4d384e157de6ce79 Mon Sep 17 00:00:00 2001 From: Pierre Kraemer Date: Fri, 1 Jul 2011 16:37:01 +0200 Subject: [PATCH] correction intersection.hpp --- include/Algo/Geometry/intersection.hpp | 61 +++++++++++++------- include/Algo/Import/import2tablesSurface.hpp | 6 +- include/Topology/generic/cellmarker.h | 40 ++++++------- 3 files changed, 63 insertions(+), 44 deletions(-) diff --git a/include/Algo/Geometry/intersection.hpp b/include/Algo/Geometry/intersection.hpp index b66a9aa3..42397961 100644 --- a/include/Algo/Geometry/intersection.hpp +++ b/include/Algo/Geometry/intersection.hpp @@ -38,15 +38,14 @@ namespace Geometry { template -bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& positions, const typename PFP::VEC3& P, const typename PFP::VEC3& Dir, typename PFP::VEC3& Inter) +bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& position, const typename PFP::VEC3& P, const typename PFP::VEC3& Dir, typename PFP::VEC3& Inter) { - typedef typename PFP::VEC3 VEC3 ; const float SMALL_NUM = std::numeric_limits::min() * 5.0f; - VEC3 p1 = positions[d]; - VEC3 n = faceNormal(map,d,positions); + VEC3 p1 = position[d]; + VEC3 n = faceNormal(map,d,position); VEC3 w0 = P - p1; float a = -(n*w0); float b = n*Dir; @@ -58,7 +57,7 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P Inter = P + r * Dir; // intersect point of ray and plane // is I inside the face? - VEC3 p2 = positions[map.phi1(d)]; + VEC3 p2 = position[map.phi1(d)]; VEC3 v = p2 - p1 ; VEC3 vInter = Inter - p1; float dirV = v * vInter; @@ -69,7 +68,7 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P while(it != d) { p1 = p2; - p2 = positions[map.phi1(it)]; + p2 = position[map.phi1(it)]; v = p2 - p1; vInter = Inter - p1; float dirD = v * vInter; @@ -85,22 +84,22 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P } template -bool intersectionSegmentConvexFace(typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& positions, const typename PFP::VEC3& PA, const typename PFP::VEC3& PB, typename PFP::VEC3& Inter) +bool intersectionSegmentConvexFace(typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& position, const typename PFP::VEC3& PA, const typename PFP::VEC3& PB, typename PFP::VEC3& Inter) { typename PFP::VEC3 dir = PB - PA; - if (intersectionLineConvexFace(map,d,positions,PA,dir,Inter)) + if (intersectionLineConvexFace(map, d, position, PA, dir, Inter)) { typename PFP::VEC3 dirA = PA - Inter; - typename PFP::VEC3 dirB = PB -Inter; + typename PFP::VEC3 dirB = PB - Inter; - if ( (dirA*dirB) < 0 ) + if (dirA * dirB < 0) return true; } return false; } template -bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, const typename PFP::TVEC3& positions) +bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, const typename PFP::TVEC3& position) { typedef typename PFP::VEC3 VEC3 ; @@ -109,8 +108,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co VEC3 tris2[3]; for (unsigned int i = 0; i < 3; ++i) { - tris1[i] = positions[tri1]; - tris2[i] = positions[tri2]; + tris1[i] = position[tri1]; + tris2[i] = position[tri2]; tri1 = map.phi1(tri1); tri2 = map.phi1(tri2); } @@ -167,8 +166,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co // return isSegmentInTriangle2D(inter1,inter2,tris2[0],tris2[1],triS2[2],nTri2); //compute face normal - VEC3 normale1 = faceNormal(map,tri1,positions); - VEC3 bary1 = faceCentroid(map,tri1,positions); + VEC3 normale1 = faceNormal(map, tri1, position); + VEC3 bary1 = faceCentroid(map, tri1, position); int pos = 0; int neg = 0; @@ -188,8 +187,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co return false; //same for the second triangle - VEC3 normale2 = faceNormal(map,tri2,positions); - VEC3 bary2 = faceCentroid(map,tri2,positions); + VEC3 normale2 = faceNormal(map, tri2, position); + VEC3 bary2 = faceCentroid(map, tri2, position); pos = 0; neg = 0; for (unsigned int i = 0; i < 3 ; ++i) @@ -210,7 +209,7 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co for (unsigned int i = 0; i < 3 && !intersection; ++i) { VEC3 inter; - intersection = Geom::intersectionSegmentTriangle(tris1[i],tris1[(i+1)%3],tris2[0],tris2[1],tris2[2],inter); + intersection = Geom::intersectionSegmentTriangle(tris1[i], tris1[(i+1)%3], tris2[0], tris2[1], tris2[2], inter); } if (intersection) @@ -219,14 +218,34 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co for (unsigned int i = 0; i < 3 && !intersection; ++i) { VEC3 inter; - intersection = Geom::intersectionSegmentTriangle(tris2[i],tris2[(i+1)%3],tris1[0],tris1[1],tris1[2],inter); + intersection = Geom::intersectionSegmentTriangle(tris2[i], tris2[(i+1)%3], tris1[0], tris1[1], tris1[2], inter); } return intersection; } -} +template +bool intersectionSphereEdge(typename PFP::MAP& map, typename PFP::VEC3& center, typename PFP::REAL radius, Dart d, const typename PFP::TVEC3& position, typename PFP::REAL& alpha) +{ + typedef typename PFP::VEC3 VEC3 ; + typedef typename PFP::REAL REAL ; + const typename PFP::VEC3& p1 = position[d]; + const typename PFP::VEC3& p2 = position[map.phi1(d)]; + if(Geom::isPointInSphere(p1, center, radius) && !Geom::isPointInSphere(p2, center, radius)) + { + VEC3 p = p1 - center; + VEC3 qminusp = p2 - center - p; + REAL s = p * qminusp; + REAL n2 = qminusp.norm2(); + alpha = (- s + sqrt(s*s + n2 * (radius*radius - p.norm2()))) / n2; + return true ; + } + return false ; } -} +} // namespace Geometry + +} // namespace Algo + +} // namespace CGoGN diff --git a/include/Algo/Import/import2tablesSurface.hpp b/include/Algo/Import/import2tablesSurface.hpp index c5ae0a9c..3f743410 100644 --- a/include/Algo/Import/import2tablesSurface.hpp +++ b/include/Algo/Import/import2tablesSurface.hpp @@ -926,7 +926,7 @@ bool MeshTablesSurface::importAHEM(const std::string& filename, std::vector // Allocate vertices - AttributeContainer& vxContainer = m_map.getAttributeContainer(VERTEX_CELL); + AttributeContainer& vxContainer = m_map.getAttributeContainer(VERTEX); std::vector verticesId; @@ -971,10 +971,10 @@ bool MeshTablesSurface::importAHEM(const std::string& filename, std::vector // Read positions - AttributeHandler position = m_map.template getAttribute(VERTEX_ORBIT, "position") ; + AttributeHandler position = m_map.template getAttribute(VERTEX, "position") ; if (!position.isValid()) - position = m_map.template addAttribute(VERTEX_ORBIT, "position") ; + position = m_map.template addAttribute(VERTEX, "position") ; attrNames.push_back(position.name()) ; diff --git a/include/Topology/generic/cellmarker.h b/include/Topology/generic/cellmarker.h index 63d33e12..02207e15 100644 --- a/include/Topology/generic/cellmarker.h +++ b/include/Topology/generic/cellmarker.h @@ -40,10 +40,10 @@ namespace CGoGN class CellMarkerGen { protected: - Mark m_mark; - AttribMap& m_map; - unsigned int m_cell; - unsigned int m_thread; + Mark m_mark ; + AttribMap& m_map ; + unsigned int m_cell ; + unsigned int m_thread ; public: /** @@ -55,7 +55,7 @@ public: { if(!map.isOrbitEmbedded(cell)) map.addEmbedding(cell) ; - m_mark = map.getNewMark(cell, thread); + m_mark = map.getNewMark(cell, thread) ; } virtual ~CellMarkerGen() @@ -74,11 +74,11 @@ public: */ virtual void mark(Dart d) { - unsigned int a = m_map.getEmbedding(m_cell, d); + unsigned int a = m_map.getEmbedding(m_cell, d) ; if (a == EMBNULL) - a = m_map.embedNewCell(m_cell, d); + a = m_map.embedNewCell(m_cell, d) ; - m_map.getMarkVector(m_cell, m_thread)->operator[](a).setMark(m_mark); + m_map.getMarkVector(m_cell, m_thread)->operator[](a).setMark(m_mark) ; } /** @@ -86,11 +86,11 @@ public: */ virtual void unmark(Dart d) { - unsigned int a = m_map.getEmbedding(m_cell, d); + unsigned int a = m_map.getEmbedding(m_cell, d) ; if (a == EMBNULL) - a = m_map.embedNewCell(m_cell, d); + a = m_map.embedNewCell(m_cell, d) ; - m_map.getMarkVector(m_cell, m_thread)->operator[](a).unsetMark(m_mark); + m_map.getMarkVector(m_cell, m_thread)->operator[](a).unsetMark(m_mark) ; } /** @@ -98,11 +98,11 @@ public: */ virtual bool isMarked(Dart d) { - unsigned int a = m_map.getEmbedding(m_cell, d); + unsigned int a = m_map.getEmbedding(m_cell, d) ; if (a == EMBNULL) - return false; + return false ; - return m_map.getMarkVector(m_cell, m_thread)->operator[](a).testMark(m_mark); + return m_map.getMarkVector(m_cell, m_thread)->operator[](a).testMark(m_mark) ; } /** @@ -110,7 +110,7 @@ public: */ virtual void mark(unsigned int em) { - m_map.getMarkVector(m_cell, m_thread)->operator[](em).setMark(m_mark); + m_map.getMarkVector(m_cell, m_thread)->operator[](em).setMark(m_mark) ; } /** @@ -118,7 +118,7 @@ public: */ virtual void unmark(unsigned int em) { - m_map.getMarkVector(m_cell, m_thread)->operator[](em).unsetMark(m_mark); + m_map.getMarkVector(m_cell, m_thread)->operator[](em).unsetMark(m_mark) ; } /** @@ -126,7 +126,7 @@ public: */ virtual bool isMarked(unsigned int em) { - return m_map.getMarkVector(m_cell, m_thread)->operator[](em).testMark(m_mark); + return m_map.getMarkVector(m_cell, m_thread)->operator[](em).testMark(m_mark) ; } /** @@ -136,7 +136,7 @@ public: { AttributeContainer& cont = m_map.getAttributeContainer(m_cell) ; for (unsigned int i = cont.begin(); i != cont.end(); cont.next(i)) - m_map.getMarkVector(m_cell, m_thread)->operator[](i).setMark(m_mark); + m_map.getMarkVector(m_cell, m_thread)->operator[](i).setMark(m_mark) ; } /** @@ -199,7 +199,7 @@ public: virtual ~CellMarkerStore() { unmarkAll() ; - assert(isAllUnmarked()); + assert(isAllUnmarked()) ; } protected: @@ -239,7 +239,7 @@ public: virtual ~CellMarkerNoUnmark() { - assert(isAllUnmarked()); + assert(isAllUnmarked()) ; } protected: -- GitLab