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 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:
Msrc/test_s2d_closest_point.c | 47+++++++++++++++++++++++++++++------------------
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);