三角関数でサインカーブを表示しよう
今回は三角関数でよく見かける、サインカーブを表示しましょう。
サイン(sin)で求めた値はY座標を表現しているので、以下のようにY軸に対して上下に波を打つイメージになります。
また、波は線分の集まりであるということが分かりやすいように、表示する座標を少なくしています。
連結された複数の線分を表示する
波を表示するために、線分を連結させます。
線分の連結には、pygame.draw.lines()を使います。
pygame.draw.lines(画面オブジェクト, 色, closed, 座標リスト, 幅)
座標リストは、線分を連結する座標のリストになります。
closedは、TrueかFlaseを指定します。
Trueを指定すると、開始点と終点の間にも線分が引かれて内部が閉じられた状態になります。
closedをTrueにした場合の画像は、以下のようになります。
三角関数を使ったサインカーブを表示するプログラム
サインカーブを表示するプログラムは、以下のようになります。
X座標が0~639の時に対応するY座標を、それぞれサインで求めて線分で結び、画面に表示します。
画面の縦半分を中心に、上下に波が表示されます。
サイン(sin)をマイナスにしているのは、線分を右上がりからスタートするためです。
画面の座標は左上が(0:0)なので、サインをマイナスにすると、Y座標が上に向かって行くことになります。
また、angle変数の値を少しずつ変えると、X座標に対応するY座標が変わるので、波が動いているように見えます。
angle変数の値を変えないと、画面を更新してもX座標に対応するY座標が同じなので、波が止まったままになってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
### インポート import math import pygame from pygame.locals import * ### 定数 WIDTH = 640 # 幅 HEIGHT = 400 # 高さ BLANK = 50 # 余白 ### モジュール初期化 pygame.init() ### 時間オブジェクト生成 clock = pygame.time.Clock() ### 画面設定 surface = pygame.display.set_mode((WIDTH, HEIGHT)) ### 角度初期化 angle = 0 while True: ### 画面初期化 surface.fill((0,0,0)) ### 座標リスト point = [] for x in range(0, WIDTH): point.append((x, int(-math.sin(math.radians(angle+x))*(HEIGHT/2-BLANK)+HEIGHT/2))) ### 曲線描画 pygame.draw.lines(surface, (255,255,255), False, point, 3) pygame.display.update() ### 角度の変化量 angle += 1 if angle > 360: angle -= 360 ### フレームレート設定 clock.tick(30) ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、サインカーブが表示されます。