我正在制作一个操作GIS数据的程序,但是对于这个精确的问题,我试图围绕左下角旋转4个点的矩形。我有一个描述左下角的元组:
x, y=40000,40000
我的长度为x,长度为y x_displacement
和y_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
我怀疑我做错了一些相对微不足道的事情,但我已经坚持这个问题很长一段时间了。 此代码生成一个新的矩形,可以是畸形,也可以是负角,而不是根据需要稍微左旋的角。 我在这里看到很多关于旋转矩形的帖子,但似乎没有一个直接复制,因为它们不处理负角度。我很感激任何指针!
答案 0 :(得分:2)
正如一些评论者所提到的,你是在(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)定义的任何一组点,无论它们是否形成任何合理的多边形。