在Python中从中点创建一个方形多边形(随机定向)

时间:2014-03-12 22:00:58

标签: python function computational-geometry

我有一个中点(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))]

此函数创建没有特定方向的方形多边形的顶点。我希望改进这个功能,增加随机旋转这些顶点的可能性(如果可能的话,还有一个特定的角度)

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)

我希望这有一些用处!