@@ -952,12 +952,12 @@ pg_polygon_pop_vertex(pgPolygonObject *self, PyObject *arg)
952952}
953953
954954static void
955- _pg_rotate_polygon_helper (pgPolygonBase * poly , double angle )
955+ _pg_rotate_polygon_helper (pgPolygonBase * poly , double angle , double rx ,
956+ double ry )
956957{
957958 if (angle == 0.0 || fmod (angle , 360.0 ) == 0.0 ) {
958959 return ;
959960 }
960- double c_x = poly -> c_x , c_y = poly -> c_y ;
961961 Py_ssize_t i2 , verts_num = poly -> verts_num ;
962962 double * vertices = poly -> vertices ;
963963
@@ -966,14 +966,14 @@ _pg_rotate_polygon_helper(pgPolygonBase *poly, double angle)
966966
967967 if (fmod (angle_rad , M_PI_QUO_2 ) != 0.0 ) {
968968 /* handle the general angle case that's not 90, 180 or 270 degrees */
969- double cos_a = cos (angle_rad ) - 1 ;
970- double sin_a = sin (angle_rad );
969+ double c = cos (angle_rad ) - 1 ;
970+ double s = sin (angle_rad );
971971
972972 for (i2 = 0 ; i2 < verts_num * 2 ; i2 += 2 ) {
973- double dx = vertices [i2 ] - c_x ;
974- double dy = vertices [i2 + 1 ] - c_y ;
975- vertices [i2 ] += dx * cos_a - dy * sin_a ;
976- vertices [i2 + 1 ] += dx * sin_a + dy * cos_a ;
973+ double dx = vertices [i2 ] - rx ;
974+ double dy = vertices [i2 + 1 ] - ry ;
975+ vertices [i2 ] += dx * c - dy * s ;
976+ vertices [i2 + 1 ] += dx * s + dy * c ;
977977 }
978978 return ;
979979 }
@@ -989,8 +989,8 @@ _pg_rotate_polygon_helper(pgPolygonBase *poly, double angle)
989989 switch ((int )(angle_rad / M_PI_QUO_2 )) {
990990 case 1 :
991991 /*90 degrees*/
992- v1 = c_x + c_y ;
993- v2 = c_y - c_x ;
992+ v1 = rx + ry ;
993+ v2 = ry - rx ;
994994 for (i2 = 0 ; i2 < verts_num * 2 ; i2 += 2 ) {
995995 double tmp = vertices [i2 ];
996996 vertices [i2 ] = v1 - vertices [i2 + 1 ];
@@ -999,17 +999,17 @@ _pg_rotate_polygon_helper(pgPolygonBase *poly, double angle)
999999 return ;
10001000 case 2 :
10011001 /*180 degrees*/
1002- v1 = c_x * 2 ;
1003- v2 = c_y * 2 ;
1002+ v1 = rx * 2 ;
1003+ v2 = ry * 2 ;
10041004 for (i2 = 0 ; i2 < verts_num * 2 ; i2 += 2 ) {
10051005 vertices [i2 ] = v1 - vertices [i2 ];
10061006 vertices [i2 + 1 ] = v2 - vertices [i2 + 1 ];
10071007 }
10081008 return ;
10091009 case 3 :
10101010 /*270 degrees*/
1011- v1 = c_x + c_y ;
1012- v2 = c_x - c_y ;
1011+ v1 = rx + ry ;
1012+ v2 = rx - ry ;
10131013 for (i2 = 0 ; i2 < verts_num * 2 ; i2 += 2 ) {
10141014 double tmp = vertices [i2 ];
10151015 vertices [i2 ] = v2 + vertices [i2 + 1 ];
@@ -1023,37 +1023,64 @@ _pg_rotate_polygon_helper(pgPolygonBase *poly, double angle)
10231023}
10241024
10251025static PyObject *
1026- pg_polygon_rotate (pgPolygonObject * self , PyObject * arg )
1026+ pg_polygon_rotate (pgPolygonObject * self , PyObject * const * args ,
1027+ Py_ssize_t nargs )
10271028{
1028- double angle ;
1029+ if (!nargs || nargs > 2 ) {
1030+ return RAISE (PyExc_TypeError , "rotate requires 1 or 2 arguments" );
1031+ }
1032+
10291033 pgPolygonObject * ret ;
1034+ pgPolygonBase * poly = & self -> polygon ;
1035+ double angle , rx = poly -> c_x , ry = poly -> c_y ;
10301036
1031- if (!pg_DoubleFromObj (arg , & angle )) {
1037+ /*get the angle argument*/
1038+ if (!pg_DoubleFromObj (args [0 ], & angle )) {
10321039 return RAISE (PyExc_TypeError ,
1033- "Invalid angle parameter , must be numeric" );
1040+ "Invalid angle argument , must be numeric" );
10341041 }
10351042
1036- ret = _pg_polygon_subtype_new2_copy (Py_TYPE (self ), & self -> polygon );
1043+ /*get the rotation point argument if given*/
1044+ if (nargs == 2 && !pg_TwoDoublesFromObj (args [1 ], & rx , & ry )) {
1045+ return RAISE (PyExc_TypeError ,
1046+ "Invalid rotation point argument, must be numeric" );
1047+ }
1048+
1049+ ret = _pg_polygon_subtype_new2_copy (Py_TYPE (self ), poly );
10371050 if (!ret ) {
10381051 return NULL ;
10391052 }
10401053
1041- _pg_rotate_polygon_helper (& ret -> polygon , angle );
1054+ _pg_rotate_polygon_helper (& ret -> polygon , angle , rx , ry );
10421055
10431056 return (PyObject * )ret ;
10441057}
10451058
10461059static PyObject *
1047- pg_polygon_rotate_ip (pgPolygonObject * self , PyObject * arg )
1060+ pg_polygon_rotate_ip (pgPolygonObject * self , PyObject * const * args ,
1061+ Py_ssize_t nargs )
10481062{
1063+ if (!nargs || nargs > 2 ) {
1064+ return RAISE (PyExc_TypeError , "rotate_ip requires 1 or 2 arguments" );
1065+ }
1066+
1067+ pgPolygonBase * poly = & self -> polygon ;
10491068 double angle ;
1069+ double rx = poly -> c_x , ry = poly -> c_y ;
1070+
1071+ /*get the angle argument*/
1072+ if (!pg_DoubleFromObj (args [0 ], & angle )) {
1073+ return RAISE (PyExc_TypeError ,
1074+ "Invalid argument parameter, must be numeric" );
1075+ }
10501076
1051- if (!pg_DoubleFromObj (arg , & angle )) {
1077+ /*get the rotation point argument if given*/
1078+ if (nargs == 2 && !pg_TwoDoublesFromObj (args [1 ], & rx , & ry )) {
10521079 return RAISE (PyExc_TypeError ,
1053- "Invalid angle parameter , must be numeric" );
1080+ "Invalid rotation point argument , must be numeric" );
10541081 }
10551082
1056- _pg_rotate_polygon_helper (& self -> polygon , angle );
1083+ _pg_rotate_polygon_helper (& self -> polygon , angle , rx , ry );
10571084
10581085 Py_RETURN_NONE ;
10591086}
@@ -1137,8 +1164,8 @@ pg_polygon_is_convex(pgPolygonObject *self, PyObject *_null)
11371164static struct PyMethodDef pg_polygon_methods [] = {
11381165 {"move" , (PyCFunction )pg_polygon_move , METH_FASTCALL , NULL },
11391166 {"move_ip" , (PyCFunction )pg_polygon_move_ip , METH_FASTCALL , NULL },
1140- {"rotate" , (PyCFunction )pg_polygon_rotate , METH_O , NULL },
1141- {"rotate_ip" , (PyCFunction )pg_polygon_rotate_ip , METH_O , NULL },
1167+ {"rotate" , (PyCFunction )pg_polygon_rotate , METH_FASTCALL , NULL },
1168+ {"rotate_ip" , (PyCFunction )pg_polygon_rotate_ip , METH_FASTCALL , NULL },
11421169 {"collidepoint" , (PyCFunction )pg_polygon_collidepoint , METH_FASTCALL ,
11431170 NULL },
11441171 {"get_bounding_box" , (PyCFunction )pg_polygon_get_bounding_box , METH_NOARGS ,
0 commit comments