Skip to content

Commit e01c8df

Browse files
Merge pull request #1061 from Geode-solutions/volume_to_edge_quality_metric
feat(Geometry): adding new tetrahedron quality metric (volume to edge ratio).
2 parents 52b9616 + a465b72 commit e01c8df

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

include/geode/geometry/quality.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ namespace geode
3434
{
3535
[[nodiscard]] double opengeode_geometry_api tetrahedron_aspect_ratio(
3636
const Tetrahedron& tetra );
37+
[[nodiscard]] double opengeode_geometry_api
38+
tetrahedron_volume_to_edge_ratio( const Tetrahedron& tetra );
3739
} // namespace geode

src/geode/geometry/quality.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <limits>
2929

3030
#include <geode/geometry/basic_objects/tetrahedron.hpp>
31+
#include <geode/geometry/mensuration.hpp>
3132
#include <geode/geometry/vector.hpp>
3233

3334
namespace geode
@@ -64,4 +65,26 @@ namespace geode
6465
constant * longest_edge_length * total_area2 / absolute_det;
6566
return aspect_ratio;
6667
}
68+
69+
double tetrahedron_volume_to_edge_ratio( const Tetrahedron& tetra )
70+
{
71+
const auto signed_volume = geode::tetrahedron_signed_volume( tetra );
72+
double sq_len{ 0 };
73+
const auto& vertices = tetra.vertices();
74+
for( const auto v0 : geode::LRange{ 3 } )
75+
{
76+
const auto& point0 = vertices[v0].get();
77+
for( const auto v1 : geode::LRange{ v0, 4 } )
78+
{
79+
const auto& point1 = vertices[v1].get();
80+
for( const auto d : geode::LRange{ 3 } )
81+
{
82+
const auto diff = point0.value( d ) - point1.value( d );
83+
sq_len += diff * diff;
84+
}
85+
}
86+
}
87+
const auto l_rms = std::sqrt( sq_len / 6 );
88+
return 6 * std::sqrt( 2 ) * signed_volume / ( l_rms * l_rms * l_rms );
89+
}
6790
} // namespace geode

0 commit comments

Comments
 (0)