如何更改下面的代码,使drawRect也接受一个angle
参数?
(x, y)
代表质心。据我所知,我想确定四个角的坐标,然后将它们全部围绕(x, y)
旋转这么多度,并保持相同的距离。
# draw a line from a to b
def line(a, b):
# [code omitted]
def drawRect(x, y, w, h):
a = (x - w / 2, y - h / 2)
b = (x + w / 2, y - h / 2)
c = (x + w / 2, y + h / 2)
d = (x - w / 2, y + h / 2)
line(a, b)
line(b, c)
line(c, d)
line(d, a)
答案 0 :(得分:1)
另一种可能的解决方案(也未经测试):
from math import cos, sin, pi
def drawRect(x, y, w, h, angle):
x_vec = (cos(angle), sin(angle))
y_vec = (cos(angle+pi/2.0), sin(angle+pi/2.0))
a = (x - x_vec[0]*w/2 - y_vec[0]*h/2, y - x_vec[1]*w/2 - y_vec[1]*h/2)
b = (x + x_vec[0]*w/2 + y_vec[0]*h/2, y - x_vec[1]*w/2 - y_vec[1]*h/2)
c = (x + x_vec[0]*w/2 + y_vec[0]*h/2, y + x_vec[1]*w/2 + y_vec[1]*h/2)
d = (x - x_vec[0]*w/2 - y_vec[0]*h/2, y + x_vec[1]*w/2 + y_vec[1]*h/2)
line(a, b)
line(b, c)
line(c, d)
line(d, a)
答案 1 :(得分:0)
您需要分解问题。绘制矩形和旋转矩形的点可以是单独的功能。通过将轮换设置为类,可以避免多余的计算。
class rotate:
def __init__(self, degrees):
angle = math.radians(degrees)
self.sin = math.sin(angle)
self.cos = math.cos(angle)
def pt(self, x, y):
return x * self.cos + y * self.sin, y * self.cos - x * self.sin
def drawRect(x, y, w, h, degrees):
rot = rotate(degrees)
x1, y1 = rot.pt(-w / 2, -h / 2)
a = x + x1, y + y1
x2, y2 = rot.pt( w / 2, -h / 2)
b = x + x2, y + y2
x3, y3 = rot.pt( w / 2, h / 2)
c = x + x3, y + y3
x4, y4 = rot.pt(-w / 2, h / 2)
d = x + x4, y + y4
line(a, b)
line(b, c)
line(c, d)
line(d, a)
答案 2 :(得分:0)
我会使用numpy
,因为它可以使数组计算(在这种情况下为矩阵计算)更加方便。
import numpy as np
首先,您可以定义一个旋转函数,该函数接受一个角度度并返回相应的旋转矩阵:
def rot(phi):
phi = np.deg2rad(phi)
return np.array([[np.cos(phi), -np.sin(phi)], [np.sin(phi), np.cos(phi)]])
然后,您可以将旋转添加到函数中,例如:
def drawRect(x, y, w, h, angle):
a = np.array((-w / 2, -h / 2))
b = np.array((w / 2, -h / 2))
c = np.array((w / 2, h / 2))
d = np.array((-w / 2, h / 2))
if angle != 0:
a = np.matmul(rot(angle), a)
b = np.matmul(rot(angle), b)
c = np.matmul(rot(angle), c)
d = np.matmul(rot(angle), d)
a += [x, y]
b += [x, y]
c += [x, y]
d += [x, y]
line(a, b)
line(b, c)
line(c, d)
line(d, a)