リサージュ曲線を描く
リサージュ曲線は直行した2つの単振動の合成による平面図形で
tを介した媒介表示変数表示では
x = Acos(at)
y = Bcos(bt+δ)
と表されます。
振幅の係数A,B、周波数の係数a,b、位相差δによりさまざまな図形が現れます。
A,Bを等しく、δを0としてa,bを変えた場合の図形を描きます。
環境
a = b = 1 の場合。円となります。tは0~2πまで1000分割しています。
コード
import math import numpy as np import cv2 img = np.zeros((500, 500, 3), np.uint8) a = 1 b = 1 r = 200 dx = 250 dy = 250 pts = [] for i in range(1000): t = i / 1000 * 2 * math.pi x = int(r * math.sin(a * t)) y = -int(r * math.cos(b * t)) pts.append((dx+x,dy+y)) points = np.array(pts) cv2.polylines(img, [points], False, (255, 255, 0), thickness=5) filename = 'Lissajous' + 'a' + str(a) + 'b' + str(b) + '.png' cv2.putText(img, 'a'+str(a)+'b'+str(b), (10, 20), cv2.FONT_HERSHEY_COMPLEX, 0.8, (255, 255, 0)) cv2.imwrite(filename, img)
実行結果
a = 2、b = 3 の場合。
コード
import math import numpy as np import cv2 img = np.zeros((500, 500, 3), np.uint8) a = 2 b = 3 r = 200 dx = 250 dy = 250 pts = [] for i in range(1000): t = i / 1000 * 2 * math.pi x = int(r * math.sin(a * t)) y = -int(r * math.cos(b * t)) pts.append((dx+x,dy+y)) points = np.array(pts) cv2.polylines(img, [points], False, (255, 255, 0), thickness=5) filename = 'Lissajous' + 'a' + str(a) + 'b' + str(b) + '.png' cv2.putText(img, 'a'+str(a)+'b'+str(b), (10, 20), cv2.FONT_HERSHEY_COMPLEX, 0.8, (255, 255, 0)) cv2.imwrite(filename, img)
実行結果
a = 4、b = 5 の場合。
コード
import math import numpy as np import cv2 img = np.zeros((500, 500, 3), np.uint8) a = 4 b = 5 r = 200 dx = 250 dy = 250 pts = [] for i in range(1000): t = i / 1000 * 2 * math.pi x = int(r * math.sin(a * t)) y = -int(r * math.cos(b * t)) pts.append((dx+x,dy+y)) points = np.array(pts) cv2.polylines(img, [points], False, (255, 255, 0), thickness=5) filename = 'Lissajous' + 'a' + str(a) + 'b' + str(b) + '.png' cv2.putText(img, 'a'+str(a)+'b'+str(b), (10, 20), cv2.FONT_HERSHEY_COMPLEX, 0.8, (255, 255, 0)) cv2.imwrite(filename, img)
実行結果
以下のサイトを参考にさせていただきました
リサジュー図形『ウィキペディア(Wikipedia)』
Pythonの文法メモ >> 【OpenCV】多角形を描画するpolylines/fillPoly