commit de0fabe1715f6527c0e30a06877ec948552e3a12
parent f49564ed4db5ef5d670cc656c346e16c59b046db
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Mon, 21 Dec 2020 11:03:52 +0100
Improve closest point test
Diffstat:
1 file changed, 29 insertions(+), 18 deletions(-)
diff --git a/src/test_s2d_closest_point.c b/src/test_s2d_closest_point.c
@@ -333,7 +333,7 @@ test_single_segment(struct s2d_device* dev)
float low[2], upp[2], mid[2];
float pos[2];
float closest_pos[2];
- size_t i;
+ size_t i, j;
unsigned indices[2] = {0, 1};
f2(vertices+0, -0.5f, -0.3f);
@@ -406,9 +406,11 @@ test_single_segment(struct s2d_device* dev)
FOR_EACH(i, 0, 100) {
float A[2], B[2];
+ const float amplitude = 100;
/* Randomly generate a segment AB on the X axis */
- A[0] = -5 + rand_canonic() * 10;
- B[0] = -5 + rand_canonic() * 10;
+ A[0] = (rand_canonic() - 0.5f) * amplitude;
+ do B[0] = (rand_canonic() - 0.5f) * amplitude;
+ while(fabsf(A[0] - B[0]) < 1e-5);
A[1] = B[1] = 0;
f2_set(vertices + 0, A);
@@ -427,22 +429,31 @@ test_single_segment(struct s2d_device* dev)
(shape, 1, line_segments_get_ids, 2, &vdata, 1, &desc) == RES_OK);
CHK(s2d_scene_view_create(scn, S2D_TRACE, &view) == RES_OK);
- pos[0] = 0; pos[1] = 1;
- CHK(s2d_scene_view_closest_point(view, pos, (float)INF, NULL, &hit) == RES_OK);
- CHK(!S2D_HIT_NONE(&hit));
- CHK(s2d_primitive_get_attrib(&hit.prim, S2D_POSITION, hit.u, &attr) == RES_OK);
- /* 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));
- if(A[0] > pos[0] && B[0] > pos[0]) {
- CHK(f2_eq_eps(closest_pos, (A[0] > B[0] ? B : A), 1.e-4f));
- }
- 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));
- } else {
- float expected[2] = { 0, 0 };
- CHK(f2_eq_eps(closest_pos, expected, 1.e-4f));
+ FOR_EACH(j, 0, 100) {
+ /* Randomly generate a pos not on the segment */
+ pos[0] = (rand_canonic() - 0.5f) * amplitude;
+ do pos[1] = (rand_canonic() - 0.5f) * amplitude;
+ while (fabsf(pos[1]) < 1e-5);
+
+ /* Compute closest point */
+ CHK(s2d_scene_view_closest_point(view, pos, (float)INF, NULL, &hit) == RES_OK);
+ CHK(!S2D_HIT_NONE(&hit));
+ CHK(s2d_primitive_get_attrib(&hit.prim, S2D_POSITION, hit.u, &attr) == RES_OK);
+
+ /* 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));
+ if(A[0] > pos[0] && B[0] > pos[0]) {
+ CHK(f2_eq_eps(closest_pos, (A[0] > B[0] ? B : A), 1.e-4f));
+ }
+ 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));
+ } else {
+ float expected[2];
+ f2(expected, pos[0], 0);
+ CHK(f2_eq_eps(closest_pos, expected, 1.e-4f));
+ }
}
CHK(s2d_scene_view_ref_put(view) == RES_OK);