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