Changeset: 9d81aed47e53 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d81aed47e53 Modified Files: geom/monetdb5/geom.c geom/monetdb5/geom.h geom/monetdb5/geom.mal geom/monetdb5/geomBulk.c geom/sql/40_geom.sql Branch: sfcgal Log Message:
Merge heads diffs (truncated from 771 to 300 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -7441,9 +7441,6 @@ wkbaHEAP(Heap *heap, size_t capacity) HEAP_initialize(heap, capacity, 0, (int) sizeof(var_t)); } -geom_export str wkbContains_point_bat(bat *out, wkb **a, bat *point_x, bat *point_y); -geom_export str wkbContains_point(bit *out, wkb **a, dbl *point_x, dbl *point_y); - static inline double isLeft(double P0x, double P0y, double P1x, double P1y, double P2x, double P2y) { @@ -7580,8 +7577,10 @@ pnpolyWithHoles(bat *out, int nvert, dbl } } - if (wn) + if (wn) { + *cs++ = 0; continue; + } /*If not in any of the holes, check inside the Polygon */ for (j = 0; j < nvert - 1; j++) { @@ -7608,53 +7607,100 @@ pnpolyWithHoles(bat *out, int nvert, dbl return MAL_SUCCEED; } -#define POLY_NUM_VERT 120 -#define POLY_NUM_HOLE 10 - -str -wkbContains_point_bat(bat *out, wkb **a, bat *point_x, bat *point_y) -{ - double *vert_x, *vert_y, **holes_x = NULL, **holes_y = NULL; - int *holes_n = NULL, j; - wkb *geom = NULL; - str msg = NULL; - +static str +pnpoly_(bit *out, int nvert, dbl *vx, dbl *vy, int nholes, dbl **hx, dbl **hy, int *hn, double px, double py) +{ + int j = 0, h = 0, wn = 0; + + /*First check the holes */ + for (h = 0; h < nholes; h++) { + int nv = hn[h] - 1; + wn = 0; + for (j = 0; j < nv; j++) { + if (hy[h][j] <= py) { + if (hy[h][j + 1] > py) + if (isLeft(hx[h][j], hy[h][j], hx[h][j + 1], hy[h][j + 1], px, py) > 0) + ++wn; + } else { + if (hy[h][j + 1] <= py) + if (isLeft(hx[h][j], hy[h][j], hx[h][j + 1], hy[h][j + 1], px, py) < 0) + --wn; + } + } + + /*It is in one of the holes */ + if (wn) { + break; + } + } + + if (wn) { + *out = 0; + return MAL_SUCCEED; + } + + /*If not in any of the holes, check inside the Polygon */ + for (j = 0; j < nvert - 1; j++) { + if (vy[j] <= py) { + if (vy[j + 1] > py) + if (isLeft(vx[j], vy[j], vx[j + 1], vy[j + 1], px, py) > 0) + ++wn; + } else { + if (vy[j + 1] <= py) + if (isLeft(vx[j], vy[j], vx[j + 1], vy[j + 1], px, py) < 0) + --wn; + } + } + *out = wn & 1; + + return MAL_SUCCEED; +} + + +/*TODO: better conversion from WKB*/ +/*TODO: Check if the allocations are working*/ +static str +getVerts(wkb *geom, vertexWKB **res) +{ str err = NULL; str geom_str = NULL; char *str2, *token, *subtoken; char *saveptr1 = NULL, *saveptr2 = NULL; - int nvert = 0, nholes = 0; - - geom = (wkb *) *a; + vertexWKB *verts = NULL; + + /*Check if it is a Polygon*/ if ((err = wkbAsText(&geom_str, &geom, NULL)) != MAL_SUCCEED) { return err; } + + verts = (vertexWKB*) GDKzalloc(sizeof(vertexWKB)); + geom_str = strchr(geom_str, '('); geom_str += 2; /*Lets get the polygon */ token = strtok_r(geom_str, ")", &saveptr1); - vert_x = GDKmalloc(POLY_NUM_VERT * sizeof(double)); - vert_y = GDKmalloc(POLY_NUM_VERT * sizeof(double)); + verts->vert_x = GDKmalloc(POLY_NUM_VERT * sizeof(double)); + verts->vert_y = GDKmalloc(POLY_NUM_VERT * sizeof(double)); for (str2 = token;; str2 = NULL) { subtoken = strtok_r(str2, ",", &saveptr2); if (subtoken == NULL) break; - sscanf(subtoken, "%lf %lf", &vert_x[nvert], &vert_y[nvert]); - nvert++; - if ((nvert % POLY_NUM_VERT) == 0) { - vert_x = GDKrealloc(vert_x, nvert * 2 * sizeof(double)); - vert_y = GDKrealloc(vert_y, nvert * 2 * sizeof(double)); + sscanf(subtoken, "%lf %lf", &(verts->vert_x[verts->nvert]), &(verts->vert_y[verts->nvert])); + verts->nvert++; + if ((verts->nvert % POLY_NUM_VERT) == 0) { + verts->vert_x = GDKrealloc(verts->vert_x, verts->nvert * 2 * sizeof(double)); + verts->vert_y = GDKrealloc(verts->vert_y, verts->nvert * 2 * sizeof(double)); } } token = strtok_r(NULL, ")", &saveptr1); if (token) { - holes_x = GDKzalloc(POLY_NUM_HOLE * sizeof(double *)); - holes_y = GDKzalloc(POLY_NUM_HOLE * sizeof(double *)); - holes_n = GDKzalloc(POLY_NUM_HOLE * sizeof(double *)); + verts->holes_x = GDKzalloc(POLY_NUM_HOLE * sizeof(double *)); + verts->holes_y = GDKzalloc(POLY_NUM_HOLE * sizeof(double *)); + verts->holes_n = GDKzalloc(POLY_NUM_HOLE * sizeof(int *)); } /*Lets get all the holes */ while (token) { @@ -7664,61 +7710,95 @@ wkbContains_point_bat(bat *out, wkb **a, break; token++; - if (!holes_x[nholes]) - holes_x[nholes] = GDKzalloc(POLY_NUM_VERT * sizeof(double)); - if (!holes_y[nholes]) - holes_y[nholes] = GDKzalloc(POLY_NUM_VERT * sizeof(double)); + if (!verts->holes_x[verts->nholes]) + verts->holes_x[verts->nholes] = GDKzalloc(POLY_NUM_VERT * sizeof(double)); + if (!verts->holes_y[verts->nholes]) + verts->holes_y[verts->nholes] = GDKzalloc(POLY_NUM_VERT * sizeof(double)); for (str2 = token;; str2 = NULL) { subtoken = strtok_r(str2, ",", &saveptr2); if (subtoken == NULL) break; - sscanf(subtoken, "%lf %lf", &holes_x[nholes][nhole], &holes_y[nholes][nhole]); + sscanf(subtoken, "%lf %lf", &(verts->holes_x[verts->nholes][nhole]), &(verts->holes_y[verts->nholes][nhole])); nhole++; if ((nhole % POLY_NUM_VERT) == 0) { - holes_x[nholes] = GDKrealloc(holes_x[nholes], nhole * 2 * sizeof(double)); - holes_y[nholes] = GDKrealloc(holes_y[nholes], nhole * 2 * sizeof(double)); + verts->holes_x[verts->nholes] = GDKrealloc(verts->holes_x[verts->nholes], nhole * 2 * sizeof(double)); + verts->holes_y[verts->nholes] = GDKrealloc(verts->holes_y[verts->nholes], nhole * 2 * sizeof(double)); } } - holes_n[nholes] = nhole; - nholes++; - if ((nholes % POLY_NUM_HOLE) == 0) { - holes_x = GDKrealloc(holes_x, nholes * 2 * sizeof(double *)); - holes_y = GDKrealloc(holes_y, nholes * 2 * sizeof(double *)); - holes_n = GDKrealloc(holes_n, nholes * 2 * sizeof(int)); + verts->holes_n[verts->nholes] = nhole; + verts->nholes++; + if ((verts->nholes % POLY_NUM_HOLE) == 0) { + verts->holes_x = GDKrealloc(verts->holes_x, verts->nholes * 2 * sizeof(double *)); + verts->holes_y = GDKrealloc(verts->holes_y, verts->nholes * 2 * sizeof(double *)); + verts->holes_n = GDKrealloc(verts->holes_n, verts->nholes * 2 * sizeof(int)); } token = strtok_r(NULL, ")", &saveptr1); } - if (nholes) - msg = pnpolyWithHoles(out, (int) nvert, vert_x, vert_y, nholes, holes_x, holes_y, holes_n, point_x, point_y); - else { - msg = pnpoly(out, (int) nvert, vert_x, vert_y, point_x, point_y); - } - - GDKfree(vert_x); - GDKfree(vert_y); - if (holes_x && holes_y && holes_n) { - for (j = 0; j < nholes; j++) { - GDKfree(holes_x[j]); - GDKfree(holes_y[j]); + *res = verts; + return MAL_SUCCEED; +} + +static void +freeVerts(vertexWKB *verts) +{ + int j = 0; + + GDKfree(verts->vert_x); + GDKfree(verts->vert_y); + if (verts->holes_x && verts->holes_y && verts->holes_n) { + for (j = 0; j < verts->nholes; j++) { + GDKfree(verts->holes_x[j]); + GDKfree(verts->holes_y[j]); } - GDKfree(holes_x); - GDKfree(holes_y); - GDKfree(holes_n); - } + GDKfree(verts->holes_x); + GDKfree(verts->holes_y); + GDKfree(verts->holes_n); + } + + GDKfree(verts); +} + +str +wkbContains_point_bat(bat *out, wkb **a, bat *point_x, bat *point_y) +{ + vertexWKB *verts = NULL; + wkb *geom = NULL; + str msg = NULL; + + geom = (wkb *) *a; + if ((msg = getVerts(geom, &verts)) != MAL_SUCCEED) { + return msg; + } + + msg = pnpolyWithHoles(out, (int) verts->nvert, verts->vert_x, verts->vert_y, verts->nholes, verts->holes_x, verts->holes_y, verts->holes_n, point_x, point_y); + + if (verts) + freeVerts(verts); return msg; } str -wkbContains_point(bit *out, wkb **a, dbl *point_x, dbl *point_y) -{ - (void) a; - (void) point_x; - (void) point_y; - *out = TRUE; +wkbContainsXYZ(bit *out, wkb **a, dbl *px, dbl *py, dbl *pz, int *srid) +{ + vertexWKB *verts = NULL; + wkb *geom = NULL; + str msg = NULL; + (void) pz; + + geom = (wkb *) *a; + if ((msg = getVerts(geom, &verts)) != MAL_SUCCEED) { + return msg; + } + + msg = pnpoly_(out, (int) verts->nvert, verts->vert_x, verts->vert_y, verts->nholes, verts->holes_x, verts->holes_y, verts->holes_n, *px, *py); + + if (verts) + freeVerts(verts); + return MAL_SUCCEED; } @@ -8089,24 +8169,24 @@ IntersectsXYZsubjoin_intern(bat *lres, b int *rSRIDs = NULL; if( (bl= BATdescriptor(*lid)) == NULL ) - throw(MAL, "algebra.instersects", RUNTIME_OBJECT_MISSING); + throw(MAL, "algebra.intersects", RUNTIME_OBJECT_MISSING); if( (bx= BATdescriptor(*xid)) == NULL ){ BBPunfix(*lid); - throw(MAL, "algebra.instersects", RUNTIME_OBJECT_MISSING); + throw(MAL, "algebra.intersects", RUNTIME_OBJECT_MISSING); } if( (by= BATdescriptor(*yid)) == NULL ){ BBPunfix(*lid); BBPunfix(*xid); - throw(MAL, "algebra.instersects", RUNTIME_OBJECT_MISSING); + throw(MAL, "algebra.intersects", RUNTIME_OBJECT_MISSING); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list