我有一个中点(x,y),我需要使用2D(随机)平面旋转创建一个随机方向的方形多边形。
def get_square_plot(x, y, side):
return [(x-(side/2), y+(side/2)), (x+(side/2), y+(side/2)), (x+(side/2), y-(side/2)), (x-(side/2), y-(side/2))]
此函数创建没有特定方向的方形多边形的顶点。我希望改进这个功能,增加随机旋转这些顶点的可能性(如果可能的话,还有一个特定的角度)
答案 0 :(得分:1)
如果我理解正确,这应该能够做你想做的事情:
from math import sin, cos, radians
def rotated_square(cx, cy, size, degrees=0):
""" Calculate coordinates of a rotated square centered at 'cx, cy'
given its 'size' and rotation by 'degrees' about its center.
"""
h = size/2
l, r, b, t = cx-h, cx+h, cy-h, cy+h
a = radians(degrees)
cosa, sina = cos(a), sin(a)
pts = [(l, b), (l, t), (r, t), (r, b)]
return [(( (x-cx)*cosa + (y-cy)*sina) + cx,
(-(x-cx)*sina + (y-cy)*cosa) + cy) for x, y in pts]
print rotated_square(50, 50, 100)
输出:
[(0.0, 0.0), (0.0, 100.0), (100.0, 100.0), (100.0, 0.0)]
请注意,在一般情况下,生成的坐标不会为整数。
这实际上有效的是首先将每个坐标转换为原点,方法是从中减去cx,cy,然后将其旋转角度,然后将其转换回相同的量。这对于补偿旋转公式通常相对于坐标系原点的事实是必要的。
答案 1 :(得分:0)
确定了四个角坐标后,您可以使用简单的2D矩阵旋转相对于原点(或中点)旋转它们:
http://en.wikipedia.org/wiki/Rotation_%28mathematics%29(搜索2D旋转方程式)
x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)
您可以将内置Python Math库用于cos / sin函数:http://docs.python.org/2/library/math.html第9.2.3节
Math.cos(theta)
Math.sin(theta)
我希望这有一些用处!