いわゆる回転行列を応用する。第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()
実行結果: