向左或向右旋转由4个元组组成的矩形

时间:2016-10-05 17:05:46

标签: python python-3.x rotation gis

我正在制作一个操作GIS数据的程序,但是对于这个精确的问题,我试图围绕左下角旋转4个点的矩形。我有一个描述左下角的元组:  x, y=40000,40000 我的长度为x,长度为y x_displacementy_displacement。我有一个角度theta,以度为单位。我想将矩形向左或向右旋转90度,因此theta可以是-89到89度。负角度应使角落向左旋转;向右的正角度。我代表矩形: http://i.imgur.com/pp3hFyA.jpg

    x_displacement=100
    y_displacement=100
    x = 40000
    y = 40000
    x1 = x
    y1 = y + a.y_displacement
    x2 = x + a.x_displacement
    y2 = y + a.y_displacement
    x3 = x + a.x_displacement
    y3 = y
    #describes the other 4 corners of the rectangle

Coord是一个包含x和y值的类。 coords是Coord课程项目列表。

    c = Coord(x, y)
    coords.append(c)
    c = Coord(x1, y1)
    coords.append(c)
    c = Coord(x2, y2)
    coords.append(c)
    c = Coord(x3, y3)
    coords.append(c)
    #Adds each corner to the list of coordinates
    theta = math.radians(a.angle)
    newcoords = []
    for c in coords:
        newcoords.append(Coord((c.x * math.cos(theta) - c.y * math.sin(theta)),
                              (c.x * math.sin(theta) + c.y * math.cos(theta))))
    coords=newcoords

我怀疑我做错了一些相对微不足道的事情,但我已经坚持这个问题很长一段时间了。 此代码生成一个新的矩形,可以是畸形,也可以是负角,而不是根据需要稍微左旋的角。 我在这里看到很多关于旋转矩形的帖子,但似乎没有一个直接复制,因为它们不处理负角度。我很感激任何指针!

1 个答案:

答案 0 :(得分:2)

正如一些评论者所提到的,你是在(0,0)点左右旋转,而不是左下角。在我们构建坐标时,我们可以:

  • 首先在(0,0)点构建形状
  • 旋转它
  • 将其翻译成需要的地方

下面给出了使用普通列表而不是Coord对象的示例,但我确信它是重点。

import math


def rotate(xy, theta):
    # https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions
    cos_theta, sin_theta = math.cos(theta), math.sin(theta)

    return (
        xy[0] * cos_theta - xy[1] * sin_theta,
        xy[0] * sin_theta + xy[1] * cos_theta
    )


def translate(xy, offset):
    return xy[0] + offset[0], xy[1] + offset[1]


if __name__ == '__main__':
    # Create the square relative to (0, 0)
    w, h = 100, 100

    points = [
        (0, 0),
        (0, h),
        (w, h),
        (w, 0)
    ]

    offset = (40000, 50000)
    degrees = 90
    theta = math.radians(degrees)

    # Apply rotation, then translation to each point
    print [translate(rotate(xy, theta), offset) for xy in points]

作为奖励,这应该适用于相对于(0,0)定义的任何一组点,无论它们是否形成任何合理的多边形。