star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

test_scpr_intersector.c (6285B)


      1 /* Copyright (C) 2016-2018, 2021-2024 |Méso|Star> (contact@meso-star.com)
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #define _POSIX_C_SOURCE 200112L
     17 
     18 #include "scpr.h"
     19 #include "test_scpr_utils.h"
     20 
     21 #include <rsys/rsys.h>
     22 
     23 #include <memory.h>
     24 
     25 struct cpt {
     26   size_t simple, overlapping;
     27 };
     28 
     29 static int
     30 simple_intersection
     31   (struct scpr_callback_segment* segment1,
     32    struct scpr_callback_segment* segment2,
     33    void* data)
     34 {
     35   struct cpt* cpt = (struct cpt*)data;
     36   (void)segment1; (void)segment2;
     37   ASSERT(cpt);
     38   cpt->simple++;
     39   return 0;
     40 }
     41 
     42 static int
     43 overlapping_segments
     44   (struct scpr_callback_segment* segment1,
     45    struct scpr_callback_segment* segment2,
     46    void* data)
     47 {
     48   struct cpt* cpt = (struct cpt*)data;
     49   (void)segment1; (void)segment2;
     50   ASSERT(cpt);
     51   cpt->overlapping++;
     52   return 0;
     53 }
     54 
     55 int
     56 main(int argc, char** argv)
     57 {
     58   struct mem_allocator allocator;
     59   struct scpr_device* dev;
     60   struct scpr_device_create_args args = SCPR_DEVICE_CREATE_ARGS_DEFAULT;
     61   struct scpr_intersector* inter;
     62   struct scpr_intersector_check_callbacks cb
     63     = SCPR_INTERSECTOR_CHECK_CALLBACKS_NULL__ ;
     64   struct polygon_context ctx;
     65   struct scpr_polygon *p01, *p23, *p4;
     66   size_t ncomps = 2;
     67   double** coords;
     68   /*                         1,1
     69    *            +-----------+----+
     70    *            |         / |   /
     71    *            |       /   | /
     72    *      +-----------+-C2--+
     73    *      |     |     |     |
     74    *      |     |     |     |
     75    *      |     +-C0--+-+---+----+----+
     76    *      |   0,0     |/         |    |
     77    *      |           +-C3-------+-C4-+
     78    *      +-C1--------+
     79    * -0.5,-0.5
     80    */
     81   double coords0[] = {
     82     0.0, 0.0,
     83     1.0, 0.0,
     84     1.0, 1.0,
     85     0.0, 1.0
     86   };
     87   double coords1[] = {
     88     -0.5, -0.5,
     89     0.5, -0.5,
     90     0.5, 0.5,
     91     -0.5, 0.5
     92   };
     93   double coords2[] = {
     94     0.5, 0.5,
     95     1.0, 0.5,
     96     1.5, 1.0,
     97     1.0, 1.0
     98   };
     99   double coords3[] = {
    100     0.5, -0.3,
    101     1.5, -0.3,
    102     1.5, 0.0,
    103     0.7, 0.0
    104   };
    105   double coords4[] = {
    106     1.5, -0.3,
    107     2.0, -0.3,
    108     2.0, 0.0,
    109     1.5, 0
    110   };
    111   size_t nverts[] = { 4, 4 };
    112   struct cpt cpt = { 0, 0 };
    113   (void)argc, (void)argv;
    114 
    115   mem_init_proxy_allocator(&allocator, &mem_default_allocator);
    116   args.allocator = &allocator;
    117   args.verbosity_level = 3;
    118   args.precision = 6;
    119   OK(scpr_device_create(&args, &dev));
    120 
    121   BAD(scpr_intersector_create(NULL, NULL));
    122   BAD(scpr_intersector_create(dev, NULL));
    123   BAD(scpr_intersector_create(NULL, &inter));
    124   OK(scpr_intersector_create(dev, &inter));
    125 
    126   BAD(scpr_intersector_ref_get(NULL));
    127   OK(scpr_intersector_ref_get(inter));
    128 
    129   BAD(scpr_intersector_ref_put(NULL));
    130   OK(scpr_intersector_ref_put(inter));
    131 
    132   OK(scpr_polygon_create(dev, &p01));
    133   OK(scpr_polygon_create(dev, &p23));
    134   OK(scpr_polygon_create(dev, &p4));
    135   coords = (double**)MEM_CALLOC(&allocator, ncomps, sizeof(*coords));
    136   coords[0] = (double*)MEM_CALLOC(&allocator, nverts[0], 2*sizeof(**coords));
    137   coords[1] = (double*)MEM_CALLOC(&allocator, nverts[1], 2*sizeof(**coords));
    138 
    139   ctx.coords = coords;
    140   ctx.nverts = nverts;
    141   ctx.ncomps = ncomps;
    142 
    143   #define SETUP scpr_polygon_setup_indexed_vertices
    144   memcpy(coords[0], coords0, 2*nverts[0]*sizeof(**coords));
    145   memcpy(coords[1], coords1, 2*nverts[1]*sizeof(**coords));
    146   OK(SETUP(p01, ncomps, pget_nverts, pget_pos, &ctx));
    147 
    148   memcpy(coords[0], coords2, 2*nverts[0]*sizeof(**coords));
    149   memcpy(coords[1], coords3, 2*nverts[1]*sizeof(**coords));
    150   OK(SETUP(p23, ncomps, pget_nverts, pget_pos, &ctx));
    151 
    152   memcpy(coords[0], coords4, 2*nverts[0]*sizeof(**coords));
    153   OK(SETUP(p4, 1, pget_nverts, pget_pos, &ctx));
    154 
    155   BAD(scpr_intersector_register_component(NULL, NULL, ncomps));
    156   BAD(scpr_intersector_register_component(NULL, NULL, 0));
    157   BAD(scpr_intersector_register_component(NULL, p01, ncomps));
    158   BAD(scpr_intersector_register_component(inter, NULL, ncomps));
    159   BAD(scpr_intersector_register_component(NULL, p01, 0));
    160   BAD(scpr_intersector_register_component(inter, NULL, 0));
    161   BAD(scpr_intersector_register_component(inter, p01, ncomps));
    162   OK(scpr_intersector_register_component(inter, p01, 0));
    163   OK(scpr_intersector_register_component(inter, p01, 1));
    164   OK(scpr_intersector_register_component(inter, p23, 0));
    165   OK(scpr_intersector_register_component(inter, p23, 1));
    166   BAD(scpr_intersector_register_component(inter, p23, 1)); /* Registered twice */
    167 
    168   BAD(scpr_intersector_register_polygon(NULL, NULL));
    169   BAD(scpr_intersector_register_polygon(NULL, p01));
    170   BAD(scpr_intersector_register_polygon(inter, NULL));
    171   OK(scpr_intersector_register_polygon(inter, p4));
    172   BAD(scpr_intersector_register_polygon(inter, p4)); /* Registered twice */
    173 
    174   BAD(scpr_intersector_check(NULL, NULL, NULL));
    175   BAD(scpr_intersector_check(NULL, &cb, NULL));
    176   BAD(scpr_intersector_check(inter, NULL, NULL));
    177   BAD(scpr_intersector_check(inter, &cb, NULL));
    178   BAD(scpr_intersector_check(inter, &cb, &cpt)); /* Callbacks are all NULL */
    179   /* Report only intersections */
    180   cb.simple_intersection = simple_intersection;
    181   OK(scpr_intersector_check(inter, &cb, &cpt));
    182   CHK(cpt.simple == 2);
    183   CHK(cpt.overlapping == 0);
    184   /* Report intersections and overlapping */
    185   cb.overlapping_segments = overlapping_segments;
    186   cpt.simple = cpt.overlapping = 0;
    187   OK(scpr_intersector_check(inter, &cb, &cpt));
    188   CHK(cpt.simple == 2);
    189   CHK(cpt.overlapping == 2);
    190 
    191   OK(scpr_polygon_ref_put(p01));
    192   OK(scpr_polygon_ref_put(p23));
    193   OK(scpr_polygon_ref_put(p4));
    194   OK(scpr_intersector_ref_put(inter));
    195   OK(scpr_device_ref_put(dev));
    196 
    197   MEM_RM(&allocator, coords[0]);
    198   MEM_RM(&allocator, coords[1]);
    199   MEM_RM(&allocator, coords);
    200 
    201   check_memory_allocator(&allocator);
    202   mem_shutdown_proxy_allocator(&allocator);
    203   CHK(mem_allocated_size() == 0);
    204   return 0;
    205 }
    206