star-2d

Contour structuring for efficient 2D geometric queries
git clone git://git.meso-star.fr/star-2d.git
Log | Files | Refs | README | LICENSE

commit 06c70c6a82b24504b8c347da0bb8730ef846ebb6
parent 401c5325c8c80e05e59d874dcbdf3dc1f4466f94
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue,  5 Jan 2021 11:10:56 +0100

Improve closest point test

Diffstat:
Msrc/test_s2d_closest_point.c | 24+++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/test_s2d_closest_point.c b/src/test_s2d_closest_point.c @@ -405,12 +405,13 @@ test_single_segment(struct s2d_device* dev) CHK(s2d_scene_ref_put(scn) == RES_OK); FOR_EACH(i, 0, 100) { - float A[2], B[2]; - const float amplitude = 100; + float A[2], B[2], tmp[2]; + const float amplitude = 10000; + const float eps = 1e-6f * amplitude; /* Randomly generate a segment AB on the X axis */ A[0] = (rand_canonic() - 0.5f) * amplitude; do B[0] = (rand_canonic() - 0.5f) * amplitude; - while(fabsf(A[0] - B[0]) < 1e-5); + while(fabsf(A[0] - B[0]) < eps); A[1] = B[1] = 0; f2_set(vertices + 0, A); @@ -443,16 +444,25 @@ test_single_segment(struct s2d_device* dev) /* Cross check the closest point query result */ closest_point_segment(pos, A, B, closest_pos); - CHK(f2_eq_eps(closest_pos, attr.value, 1.e-4f)); + CHK(f2_eq_eps(closest_pos, attr.value, eps)); if(A[0] > pos[0] && B[0] > pos[0]) { - CHK(f2_eq_eps(closest_pos, (A[0] > B[0] ? B : A), 1.e-4f)); + const float* X = (A[0] > B[0]) ? B : A; + const float d = f2_len(f2_sub(tmp, pos, X)); + CHK(f2_eq_eps(closest_pos, X, eps)); + CHK(eq_epsf(hit.distance, d, eps)); } else if(A[0] < pos[0] && B[0] < pos[0]) { - CHK(f2_eq_eps(closest_pos, (A[0] < B[0] ? B : A), 1.e-4f)); + const float* X = (A[0] < B[0]) ? B : A; + const float d = f2_len(f2_sub(tmp, pos, X)); + CHK(f2_eq_eps(closest_pos, X, eps)); + CHK(eq_epsf(hit.distance, d, eps)); } else { float expected[2]; + float d = f2_len(f2_sub(tmp, pos, expected)); f2(expected, pos[0], 0); - CHK(f2_eq_eps(closest_pos, expected, 1.e-4f)); + d = f2_len(f2_sub(tmp, pos, expected)); + CHK(f2_eq_eps(closest_pos, expected, eps)); + CHK(eq_epsf(hit.distance, d, eps)); } }