From ac4a74ef3d58d69e391c64df7435422051b12db9 Mon Sep 17 00:00:00 2001 From: Pietro Fanti Date: Wed, 27 May 2026 11:18:45 +0200 Subject: [PATCH 1/2] fix(GravityModelDetail): exclude near-vertex points from edge singularity casefix: check existing installations --- src/polyhedralGravity/model/GravityModelDetail.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/polyhedralGravity/model/GravityModelDetail.cpp b/src/polyhedralGravity/model/GravityModelDetail.cpp index 1f3e70b4..61ff7110 100644 --- a/src/polyhedralGravity/model/GravityModelDetail.cpp +++ b/src/polyhedralGravity/model/GravityModelDetail.cpp @@ -337,7 +337,9 @@ namespace polyhedralGravity::GravityModel::detail { const double segmentVectorNorm = euclideanNorm(segmentVector); return projectionPointVertexNorms[(j + 1) % 3] < segmentVectorNorm && - projectionPointVertexNorms[j] < segmentVectorNorm; + projectionPointVertexNorms[j] < segmentVectorNorm && + projectionPointVertexNorms[(j + 1) % 3] > EPSILON_ZERO_OFFSET && + projectionPointVertexNorms[j] > EPSILON_ZERO_OFFSET; })) { using namespace util; return std::make_pair(-1.0 * util::PI * planeDistance, //sing alpha = -pi*h_p @@ -369,8 +371,8 @@ namespace polyhedralGravity::GravityModel::detail { })) { using namespace util; //Two segment vectors G_1 and G_2 of this plane - const Array3 &g1 = r1Norm == 0.0 ? segmentVectorsForPlane[j] : segmentVectorsForPlane[(j - 1 + 3) % 3]; - const Array3 &g2 = r1Norm == 0.0 ? segmentVectorsForPlane[(j + 1) % 3] : segmentVectorsForPlane[j]; + const Array3 &g1 = r1Norm < EPSILON_ZERO_OFFSET ? segmentVectorsForPlane[j] : segmentVectorsForPlane[(j - 1 + 3) % 3]; + const Array3 &g2 = r1Norm < EPSILON_ZERO_OFFSET ? segmentVectorsForPlane[(j + 1) % 3] : segmentVectorsForPlane[j]; // theta = arcos((G_2 * -G_1) / (|G_2| * |G_1|)) const double gdot = dot(g1 * -1.0, g2); const double theta = gdot == 0.0 ? util::PI_2 : std::acos(gdot / (euclideanNorm(g1) * euclideanNorm(g2))); From 4af8df15ff08809cd46123aed5a4bf4e85052e09 Mon Sep 17 00:00:00 2001 From: Pietro Fanti Date: Wed, 27 May 2026 11:59:01 +0200 Subject: [PATCH 2/2] fix(GravityModelDetail): close gap between Case 2 and Case 3 singularity guard --- src/polyhedralGravity/model/GravityModelDetail.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/polyhedralGravity/model/GravityModelDetail.cpp b/src/polyhedralGravity/model/GravityModelDetail.cpp index 61ff7110..28f9c73e 100644 --- a/src/polyhedralGravity/model/GravityModelDetail.cpp +++ b/src/polyhedralGravity/model/GravityModelDetail.cpp @@ -338,8 +338,8 @@ namespace polyhedralGravity::GravityModel::detail { const double segmentVectorNorm = euclideanNorm(segmentVector); return projectionPointVertexNorms[(j + 1) % 3] < segmentVectorNorm && projectionPointVertexNorms[j] < segmentVectorNorm && - projectionPointVertexNorms[(j + 1) % 3] > EPSILON_ZERO_OFFSET && - projectionPointVertexNorms[j] > EPSILON_ZERO_OFFSET; + projectionPointVertexNorms[(j + 1) % 3] >= EPSILON_ZERO_OFFSET && + projectionPointVertexNorms[j] >= EPSILON_ZERO_OFFSET; })) { using namespace util; return std::make_pair(-1.0 * util::PI * planeDistance, //sing alpha = -pi*h_p