#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "vdefs.h" MODULE = Math::Geometry::Voronoi PACKAGE = Math::Geometry::Voronoi SV * compute_voronoi_xs(points_ref, xmin, xmax, ymin, ymax) SV *points_ref double xmin double xmax double ymin double ymax PREINIT: Site *sites; SV *ref, *sv, *sv_x, *sv_y; AV *av; AV *points; I32 i; int debug = 0; I32 num_points; SV **svp; AV *lines, *edges, *vertices; HV *result; CODE: { points = (AV *) SvRV(points_ref); num_points = av_len(points) + 1; // translate points AV into Sites array for use by voronoi C code sites = (Site *) myalloc(num_points * sizeof(Site)); for (i = 0; i < num_points; i++) { svp = av_fetch(points, i, 0); if (!svp) croak("Failed to fetch points[%d]!", i); ref = *svp; if (!SvROK(ref)) croak("Points array must be an array of arrays!"); sv = SvRV(ref); if (SvTYPE(sv) != SVt_PVAV) croak("Points array must be an array of arrays!"); av = (AV *) sv; if (av_len(av) < 1) croak("Points array must be an array of arrays with 2 values not %d!", av_len(av)); svp = av_fetch(av, 0, 0); if (!svp) croak("Failed to fetch points[%d][0]!", i); sv_x = *svp; svp = av_fetch(av, 1, 0); if (!svp) croak("Failed to fetch points[%d][1]!", i); sv_y = *svp; sites[i].coord.x = SvNV(sv_x); sites[i].coord.y = SvNV(sv_y); sites[i].sitenbr = i; sites[i].refcnt = 0 ; } // setup arrays to hold results lines = newAV(); edges = newAV(); vertices = newAV(); compute_voronoi(sites, num_points, xmin, xmax, ymin, ymax, debug, lines, edges, vertices); result = newHV(); hv_store(result, "lines", strlen("lines"), newRV_noinc((SV*) lines), 0); hv_store(result, "edges", strlen("edges"), newRV_noinc((SV*) edges), 0); hv_store(result, "vertices", strlen("vertices"), newRV_noinc((SV*) vertices), 0); } RETVAL = newRV_noinc((SV*) result); OUTPUT: RETVAL