Python 将正方形旋转一个角度(度)

Python 将正方形旋转一个角度(度),python,rotation,computational-geometry,angle,Python,Rotation,Computational Geometry,Angle,我有一个中心为x0,y0的正方形。我希望将这个正方形的顶点旋转一个给定的角度(θ),以度表示,并以顺时针方向返回新旋转的顶点。我使用它来旋转应用于每个顶点的单个点 将点(px,py)围绕点(x0,y0)旋转角度θ,得到: p'x = cos(theta) * (px-x0) - sin(theta) * (py-y0) + x0 p'y = sin(theta) * (px-x0) + cos(theta) * (py-y0) + y0 where: px, py = coordinate

我有一个中心为x0,y0的正方形。我希望将这个正方形的顶点旋转一个给定的角度(θ),以度表示,并以顺时针方向返回新旋转的顶点。我使用它来旋转应用于每个顶点的单个点

将点(px,py)围绕点(x0,y0)旋转角度θ,得到:

p'x = cos(theta) * (px-x0) - sin(theta) * (py-y0) + x0
p'y = sin(theta) * (px-x0) + cos(theta) * (py-y0) + y0

where: 
px, py = coordinate of the point
y0, x0, = centre of rotation
theta = angle of rotation
我用Python编写了一个函数,其中的参数是:x,y(=正方形的中心)、正方形的侧面和θu度(旋转角度的度数),但返回方向是逆时针的

from math import cos, sin

def get_square_plot(x, y, side, theta_degree=0):
    theta = theta_degree * pi/180
    xa = x-side/2
    ya = y+side/2
    xb = x+side/2
    yb = y+side/2
    xc = x+side/2
    yc = y-side/2
    xd = x-side/2
    yd = y-side/2
    xa_new = cos(theta) * (xa - x) - sin(theta) * (ya - y) + x
    ya_new = sin(theta) * (xa - x) - cos(theta) * (ya - y) + y
    xb_new = cos(theta) * (xb - x) - sin(theta) * (yb - y) + x
    yb_new = sin(theta) * (xb - x) - cos(theta) * (yb - y) + y
    xc_new = cos(theta) * (xc - x) - sin(theta) * (yc - y) + x
    yc_new = sin(theta) * (xc - x) - cos(theta) * (yc - y) + y
    xd_new = cos(theta) * (xd - x) - sin(theta) * (yd - y) + x
    yd_new = sin(theta) * (xd - x) - cos(theta) * (yd - y) + y
    return [(xa_new, ya_new),(xb_new, yb_new),(xc_new, yc_new),(xd_new, yd_new)]

get_square_plot(0, 0, 10, 0)
[(-5.0, -5.0), (5.0, -5.0), (5.0, 5.0), (-5.0, 5.0)]
而不是

[(-5.0, 5.0), (5.0, 5.0), (5.0, -5.0), (-5.0, -5.0)]
这是一件很简单的事情——你把所有y值的公式都搞错了

应该是:

ya_new = sin(theta) * (xa - x) + cos(theta) * (ya - y) + y
加法而不是减法。

这是一件很简单的事情——你所有的y值的公式都错了

应该是:

ya_new = sin(theta) * (xa - x) + cos(theta) * (ya - y) + y
加法而不是减法。

这是一件很简单的事情——你所有的y值的公式都错了

应该是:

ya_new = sin(theta) * (xa - x) + cos(theta) * (ya - y) + y
加法而不是减法。

这是一件很简单的事情——你所有的y值的公式都错了

应该是:

ya_new = sin(theta) * (xa - x) + cos(theta) * (ya - y) + y

用加法代替减法。

也不要忘记几何模块。它可以处理各种基本形状,并处理平移、旋转等操作

正方形可以用规则多边形构成。它通过从中心定位给定半径的顶点来实现;要得到一个边长给定的正方形,除以sqrt(2)。这是一个旋转菱形方向的功能,使侧面与轴平行,然后旋转所需角度,
a

>>> Square = lambda c, r, a: RegularPolygon(c, r/sqrt(2), 4, -rad(a) - pi/4)
>>> Square((0,0),10,0).vertices
[Point(5, -5), Point(5, 5), Point(-5, 5), Point(-5, -5)]
>>> [w.n(2) for w in Square((0,0),10,1).vertices]
[Point(4.9, -5.1), Point(5.1, 4.9), Point(-4.9, 5.1), Point(-5.1, -4.9)]
请注意,轻微的顺时针旋转1度(-rad(1))会使第一个顶点稍微靠近y轴,并如我们所预期的那样稍微降低。也可以为角度输入符号:

>>> from sympy.utilities.misc import filldedent
>>> print filldedent(Square((0,0),10,a).vertices)

[Point(5*sqrt(2)*cos(pi*a/180 + pi/4), -5*sqrt(2)*sin(pi*a/180 +
pi/4)), Point(5*sqrt(2)*sin(pi*a/180 + pi/4), 5*sqrt(2)*cos(pi*a/180 +
pi/4)), Point(-5*sqrt(2)*cos(pi*a/180 + pi/4), 5*sqrt(2)*sin(pi*a/180
+ pi/4)), Point(-5*sqrt(2)*sin(pi*a/180 + pi/4),
-5*sqrt(2)*cos(pi*a/180 + pi/4))]
也可以通过旋转点θ(对于CW)来检查点旋转公式:


也不要忘记几何模块。它可以处理各种基本形状,并处理平移、旋转等操作

正方形可以用规则多边形构成。它通过从中心定位给定半径的顶点来实现;要得到一个边长给定的正方形,除以sqrt(2)。这是一个旋转菱形方向的功能,使侧面与轴平行,然后旋转所需角度,
a

>>> Square = lambda c, r, a: RegularPolygon(c, r/sqrt(2), 4, -rad(a) - pi/4)
>>> Square((0,0),10,0).vertices
[Point(5, -5), Point(5, 5), Point(-5, 5), Point(-5, -5)]
>>> [w.n(2) for w in Square((0,0),10,1).vertices]
[Point(4.9, -5.1), Point(5.1, 4.9), Point(-4.9, 5.1), Point(-5.1, -4.9)]
请注意,轻微的顺时针旋转1度(-rad(1))会使第一个顶点稍微靠近y轴,并如我们所预期的那样稍微降低。也可以为角度输入符号:

>>> from sympy.utilities.misc import filldedent
>>> print filldedent(Square((0,0),10,a).vertices)

[Point(5*sqrt(2)*cos(pi*a/180 + pi/4), -5*sqrt(2)*sin(pi*a/180 +
pi/4)), Point(5*sqrt(2)*sin(pi*a/180 + pi/4), 5*sqrt(2)*cos(pi*a/180 +
pi/4)), Point(-5*sqrt(2)*cos(pi*a/180 + pi/4), 5*sqrt(2)*sin(pi*a/180
+ pi/4)), Point(-5*sqrt(2)*sin(pi*a/180 + pi/4),
-5*sqrt(2)*cos(pi*a/180 + pi/4))]
也可以通过旋转点θ(对于CW)来检查点旋转公式:


也不要忘记几何模块。它可以处理各种基本形状,并处理平移、旋转等操作

正方形可以用规则多边形构成。它通过从中心定位给定半径的顶点来实现;要得到一个边长给定的正方形,除以sqrt(2)。这是一个旋转菱形方向的功能,使侧面与轴平行,然后旋转所需角度,
a

>>> Square = lambda c, r, a: RegularPolygon(c, r/sqrt(2), 4, -rad(a) - pi/4)
>>> Square((0,0),10,0).vertices
[Point(5, -5), Point(5, 5), Point(-5, 5), Point(-5, -5)]
>>> [w.n(2) for w in Square((0,0),10,1).vertices]
[Point(4.9, -5.1), Point(5.1, 4.9), Point(-4.9, 5.1), Point(-5.1, -4.9)]
请注意,轻微的顺时针旋转1度(-rad(1))会使第一个顶点稍微靠近y轴,并如我们所预期的那样稍微降低。也可以为角度输入符号:

>>> from sympy.utilities.misc import filldedent
>>> print filldedent(Square((0,0),10,a).vertices)

[Point(5*sqrt(2)*cos(pi*a/180 + pi/4), -5*sqrt(2)*sin(pi*a/180 +
pi/4)), Point(5*sqrt(2)*sin(pi*a/180 + pi/4), 5*sqrt(2)*cos(pi*a/180 +
pi/4)), Point(-5*sqrt(2)*cos(pi*a/180 + pi/4), 5*sqrt(2)*sin(pi*a/180
+ pi/4)), Point(-5*sqrt(2)*sin(pi*a/180 + pi/4),
-5*sqrt(2)*cos(pi*a/180 + pi/4))]
也可以通过旋转点θ(对于CW)来检查点旋转公式:


也不要忘记几何模块。它可以处理各种基本形状,并处理平移、旋转等操作

正方形可以用规则多边形构成。它通过从中心定位给定半径的顶点来实现;要得到一个边长给定的正方形,除以sqrt(2)。这是一个旋转菱形方向的功能,使侧面与轴平行,然后旋转所需角度,
a

>>> Square = lambda c, r, a: RegularPolygon(c, r/sqrt(2), 4, -rad(a) - pi/4)
>>> Square((0,0),10,0).vertices
[Point(5, -5), Point(5, 5), Point(-5, 5), Point(-5, -5)]
>>> [w.n(2) for w in Square((0,0),10,1).vertices]
[Point(4.9, -5.1), Point(5.1, 4.9), Point(-4.9, 5.1), Point(-5.1, -4.9)]
请注意,轻微的顺时针旋转1度(-rad(1))会使第一个顶点稍微靠近y轴,并如我们所预期的那样稍微降低。也可以为角度输入符号:

>>> from sympy.utilities.misc import filldedent
>>> print filldedent(Square((0,0),10,a).vertices)

[Point(5*sqrt(2)*cos(pi*a/180 + pi/4), -5*sqrt(2)*sin(pi*a/180 +
pi/4)), Point(5*sqrt(2)*sin(pi*a/180 + pi/4), 5*sqrt(2)*cos(pi*a/180 +
pi/4)), Point(-5*sqrt(2)*cos(pi*a/180 + pi/4), 5*sqrt(2)*sin(pi*a/180
+ pi/4)), Point(-5*sqrt(2)*sin(pi*a/180 + pi/4),
-5*sqrt(2)*cos(pi*a/180 + pi/4))]
也可以通过旋转点θ(对于CW)来检查点旋转公式:


最简单的是最难捕捉的。最简单的是最难捕捉的。最简单的是最难捕捉的。最简单的是最难捕捉的。