From 211621cbface96679029fdfa3abdcede01558145 Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Wed, 11 Jan 2023 21:59:43 +0200 Subject: [PATCH 1/7] polygon.as_segments() --- docs/polygon.rst | 9 +++++++++ src_c/polygon.c | 26 ++++++++++++++++++++++++++ test/test_polygon.py | 11 ++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/docs/polygon.rst b/docs/polygon.rst index a4d0e3e5..ee7dd21d 100644 --- a/docs/polygon.rst +++ b/docs/polygon.rst @@ -148,6 +148,15 @@ Polygon Methods .. ## Polygon.collidepoint ## + .. method:: as_segments + + | :sl:`returns the line segments of the polygon` + | :sg:`as_segments() -> list` + + Returns a list of the line segments of the polygon given as self. + + .. ## Polygon.as_segments ## + .. method:: copy | :sl:`returns a copy of the polygon` diff --git a/src_c/polygon.c b/src_c/polygon.c index 61da2d35..fb2885af 100644 --- a/src_c/polygon.c +++ b/src_c/polygon.c @@ -468,6 +468,31 @@ pg_polygon_move(pgPolygonObject *self, PyObject *const *args, Py_ssize_t nargs) return tmp; } +static PyObject * +pg_polygon_as_segments(pgPolygonObject *self) { + PyObject *list = PyList_New(0); + for (Py_ssize_t i = 0; i < self->polygon.verts_num*2; i+=2) { + double next_vertex_x; + double next_vertex_y; + + if (i >= self->polygon.verts_num * 2 - 2) { + next_vertex_x = self->polygon.vertices[0]; + next_vertex_y = self->polygon.vertices[1]; + } + else { + next_vertex_x = self->polygon.vertices[i + 2]; + next_vertex_y = self->polygon.vertices[i + 3]; + } + + PyList_Append(list, pgLine_New4( + self->polygon.vertices[i], self->polygon.vertices[i + 1], + next_vertex_x, next_vertex_y) + ); + } + + return list; +} + static PyObject * pg_polygon_move_ip(pgPolygonObject *self, PyObject *const *args, Py_ssize_t nargs) @@ -613,6 +638,7 @@ pg_polygon_rotate_ip(pgPolygonObject *self, PyObject *arg) } static struct PyMethodDef pg_polygon_methods[] = { + {"as_segments", (PyCFunction)pg_polygon_as_segments, METH_NOARGS, NULL}, {"move", (PyCFunction)pg_polygon_move, METH_FASTCALL, NULL}, {"move_ip", (PyCFunction)pg_polygon_move_ip, METH_FASTCALL, NULL}, {"rotate", (PyCFunction)pg_polygon_rotate, METH_O, NULL}, diff --git a/test/test_polygon.py b/test/test_polygon.py index b63fc59c..bf216ffe 100644 --- a/test/test_polygon.py +++ b/test/test_polygon.py @@ -3,7 +3,7 @@ from pygame import Vector2, Vector3 import geometry -from geometry import Polygon +from geometry import Polygon, Line import math @@ -439,6 +439,15 @@ def test__repr__(self): self.assertEqual(repr(polygon), p_repr) self.assertEqual(polygon.__repr__(), p_repr) + def test_as_segments(self): + """Checks whether polygon segments are correct""" + poly = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) + self.assertEqual(poly.as_segments(), [Line((0, 0), (1, 0)), Line((1, 0), (1, 1)), Line((1, 1), (0, 1)), Line((0, 1), (0, 0))]) + poly = Polygon([(123.23, 35.6), (56.4, 87.45), (43.1, 12.3)]) + self.assertEqual(poly.as_segments(), [Line((123.23, 35.6), (56.4, 87.45)), Line((56.4, 87.45), (43.1, 12.3)), Line((43.1, 12.3), (123.23, 35.6))]) + poly = Polygon([[1, 2], [3, 4], [5, 6]]) + self.assertEqual(poly.as_segments(), [Line((1, 2), (3, 4)), Line((3, 4), (5, 6)), Line((5, 6), (1, 2))]) + def test_move(self): """Checks whether polygon moved correctly.""" poly = Polygon(_some_vertices.copy()) From 13c3756d8ce8ea051751a3b560331a9daaa3461e Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Wed, 11 Jan 2023 22:06:54 +0200 Subject: [PATCH 2/7] format formatting --- test/test_polygon.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/test/test_polygon.py b/test/test_polygon.py index bf216ffe..043ace28 100644 --- a/test/test_polygon.py +++ b/test/test_polygon.py @@ -442,11 +442,29 @@ def test__repr__(self): def test_as_segments(self): """Checks whether polygon segments are correct""" poly = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) - self.assertEqual(poly.as_segments(), [Line((0, 0), (1, 0)), Line((1, 0), (1, 1)), Line((1, 1), (0, 1)), Line((0, 1), (0, 0))]) + self.assertEqual( + poly.as_segments(), + [ + Line((0, 0), (1, 0)), + Line((1, 0), (1, 1)), + Line((1, 1), (0, 1)), + Line((0, 1), (0, 0)), + ], + ) poly = Polygon([(123.23, 35.6), (56.4, 87.45), (43.1, 12.3)]) - self.assertEqual(poly.as_segments(), [Line((123.23, 35.6), (56.4, 87.45)), Line((56.4, 87.45), (43.1, 12.3)), Line((43.1, 12.3), (123.23, 35.6))]) + self.assertEqual( + poly.as_segments(), + [ + Line((123.23, 35.6), (56.4, 87.45)), + Line((56.4, 87.45), (43.1, 12.3)), + Line((43.1, 12.3), (123.23, 35.6)), + ], + ) poly = Polygon([[1, 2], [3, 4], [5, 6]]) - self.assertEqual(poly.as_segments(), [Line((1, 2), (3, 4)), Line((3, 4), (5, 6)), Line((5, 6), (1, 2))]) + self.assertEqual( + poly.as_segments(), + [Line((1, 2), (3, 4)), Line((3, 4), (5, 6)), Line((5, 6), (1, 2))], + ) def test_move(self): """Checks whether polygon moved correctly.""" From 5c6781cd0b932c9ee4bbfd99e09e25921c3d16d9 Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Wed, 11 Jan 2023 22:20:12 +0200 Subject: [PATCH 3/7] forgot geometry.pyi --- geometry.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/geometry.pyi b/geometry.pyi index 16aec657..32cd9590 100644 --- a/geometry.pyi +++ b/geometry.pyi @@ -208,6 +208,8 @@ class Polygon: @overload def move(self, move_by: Coordinate) -> Polygon: ... @overload + def as_segments(self) -> List[Polygon]: ... + @overload def move_ip(self, x: float, y: float) -> None: ... @overload def move_ip(self, move_by: Coordinate) -> None: ... From 684e6fb0fa63095840ce2489dff5a0bda1ae176d Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Wed, 11 Jan 2023 22:49:14 +0200 Subject: [PATCH 4/7] changes as per request --- docs/polygon.rst | 2 +- geometry.pyi | 2 +- src_c/polygon.c | 27 +++++++++++++++------------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/docs/polygon.rst b/docs/polygon.rst index ee7dd21d..b03e4065 100644 --- a/docs/polygon.rst +++ b/docs/polygon.rst @@ -151,7 +151,7 @@ Polygon Methods .. method:: as_segments | :sl:`returns the line segments of the polygon` - | :sg:`as_segments() -> list` + | :sg:`as_segments() -> list[Line]` Returns a list of the line segments of the polygon given as self. diff --git a/geometry.pyi b/geometry.pyi index 32cd9590..d4c6c56f 100644 --- a/geometry.pyi +++ b/geometry.pyi @@ -208,7 +208,7 @@ class Polygon: @overload def move(self, move_by: Coordinate) -> Polygon: ... @overload - def as_segments(self) -> List[Polygon]: ... + def as_segments(self) -> List[Line]: ... @overload def move_ip(self, x: float, y: float) -> None: ... @overload diff --git a/src_c/polygon.c b/src_c/polygon.c index 31cf298c..4ab6485d 100644 --- a/src_c/polygon.c +++ b/src_c/polygon.c @@ -469,25 +469,28 @@ pg_polygon_move(pgPolygonObject *self, PyObject *const *args, Py_ssize_t nargs) } static PyObject * -pg_polygon_as_segments(pgPolygonObject *self) { - PyObject *list = PyList_New(0); - for (Py_ssize_t i = 0; i < self->polygon.verts_num*2; i+=2) { +pg_polygon_as_segments(pgPolygonObject *self, PyObject *_null) { + double *verts = self->polygon.vertices; + Py_ssize_t vert_num = self->polygon.verts_num; + PyObject *list = PyList_New(vert_num); + for (Py_ssize_t i = 0; i < vert_num * 2; i+=2) { double next_vertex_x; double next_vertex_y; - if (i >= self->polygon.verts_num * 2 - 2) { - next_vertex_x = self->polygon.vertices[0]; - next_vertex_y = self->polygon.vertices[1]; + if (i >= vert_num * 2 - 2) { + next_vertex_x = verts[0]; + next_vertex_y = verts[1]; } else { - next_vertex_x = self->polygon.vertices[i + 2]; - next_vertex_y = self->polygon.vertices[i + 3]; + next_vertex_x = verts[i + 2]; + next_vertex_y = verts[i + 3]; } - PyList_Append(list, pgLine_New4( - self->polygon.vertices[i], self->polygon.vertices[i + 1], - next_vertex_x, next_vertex_y) - ); + PyObject *line = pgLine_New4(verts[i], verts[i + 1], next_vertex_x, next_vertex_y); + if (!line) { + return NULL; + } + PyList_SET_ITEM(list, i / 2, line); } return list; From 2fa387a393a78283b6534c9b4e115a5ca42611a3 Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Thu, 12 Jan 2023 10:52:24 +0200 Subject: [PATCH 5/7] simplified function --- __geometry_cache__/times.json | 13 +++++++++++++ src_c/geometry.c | 1 + src_c/polygon.c | 34 +++++++++++++++++----------------- 3 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 __geometry_cache__/times.json diff --git a/__geometry_cache__/times.json b/__geometry_cache__/times.json new file mode 100644 index 00000000..e0f16236 --- /dev/null +++ b/__geometry_cache__/times.json @@ -0,0 +1,13 @@ +{ + "src_c/simd_collisions_avx2.c": 1673454104.5335083, + "src_c/collisions.c": 1673470915.2233338, + "src_c/line.c": 1673513011.990009, + "src_c/polygon.c": 1673513360.1766646, + "src_c/simd_collisions.h": 1673454104.5301747, + "src_c/geometry.c": 1673513365.7066643, + "src_c/circle.c": 1673470915.2233338, + "src_c/include/base.h": 1673454104.5301747, + "src_c/include/geometry.h": 1673470915.2233338, + "src_c/include/collisions.h": 1673470915.2233338, + "src_c/include/pygame.h": 1673454090.9368412 +} \ No newline at end of file diff --git a/src_c/geometry.c b/src_c/geometry.c index b014f2b9..8a2b3d05 100644 --- a/src_c/geometry.c +++ b/src_c/geometry.c @@ -362,3 +362,4 @@ MODINIT_DEFINE(geometry) } return module; } + \ No newline at end of file diff --git a/src_c/polygon.c b/src_c/polygon.c index 4ab6485d..a4ed80fb 100644 --- a/src_c/polygon.c +++ b/src_c/polygon.c @@ -470,27 +470,27 @@ pg_polygon_move(pgPolygonObject *self, PyObject *const *args, Py_ssize_t nargs) static PyObject * pg_polygon_as_segments(pgPolygonObject *self, PyObject *_null) { - double *verts = self->polygon.vertices; - Py_ssize_t vert_num = self->polygon.verts_num; - PyObject *list = PyList_New(vert_num); - for (Py_ssize_t i = 0; i < vert_num * 2; i+=2) { - double next_vertex_x; - double next_vertex_y; - - if (i >= vert_num * 2 - 2) { - next_vertex_x = verts[0]; - next_vertex_y = verts[1]; - } - else { - next_vertex_x = verts[i + 2]; - next_vertex_y = verts[i + 3]; - } + double *vertices = self->polygon.vertices; + Py_ssize_t verts_num = self->polygon.verts_num; + Py_ssize_t verts_num_double = verts_num * 2; + + PyObject *list = PyList_New(verts_num); + if (!list) { + Py_DECREF(list); + return NULL; + } - PyObject *line = pgLine_New4(verts[i], verts[i + 1], next_vertex_x, next_vertex_y); + for (Py_ssize_t i = 0; i < verts_num; i++) { + Py_ssize_t i2 = i * 2; + PyObject *line = pgLine_New4(vertices[i2], vertices[i2 + 1], + vertices[(i2 + 2) % verts_num_double], + vertices[(i2 + 3) % verts_num_double]); if (!line) { + Py_DECREF(list); return NULL; } - PyList_SET_ITEM(list, i / 2, line); + + PyList_SET_ITEM(list, i, line); } return list; From 27066d53dbd559e000e69e223a2c99036f61ec75 Mon Sep 17 00:00:00 2001 From: ScriptLineStudios Date: Thu, 12 Jan 2023 10:52:52 +0200 Subject: [PATCH 6/7] removed times.json --- __geometry_cache__/times.json | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 __geometry_cache__/times.json diff --git a/__geometry_cache__/times.json b/__geometry_cache__/times.json deleted file mode 100644 index e0f16236..00000000 --- a/__geometry_cache__/times.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "src_c/simd_collisions_avx2.c": 1673454104.5335083, - "src_c/collisions.c": 1673470915.2233338, - "src_c/line.c": 1673513011.990009, - "src_c/polygon.c": 1673513360.1766646, - "src_c/simd_collisions.h": 1673454104.5301747, - "src_c/geometry.c": 1673513365.7066643, - "src_c/circle.c": 1673470915.2233338, - "src_c/include/base.h": 1673454104.5301747, - "src_c/include/geometry.h": 1673470915.2233338, - "src_c/include/collisions.h": 1673470915.2233338, - "src_c/include/pygame.h": 1673454090.9368412 -} \ No newline at end of file From 5ab8139e5f0e732cf290ada00559c3bfd44f1267 Mon Sep 17 00:00:00 2001 From: Alberto <103119829+itzpr3d4t0r@users.noreply.github.com> Date: Fri, 12 May 2023 16:57:26 +0200 Subject: [PATCH 7/7] removed unnecessary decref --- src_c/polygon.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_c/polygon.c b/src_c/polygon.c index 5926674c..f9bae951 100644 --- a/src_c/polygon.c +++ b/src_c/polygon.c @@ -781,7 +781,6 @@ pg_polygon_as_segments(pgPolygonObject *self, PyObject *_null) { PyObject *list = PyList_New(verts_num); if (!list) { - Py_DECREF(list); return NULL; } @@ -1272,4 +1271,4 @@ static PyTypeObject pgPolygon_Type = { .tp_getset = pg_polygon_getsets, .tp_init = (initproc)pg_polygon_init, .tp_new = pg_polygon_new, -}; \ No newline at end of file +};