void zbuffer() { readshadow(); int i,j,k; for (i = -300;i <= 300;++i) for (j = -300;j <= 300;++j) { double z = 1e11; struct point p; struct colour c = black; p.x = i; p.y = j; for (k = 0;k < pla_num;++k) { if (proj_list[k].plan.z != 0) if (in_poly(&proj_list[k].proj,p)) { struct plane pl = proj_list[k].plan; double t = (pl.d-pl.x*i-pl.y*j)/(double)pl.z; if (t >=0 && t < z) { z = t; c = proj_list[k].c; } } } glColor3f(c.r,c.g,c.b); glVertex2i(i,j); } }
float *HadoopGIS::CPU::refine( const int nr_poly_pairs, // mbr of each poly pair const mbr_t *mbrs, const int *idx1, const int *idx2, // index to poly_array 1 and 2 const int no1, const int *offsets1, // offset to poly_arr1's vertices const int no2, const int *offsets2, // offset to poly_arr2's vertices const int nv1, const int *x1, const int *y1,// poly_arr1's vertices const int nv2, const int *x2, const int *y2)// poly_arr2's vertices { float *ratios = NULL; ratios = (float *)malloc(nr_poly_pairs * sizeof(float)); if(!ratios) { perror("malloc error for ratios\n"); return NULL; } for (int i = 0 ; i< nr_poly_pairs ; i++){ int area_union = 0 ; int area_inter = 0 ; int inp1, inp2, x, y; size_t nr_pixels = (size_t)(mbrs[i].r - mbrs[i].l + 1) * (mbrs[i].t - mbrs[i].b + 1); for(size_t ipoint = 0; ipoint < nr_pixels; ipoint++) { x = ipoint % (mbrs[i].r - mbrs[i].l + 1) + mbrs[i].l; y = ipoint / (mbrs[i].t - mbrs[i].b + 1) + mbrs[i].b; inp1 = in_poly(x, y, x1, y1, offsets1[idx1[i]], offsets1[idx1[i]+1]); // in poly1? inp2 = in_poly(x, y, x2, y2, offsets2[idx2[i]], offsets2[idx2[i]+1]); // in poly2? area_inter += inp1 & inp2; area_union += inp1 | inp2; } ratios[i] = area_inter / (float)area_union; } return ratios; }
/* polyhit: * Given a vconfig_t conf, as above, and a point, * return the index of the polygon that contains * the point, or else POLYID_NONE. */ static int polyhit(vconfig_t *conf, Ppoint_t p) { int i; Ppoly_t poly; for (i = 0; i < conf->Npoly; i++) { poly.ps = &(conf->P[conf->start[i]]); poly.pn = conf->start[i+1] - conf->start[i]; if (in_poly(poly, p)) return i; } return POLYID_NONE; }
/* makeSpline: * Construct a spline connecting the endpoints of e, avoiding the npoly * obstacles obs. * The resultant spline is attached to the edge, the positions of any * edge labels are computed, and the graph's bounding box is recomputed. * * If chkPts is true, the function checks if one or both of the endpoints * is on or inside one of the obstacles and, if so, tells the shortest path * computation to ignore them. */ void makeSpline(graph_t* g, edge_t * e, Ppoly_t ** obs, int npoly, boolean chkPts) { Ppolyline_t line, spline; Pvector_t slopes[2]; int i, n_barriers; int pp, qp; Ppoint_t p, q; Pedge_t *barriers; line = ED_path(e); p = line.ps[0]; q = line.ps[line.pn - 1]; /* determine the polygons (if any) that contain the endpoints */ pp = qp = POLYID_NONE; if (chkPts) for (i = 0; i < npoly; i++) { if ((pp == POLYID_NONE) && in_poly(*obs[i], p)) pp = i; if ((qp == POLYID_NONE) && in_poly(*obs[i], q)) qp = i; } make_barriers(obs, npoly, pp, qp, &barriers, &n_barriers); slopes[0].x = slopes[0].y = 0.0; slopes[1].x = slopes[1].y = 0.0; if (Proutespline(barriers, n_barriers, line, slopes, &spline) < 0) { agerr (AGERR, "makeSpline: failed to make spline edge (%s,%s)\n", agnameof(agtail(e)), agnameof(aghead(e))); return; } /* north why did you ever use int coords */ if (Verbose > 1) fprintf(stderr, "spline %s %s\n", agnameof(agtail(e)), agnameof(aghead(e))); clip_and_install(e, aghead(e), spline.ps, spline.pn, &sinfo); free(barriers); addEdgeLabels(g, e, p, q); }
/* this takes the smallest ortho-aligned (the sides of the rectangle are * parallel to the x- and y-axis) rectangle fitting around the points a to d, * checks if the whole rectangle is inside the polygon described by points and * writes it to r if the area is bigger than the rectangle already stored in r. */ static void add_rectangle (Point points[4], Rectangle *r, Point a, Point b, Point c, Point d) { gdouble width; gdouble height; gdouble minx, maxx; gdouble miny, maxy; /* get the orthoaligned (the sides of the rectangle are parallel to the x- * and y-axis) rectangle surrounding the points a to d. */ minx = MIN4 (a.x, b.x, c.x, d.x); maxx = MAX4 (a.x, b.x, c.x, d.x); miny = MIN4 (a.y, b.y, c.y, d.y); maxy = MAX4 (a.y, b.y, c.y, d.y); a.x = minx; a.y = miny; b.x = maxx; b.y = miny; c.x = maxx; c.y = maxy; d.x = minx; d.y = maxy; width = maxx - minx; height = maxy - miny; /* check if this rectangle is inside the polygon "points" */ if (in_poly (points, a) && in_poly (points, b) && in_poly (points, c) && in_poly (points, d)) { gdouble area = width * height; /* check if the new rectangle is larger (in terms of area) * than the currently stored rectangle in r, if yes store * new rectangle to r */ if (r->area <= area) { r->a.x = a.x; r->a.y = a.y; r->b.x = b.x; r->b.y = b.y; r->c.x = c.x; r->c.y = c.y; r->d.x = d.x; r->d.y = d.y; r->area = area; } } }
/* process vgpane methods */ static int vgpanecmd(ClientData clientData, Tcl_Interp * interp, int argc, char *argv[]) { int vargc, length, i, j, n, result; char c, *s, **vargv, vbuf[30]; vgpane_t *vgp, **vgpp; point p, q, *ps; poly *tpp; double alpha, gain; Pvector_t slopes[2]; Ppolyline_t line, spline; int pp, qp; /* polygon indices for p, q */ Pedge_t *barriers; int n_barriers; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", " ", argv[0], " method ?arg arg ...?\"", (char *) NULL); return TCL_ERROR; } if (!(vgpp = (vgpane_t **) tclhandleXlate(vgpaneTable, argv[0]))) { Tcl_AppendResult(interp, "Invalid handle: \"", argv[0], "\"", (char *) NULL); return TCL_ERROR; } vgp = *vgpp; c = argv[1][0]; length = strlen(argv[1]); if ((c == 'c') && (strncmp(argv[1], "coords", length) == 0)) { if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id ?x1 y1 x2 y2...?\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } if (argc == 3) { /* find poly and return its coordinates */ for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { n = vgp->poly[i].boundary.pn; for (j = 0; j < n; j++) { appendpoint(interp, vgp->poly[i].boundary.ps[j]); } return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } /* accept either inline or delimited list */ if ((argc == 4)) { result = Tcl_SplitList(interp, argv[3], &vargc, (CONST84 char ***) &vargv); if (result != TCL_OK) { return result; } } else { vargc = argc - 3; vargv = &argv[3]; } if (!vargc || vargc % 2) { Tcl_AppendResult(interp, "There must be a multiple of two terms in the list.", (char *) NULL); return TCL_ERROR; } /* remove old poly, add modified polygon to the end with the same id as the original */ if (!(remove_poly(vgp, polyid))) { Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } return (insert_poly(interp, vgp, polyid, vargv, vargc)); } else if ((c == 'd') && (strncmp(argv[1], "debug", length) == 0)) { /* debug only */ printf("debug output goes here\n"); return TCL_OK; } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)) { /* delete a vgpane and all memory associated with it */ if (vgp->vc) Pobsclose(vgp->vc); free(vgp->poly); /* ### */ Tcl_DeleteCommand(interp, argv[0]); free((char *) tclhandleFree(vgpaneTable, argv[0])); return TCL_OK; } else if ((c == 'f') && (strncmp(argv[1], "find", length) == 0)) { /* find the polygon that the point is inside and return it id, or null */ if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " x y\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { result = Tcl_SplitList(interp, argv[2], &vargc, (CONST84 char ***) &vargv); if (result != TCL_OK) { return result; } } else { vargc = argc - 2; vargv = &argv[2]; } result = scanpoint(interp, &vargv[0], &p); if (result != TCL_OK) return result; /* determine the polygons (if any) that contain the point */ for (i = 0; i < vgp->Npoly; i++) { if (in_poly(vgp->poly[i].boundary, p)) { sprintf(vbuf, "%d", vgp->poly[i].id); Tcl_AppendElement(interp, vbuf); } } return TCL_OK; } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0)) { /* add poly to end poly list, and it coordinates to the end of the point list */ if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " x1 y1 x2 y2 ...\"", (char *) NULL); return TCL_ERROR; } /* accept either inline or delimited list */ if ((argc == 3)) { result = Tcl_SplitList(interp, argv[2], &vargc, (CONST84 char ***) &vargv); if (result != TCL_OK) { return result; } } else { vargc = argc - 2; vargv = &argv[2]; } if (!vargc || vargc % 2) { Tcl_AppendResult(interp, "There must be a multiple of two terms in the list.", (char *) NULL); return TCL_ERROR; } polyid++; result = insert_poly(interp, vgp, polyid, vargv, vargc); if (result != TCL_OK) return result; sprintf(vbuf, "%d", polyid); Tcl_AppendResult(interp, vbuf, (char *) NULL); return TCL_OK; } else if ((c == 'l') && (strncmp(argv[1], "list", length) == 0)) { /* return list of polygon ids */ for (i = 0; i < vgp->Npoly; i++) { sprintf(vbuf, "%d", vgp->poly[i].id); Tcl_AppendElement(interp, vbuf); } return TCL_OK; } else if ((c == 'p') && (strncmp(argv[1], "path", length) == 0)) { /* return a list of points corresponding to the shortest path that does not cross the remaining "visible" polygons. */ if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " x1 y1 x2 y2\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { result = Tcl_SplitList(interp, argv[2], &vargc, (CONST84 char ***) &vargv); if (result != TCL_OK) { return result; } } else { vargc = argc - 2; vargv = &argv[2]; } if ((vargc < 4)) { Tcl_AppendResult(interp, "invalid points: should be: \"x1 y1 x2 y2\"", (char *) NULL); return TCL_ERROR; } result = scanpoint(interp, &vargv[0], &p); if (result != TCL_OK) return result; result = scanpoint(interp, &vargv[2], &q); if (result != TCL_OK) return result; /* only recompute the visibility graph if we have to */ if ((vc_refresh(vgp))) { Pobspath(vgp->vc, p, POLYID_UNKNOWN, q, POLYID_UNKNOWN, &line); for (i = 0; i < line.pn; i++) { appendpoint(interp, line.ps[i]); } } return TCL_OK; } else if ((c == 'b') && (strncmp(argv[1], "bind", length) == 0)) { if ((argc < 2) || (argc > 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " bind triangle ?command?\"", (char *) NULL); return TCL_ERROR; } if (argc == 2) { Tcl_AppendElement(interp, "triangle"); return TCL_OK; } length = strlen(argv[2]); if (strncmp(argv[2], "triangle", length) == 0) { s = vgp->triangle_cmd; if (argc == 4) vgp->triangle_cmd = s = buildBindings(s, argv[3]); } else { Tcl_AppendResult(interp, "unknown event \"", argv[2], "\": must be one of:\n\ttriangle.", (char *) NULL); return TCL_ERROR; } if (argc == 3) Tcl_AppendResult(interp, s, (char *) NULL); return TCL_OK; } else if ((c == 'b') && (strncmp(argv[1], "bpath", length) == 0)) { /* return a list of points corresponding to the shortest path that does not cross the remaining "visible" polygons. */ if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " x1 y1 x2 y2\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { result = Tcl_SplitList(interp, argv[2], &vargc, (CONST84 char ***) &vargv); if (result != TCL_OK) { return result; } } else { vargc = argc - 2; vargv = &argv[2]; } if ((vargc < 4)) { Tcl_AppendResult(interp, "invalid points: should be: \"x1 y1 x2 y2\"", (char *) NULL); return TCL_ERROR; } result = scanpoint(interp, &vargv[0], &p); if (result != TCL_OK) return result; result = scanpoint(interp, &vargv[2], &q); if (result != TCL_OK) return result; /* determine the polygons (if any) that contain the endpoints */ pp = qp = POLYID_NONE; for (i = 0; i < vgp->Npoly; i++) { tpp = &(vgp->poly[i]); if ((pp == POLYID_NONE) && in_poly(tpp->boundary, p)) pp = i; if ((qp == POLYID_NONE) && in_poly(tpp->boundary, q)) qp = i; } if (vc_refresh(vgp)) { /*Pobspath(vgp->vc, p, pp, q, qp, &line); */ Pobspath(vgp->vc, p, POLYID_UNKNOWN, q, POLYID_UNKNOWN, &line); make_barriers(vgp, pp, qp, &barriers, &n_barriers); slopes[0].x = slopes[0].y = 0.0; slopes[1].x = slopes[1].y = 0.0; Proutespline(barriers, n_barriers, line, slopes, &spline); for (i = 0; i < spline.pn; i++) { appendpoint(interp, spline.ps[i]); } } return TCL_OK; } else if ((c == 'b') && (strncmp(argv[1], "bbox", length) == 0)) { if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { Ppoly_t pp = vgp->poly[i].boundary; point LL, UR; LL = UR = pp.ps[0]; for (j = 1; j < pp.pn; j++) { p = pp.ps[j]; if (p.x > UR.x) UR.x = p.x; if (p.y > UR.y) UR.y = p.y; if (p.x < LL.x) LL.x = p.x; if (p.y < LL.y) LL.y = p.y; } appendpoint(interp, LL); appendpoint(interp, UR); return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } else if ((c == 'c') && (strncmp(argv[1], "center", length) == 0)) { if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { appendpoint(interp, center(vgp->poly[i].boundary.ps, vgp->poly[i].boundary.pn)); return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } else if ((c == 't') && (strncmp(argv[1], "triangulate", length) == 0)) { if ((argc < 2)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " id ", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { Ptriangulate(&(vgp->poly[i].boundary), triangle_callback, vgp); return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } else if ((c == 'r') && (strncmp(argv[1], "rotate", length) == 0)) { if ((argc < 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id alpha\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } if (sscanf(argv[3], "%lg", &alpha) != 1) { Tcl_AppendResult(interp, "not an angle in radians: ", argv[3], (char *) NULL); return TCL_ERROR; } for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { n = vgp->poly[i].boundary.pn; ps = vgp->poly[i].boundary.ps; p = center(ps, n); for (j = 0; j < n; j++) { appendpoint(interp, rotate(p, ps[j], alpha)); } return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } else if ((c == 's') && (strncmp(argv[1], "scale", length) == 0)) { if ((argc < 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id gain\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } if (sscanf(argv[3], "%lg", &gain) != 1) { Tcl_AppendResult(interp, "not a number: ", argv[3], (char *) NULL); return TCL_ERROR; } for (i = 0; i < vgp->Npoly; i++) { if (vgp->poly[i].id == polyid) { n = vgp->poly[i].boundary.pn; ps = vgp->poly[i].boundary.ps; for (j = 0; j < n; j++) { appendpoint(interp, scale(p, ps[j], gain)); } return TCL_OK; } } Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } else if ((c == 'r') && (strncmp(argv[1], "remove", length) == 0)) { if ((argc < 3)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " id\"", (char *) NULL); return TCL_ERROR; } if (sscanf(argv[2], "%d", &polyid) != 1) { Tcl_AppendResult(interp, "not an integer: ", argv[2], (char *) NULL); return TCL_ERROR; } if (remove_poly(vgp, polyid)) return TCL_OK; Tcl_AppendResult(interp, " no such polygon: ", argv[2], (char *) NULL); return TCL_ERROR; } Tcl_AppendResult(interp, "bad method \"", argv[1], "\" must be one of:", "\n\tbbox, bind, bpath, center, coords, delete, find,", "\n\tinsert, list, path, remove, rotate, scale, triangulate.", (char *) NULL); return TCL_ERROR; }