示例#1
0
文件: polygon.c 项目: 31415us/modules
/* 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);
}
示例#2
0
文件: _mangle.c 项目: esheldon/misc
/*
 * 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;
}
示例#3
0
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;
	}

}
示例#4
0
文件: _mangle.c 项目: esheldon/misc
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;
}
示例#5
0
文件: mangle.c 项目: erykoff/pymangle
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;
}
示例#6
0
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;
                }
            }
        }
    }
}
示例#7
0
文件: polygon.c 项目: 31415us/modules
/* 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;
}