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

2024-06-17 09:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个操作GIS数据的程序,但是对于这个精确的问题,我试图在左下角旋转一个由4个点组成的矩形。我有1个元组来描述左下角: x, y=40000,40000 我还有一个长度x,一个长度y,x_displacement,和{}。我有一个角度,以度为单位。我想把矩形向左或向右旋转90度,这样θ可以是-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类项的列表。在

^{pr2}$

我怀疑我做错了一些相对微不足道的事情,但我已经在这个问题上纠结了一段时间。 此代码生成一个新的矩形,该矩形要么变形,要么有负角,而不是按需要稍微左旋转角。 我在这里看到了很多关于旋转矩形的帖子,但是没有一个是直接复制的,因为它们不处理负角度。如果有人指点我会很感激的!在


Tags: the数据程序http单位角度元组矩形
1条回答
网友
1楼 · 发布于 2024-06-17 09:53:17

正如一些评论者提到的,你是围绕(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)定义的任何一组点,而不管它们是否形成任何合理的多边形。在

相关问题 更多 >