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; } } }
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(); } }
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)); }
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; } } }
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); }
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(); } }
static PyObject * Poly_get_is_centroid_known(polypaths_planar_overridePolygonObject *self) { return Py_BOOL(self->flags & POLY_CENTROID_KNOWN_FLAG); }
static PyObject * Poly_get_is_simple_known(polypaths_planar_overridePolygonObject *self) { return Py_BOOL(self->flags & POLY_SIMPLE_KNOWN_FLAG); }
static PyObject * Poly_get_is_convex(polypaths_planar_overridePolygonObject *self) { return Py_BOOL(poly_is_convex(self)); }
static PyObject * Poly_get_is_convex_known(polypaths_planar_overridePolygonObject *self) { return Py_BOOL(self->flags & POLY_CONVEX_KNOWN_FLAG); }