首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以度角度旋转一个正方形

以度角度旋转一个正方形
EN

Stack Overflow用户
提问于 2014-05-05 00:12:35
回答 2查看 3.9K关注 0票数 0

我和中央x0,y0有个正方形。我希望旋转这个正方形的顶点为给定的角度(θ)表示的程度,并返回新的旋转顶点顺时针方向。我使用这个approach为每个顶点旋转一个点

按角θ旋转点(px,py)围绕点(x0,y0):

代码语言:javascript
复制
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(=正方形的中心),方的边,和theta_degree (旋转角度的度数),但返回是逆时针方向的。

代码语言:javascript
复制
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)]

而不是

代码语言:javascript
复制
[(-5.0, 5.0), (5.0, 5.0), (5.0, -5.0), (-5.0, -5.0)]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-05 00:43:01

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

它应该是:

代码语言:javascript
复制
ya_new = sin(theta) * (xa - x) + cos(theta) * (ya - y) + y

加法而不是减法。

票数 2
EN

Stack Overflow用户

发布于 2014-05-08 01:44:11

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

可以用RegularPolygon构造一个正方形。它通过从中心定位给定半径的顶点,得到具有给定边长的正方形,除以sqrt(2)。下面是一个旋转金刚石方向的函数,这样边与轴平行,然后旋转所需的角度,a

代码语言:javascript
复制
>>> 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轴稍微近一点,比我们预期的低一点。您还可以为角度输入一个符号:

代码语言:javascript
复制
>>> 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))]

还可以通过旋转点-theta (对于CW)检查点旋转公式:

代码语言:javascript
复制
>>> var('px py theta x0 y0')
(px, py, theta, x0, y0)
>>> R = Point(px,py).rotate(-theta, Point(x0,y0))
>>> R.x
x0 + (px - x0)*cos(theta) + (py - y0)*sin(theta)
>>> R.y
y0 + (-px + x0)*sin(theta) + (py - y0)*cos(theta)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23463070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档