コード例 #1
0
static PyObject *
Poly_compare(PyObject *a, PyObject *b, int op)
{
	if (polypaths_planar_overridePolygon_Check(a) && polypaths_planar_overridePolygon_Check(b)) {
		switch (op) {
			case Py_EQ:
				return Py_BOOL(Poly_compare_eq(
					(polypaths_planar_overridePolygonObject *)a, (polypaths_planar_overridePolygonObject *)b));
			case Py_NE:
				return Py_BOOL(!Poly_compare_eq(
					(polypaths_planar_overridePolygonObject *)a, (polypaths_planar_overridePolygonObject *)b));
			default:
				/* Only == and != are defined */
				RETURN_NOT_IMPLEMENTED;
		}
	} else {
		switch (op) {
			case Py_EQ:
				Py_RETURN_FALSE;
			case Py_NE:
				Py_RETURN_TRUE;
			default:
				/* Only == and != are defined */
				RETURN_NOT_IMPLEMENTED;
		}
	}
}
コード例 #2
0
static PyObject *
Poly_contains_point(polypaths_planar_overridePolygonObject *self, PyObject *point)
{
	polypaths_planar_override_vec2_t pt;
	int result = 0;
	double d2;
	polypaths_planar_overrideBBoxObject *bbox;
	
	if (!polypaths_planar_overrideVec2_Parse(point, &pt.x, &pt.y)) {
		PyErr_SetString(PyExc_TypeError,
			"Polygon.contains_point(): "
			"expected Vec2 object for argument");
		return NULL;
	}
	if ((self->flags & (POLY_RADIUS_KNOWN_FLAG | POLY_CENTROID_KNOWN_FLAG))
		== (POLY_RADIUS_KNOWN_FLAG | POLY_CENTROID_KNOWN_FLAG)) {
		d2 = (pt.x - self->centroid.x)*(pt.x - self->centroid.x)
			+ (pt.y - self->centroid.y)*(pt.y - self->centroid.y);
		if (d2 < self->min_r2) return Py_BOOL(1);
		if (d2 > self->max_r2) return Py_BOOL(0);
	}
	if (poly_is_convex(self) && Py_SIZE(self) > 5) {
		result = pnp_y_monotone_test(self, &pt);
	} else {
		if (Py_SIZE(self) > 4) {
			bbox = Poly_get_bbox(self);
			if (bbox == NULL) {
				return NULL;
			}
			if (!polypaths_planar_overrideBBox_contains_point(bbox, &pt)) {
				Py_DECREF(bbox);
				return Py_BOOL(0);
			}
			Py_DECREF(bbox);
		}
		result = pnp_winding_test(self, &pt);
	}
	if (result != -1) {
		return Py_BOOL(result);
	} else {
		return PyErr_NoMemory();
	}
}
コード例 #3
0
ファイル: cbox.c プロジェクト: Jacobmose/ITROB
static PyObject *
BBox_almost_equals(PlanarBBoxObject *self, PlanarBBoxObject *other)
{
	return Py_BOOL(
		PlanarBBox_Check(self) && PlanarBBox_Check(other) &&
		almost_eq(self->min.x, other->min.x) &&
		almost_eq(self->min.y, other->min.y) &&
		almost_eq(self->max.x, other->max.x) &&
		almost_eq(self->max.y, other->max.y));
}
コード例 #4
0
ファイル: cbox.c プロジェクト: Jacobmose/ITROB
static PyObject *
BBox_compare(PyObject *a, PyObject *b, int op)
{
    PlanarBBoxObject *box1, *box2;

	if (PlanarBBox_Check(a) && PlanarBBox_Check(b)) {
        box1 = (PlanarBBoxObject *)a;
        box2 = (PlanarBBoxObject *)b;
		switch (op) {
			case Py_EQ:
                return Py_BOOL(
                    box1->min.x == box2->min.x &&
                    box1->min.y == box2->min.y &&
                    box1->max.x == box2->max.x &&
                    box1->max.y == box2->max.y);
            case Py_NE:
                return Py_BOOL(
                    box1->min.x != box2->min.x ||
                    box1->min.y != box2->min.y ||
                    box1->max.x != box2->max.x ||
                    box1->max.y != box2->max.y);
			default:
				/* Only == and != are defined */
                RETURN_NOT_IMPLEMENTED;
		}
	} else {
		switch (op) {
			case Py_EQ:
				Py_RETURN_FALSE;
			case Py_NE:
				Py_RETURN_TRUE;
			default:
				/* Only == and != are defined */
				RETURN_NOT_IMPLEMENTED;
		}
	}
}
コード例 #5
0
static PyObject *
Poly_get_is_simple(polypaths_planar_overridePolygonObject *self)
{
	if (!(self->flags & POLY_SIMPLE_KNOWN_FLAG)) {
		if (!(self->flags & POLY_CONVEX_KNOWN_FLAG)) {
			Poly_classify(self);
		}
		if (!(self->flags & POLY_SIMPLE_KNOWN_FLAG)) {
			if (!Poly_check_is_simple(self)) {
				return NULL;
			}
		}
	}
	return Py_BOOL(self->flags & POLY_SIMPLE_FLAG);
}
コード例 #6
0
static PyObject *
Poly_pnp_winding_test(polypaths_planar_overridePolygonObject *self, PyObject *point)
{
	polypaths_planar_override_vec2_t pt;
	int result;
	
	if (!polypaths_planar_overrideVec2_Parse(point, &pt.x, &pt.y)) {
		PyErr_SetString(PyExc_TypeError,
			"Polygon.contains_point(): "
			"expected Vec2 object for argument");
		return NULL;
	}
		result = pnp_winding_test(self, &pt);
	if (result != -1) {
		return Py_BOOL(result);
	} else {
		return PyErr_NoMemory();
	}
}
コード例 #7
0
static PyObject *
Poly_get_is_centroid_known(polypaths_planar_overridePolygonObject *self) {
	return Py_BOOL(self->flags & POLY_CENTROID_KNOWN_FLAG);
}
コード例 #8
0
static PyObject *
Poly_get_is_simple_known(polypaths_planar_overridePolygonObject *self) {
	return Py_BOOL(self->flags & POLY_SIMPLE_KNOWN_FLAG);
}
コード例 #9
0
static PyObject *
Poly_get_is_convex(polypaths_planar_overridePolygonObject *self)
{
	return Py_BOOL(poly_is_convex(self));
}
コード例 #10
0
static PyObject *
Poly_get_is_convex_known(polypaths_planar_overridePolygonObject *self) {
	return Py_BOOL(self->flags & POLY_CONVEX_KNOWN_FLAG);
}