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:
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));
}
}