I implemented a small filter these skinny triangles
Instead of checking area == 0, I use q = r/R (inradius / circumradius) from Heron's formula:
\- q \> 0.2 = stable
\- q \~ 0 = degenerate/collinear/sliver
Why q? It's affine-invariant and dimensionless, so it works even when points have varying z values. Simple area check fails on near-degenerate slivers with tiny but non-zero area.
Python + NumPy, \~50 LOC core, with tests and Colab demo:
https://github.com/Imanisolace/Geometric-chaos-sieve.affine_chaos
Demo:
Stable 3D: \[\[1,0,0.2\],\[-0.5,0.866,1.4\],\[-0.5,-0.866,-0.7\]\] -\> q=0.44
Collinear: \[\[0,0,0\],\[1,0,1\],\[2,0,2\]\] -\> q=0.0 reject
Sliver: \[\[0,0,0\],\[1,0,0\],\[0.5,0.001,0\]\] -\> q=0.002 reject
Reach out if you need integration to your projects
I implementea lightweight alternative filter for skinny triangles, you can have a look
Instead of checking area == 0, I use q = r/R (inradius / circumradius) from Heron's formula:
\- q \> 0.2 = stable
\- q \~ 0 = degenerate/collinear/sliver
Why q? It's affine-invariant and dimensionless, so it works even when points have varying z values. Simple area check fails on near-degenerate slivers with tiny but non-zero area.
Python + NumPy, \~50 LOC core, with tests and Colab demo:
https://github.com/Imanisolace/Geometric-chaos-sieve.affine_chaos
Demo:
Stable 3D: \[\[1,0,0.2\],\[-0.5,0.866,1.4\],\[-0.5,-0.866,-0.7\]\] -\> q=0.44
Collinear: \[\[0,0,0\],\[1,0,1\],\[2,0,2\]\] -\> q=0.0 reject
Sliver: \[\[0,0,0\],\[1,0,0\],\[0.5,0.001,0\]\] -\> q=0.002 reject