/* public wrapper for is_in_poly() */ uint8_t is_point_in_poly(poly_t *pol, int16_t x, int16_t y) { point_t p; p.x = x; p.y = y; return is_in_poly(&p, pol); }
/* * check the point against the mask. If found, will return the * id and weight. These default to -1 and 0 * * this version does not use pixelization */ static int polyid_and_weight(struct PyMangleMask* self, struct Point* pt, npy_intp* poly_id, double* weight) { int status=1; npy_intp i=0; struct Polygon* ply=NULL; *poly_id=-1; *weight=0.0; // check every pixel until a match is found // assuming snapped so no overlapping polygons. ply = &self->poly_vec->data[0]; for (i=0; i<self->poly_vec->size; i++) { if (is_in_poly(ply, pt)) { *poly_id=ply->poly_id; *weight=ply->weight; break; } ply++; } return status; }
void mouse_handler(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && current_point < num_points) { points[current_point].x = x; points[current_point].y = window_height - y; if (current_point == 0) points[num_points] = points[0]; glBegin(GL_POINTS); glVertex2i(points[current_point].x, points[current_point].y); glEnd(); glFlush(); ++current_point; printf("Kordinate tocke %d: (%d, %d)\n", current_point, x, y); } else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) { resize_scene(window_width, window_height); } if (current_point == num_points && state == GLUT_DOWN) { draw_poly(); if (is_in_poly(x, window_height - y)) printf("Toèka (%d, %d) je unutar poligona\n", x, y); else printf("Toèka (%d, %d) nije unutar poligona\n", x, y); return; } }
static int polyid_and_weight_pixelized(struct PyMangleMask* self, struct Point* pt, npy_intp* poly_id, double* weight) { int status=1; npy_intp pix=0, i=0, ipoly=0; struct IntpStack* pstack=NULL; struct Polygon* ply=NULL; *poly_id=-1; *weight=0.0; if (self->pixeltype == 's') { pix = get_pixel_simple(self->pixelres, pt); if (pix < self->pixel_list_vec->size) { // this is a stack holding indices into the polygon vector pstack = self->pixel_list_vec->data[pix]; for (i=0; i<pstack->size; i++) { ipoly = pstack->data[i]; ply = &self->poly_vec->data[ipoly]; if (is_in_poly(ply, pt)) { *poly_id=ply->poly_id; *weight=ply->weight; break; } } } } else { status=0; PyErr_Format(PyExc_IOError, "Unsupported pixelization scheme: '%c'",self->pixeltype); } return status; }
int mangle_polyid_and_weight_nopix(struct MangleMask *self, struct Point *pt, int64 *poly_id, double *weight) { size_t i=0; struct Polygon* ply=NULL; *poly_id=-1; *weight=0.0; ply = &self->poly_vec->data[0]; for (i=0; i<self->poly_vec->size; i++) { if (is_in_poly(ply, pt)) { *poly_id=ply->poly_id; *weight=ply->weight; break; } ply++; } return 1; }
void fill_tri(cv::Mat &mat,const cv::Vec3i &tri, const std::vector<cv::Point2f> &xy, const std::vector<float> &v,int _l,int _t) { float x1 = xy[tri(0)].x, x2 = xy[tri(1)].x, x3 = xy[tri(2)].x; float y1 = xy[tri(0)].y, y2 = xy[tri(1)].y, y3 = xy[tri(2)].y; float left = min(x1,x2,x3), right = max(x1,x2,x3); float top = min(y1,y2,y3), bottom = max(y1,y2,y3); std::vector<cv::Point2f> pts; pts.reserve(3); pts.push_back(xy[tri(0)]); pts.push_back(xy[tri(1)]); pts.push_back(xy[tri(2)]); cv::Mat A(3,3,CV_32F); cv::Mat B(3,1,CV_32F); for(int i=0;i<3;++i) { int j = tri(i); A.at<float>(i,0) = xy[j].x; A.at<float>(i,1) = xy[j].y; A.at<float>(i,2) = 1; B.at<float>(i,0) = v[j]; } cv::invert(A,A); cv::Mat T = A*B; float ca = T.at<float>(0,0), cb = T.at<float>(1,0), cc = T.at<float>(2,0); for(int x = floor(left); x <= ceil(right); ++ x) { for(int y=floor(top); y<=ceil(bottom) ; ++y) { int r = y-_t,c = x-_l; if(r>=0 && r<mat.rows && c>=0 && c<mat.cols) { PolyResult re = is_in_poly(cv::Point2f(x,y),pts); if(re != out) { mat.at<float>(r,c) = ca*x+cb*y+cc; } } } } }
/* Is segment crossing polygon? (including edges) * 0 don't cross * 1 cross * 2 on a side * 3 touch out (a segment boundary is on a polygon edge, * and the second segment boundary is out of the polygon) */ uint8_t is_crossing_poly(point_t p1, point_t p2, point_t *intersect_pt, poly_t *pol) { uint8_t i; uint8_t ret; point_t p; uint8_t ret1, ret2; uint8_t cpt=0; debug_printf("%" PRIi32 " %" PRIi32 " -> %" PRIi32 " %" PRIi32 " crossing poly %p ?\n", p1.x, p1.y, p2.x, p2.y, pol); debug_printf("poly is : "); for (i=0; i<pol->l; i++) { debug_printf("%" PRIi32 ",%" PRIi32 " ", pol->pts[i].x, pol->pts[i].y); } debug_printf("\n"); for (i=0;i<pol->l;i++) { ret = intersect_segment(&p1, &p2, &pol->pts[i], &pol->pts[(i+1)%pol->l], &p); debug_printf("%" PRIi32 ",%" PRIi32 " -> %" PRIi32 ",%" PRIi32 " return %d\n", pol->pts[i].x, pol->pts[i].y, pol->pts[(i+1)%pol->l].x, pol->pts[(i+1)%pol->l].y, ret); switch(ret) { case 0: break; case 1: if (intersect_pt) *intersect_pt = p; return 1; break; case 2: cpt++; if (intersect_pt) *intersect_pt = p; break; case 3: if (intersect_pt) *intersect_pt = p; return 2; break; } } if (cpt==3 ||cpt==4) return 1; ret1 = is_in_poly(&p1, pol); ret2 = is_in_poly(&p2, pol); debug_printf("is in poly: p1 %d p2: %d cpt %d\r\n", ret1, ret2, cpt); debug_printf("p intersect: %"PRIi32" %"PRIi32"\r\n", p.x, p.y); if (cpt==0) { if (ret1==1 || ret2==1) return 1; return 0; } if (cpt==1) { if (ret1==1 || ret2==1) return 1; return 3; } if (cpt==2) { if (ret1==1 || ret2==1) return 1; if (ret1==0 || ret2==0) return 3; return 1; } return 1; }