斜着画一个盒子

时间:2018-11-20 02:12:51

标签: python graphics drawing trigonometry

如何更改下面的代码,使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)

3 个答案:

答案 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)