Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

リサージュ曲線を描く

リサージュ曲線は直行した2つの単振動の合成による平面図形で
tを介した媒介表示変数表示では
x = Acos(at)
y = Bcos(bt+δ)
と表されます。
振幅の係数A,B、周波数の係数a,b、位相差δによりさまざまな図形が現れます。
A,Bを等しく、δを0としてa,bを変えた場合の図形を描きます。

環境

  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0

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

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村