PIL / 回転させた矩形がぴったり収まる背景矩形の寸法を求める

f:id:ti-nspire:20181004182909p:plain:w400

いわゆる回転行列を応用する。第1象限の中だけで行ったり来たりするよう(xy両軸を中心にミラーリングされるよう)工夫する。

import numpy as np
import matplotlib.pyplot as plt

def expandRC(rad, rows, cols):

    COS, SIN = np.abs([np.cos(rad), np.sin(rad)])
    
    matCoord = np.array([rows, cols])
    matRot   = np.array([[COS, SIN],
                         [SIN, COS]])

    # [背景矩形の高さ, 背景矩形の幅]を返す。
    return (matCoord @ matRot)#.round(0).astype("uint16")


########
# test #
########
if __name__ == "__main__":
    
    # 高さ10、幅20の矩形を回転させてみる。
    ROWs = 10
    COLs = 20

    numOfDiv = 2**6
    Pi = np.pi

    rads = np.linspace(-Pi, Pi, numOfDiv + 1)
    rows = []
    cols = []

    for rad in rads:
        rc = expandRC(rad, ROWs, COLs)
        rows.append(rc[0])
        cols.append(rc[1])

    plt.plot(rads, rows, label="rows")
    plt.plot(rads, cols, label="cols")

    plt.xlabel("rad")
    plt.ylabel("rows & cols")

    plt.legend()
    
    plt.xticks(np.round(rads[::int(numOfDiv / 8)], 2))

    plt.grid()
    plt.show()

実行結果:
f:id:ti-nspire:20181004185038p:plain:w400