三角関数を使ってみよう
今回は数学ライブラリーの三角関数を使って、線分を表示させてみましょう。
三角関数とは、高校で習うサイン(sine)、コサイン(cosine)、タンジェント(tangent)のことです。
三角関数を使うと角度と線の長さで、X座標とY座標を求めることができます。
具体的には、角度θと線の長さrが分かれば、X座標はコサイン、Y座標はサインを使えば求められます。
サイン、コサインを使って座標を求める
まずサイン、コサインを使うために、mathライブラリーをインポートします。
import math
サイン、コサインの求め方は、以下のようになります。
引数にラジアン(radian)を使います。
■サイン(sin)の求め方
math.sin(ラジアン)
■コサイン(cos)の求め方
math.cos(ラジアン)
メモ
ラジアンとは角度の単位で、日本語だと弧度法といいます。(学校で習う90度や180度というのは度数法といいます)
新明解では「円の半径と等しい長さの円弧に対応する中心角の大きさ」となっています。
上記の説明では分かりづらいので、ここでは180度はπラジアン、360度は2πラジアンと覚えておきましょう。
(π≒3.14とすると、1ラジアンは180÷3.14で約57.29度となります)
ラジアンの求め方は、以下のようになります。
math.radians(角度)
角度が45度、線の長さが10の場合の座標の求め方は、以下のようになります。
X座標がコサイン(cos)、Y座標がサイン(sin)で求められます。
round()関数で小数をまるめています。
以下の例では、X座標が7、Y座標が7になります。
実行例
>>> round(math.cos(math.radians(45))*10)
7
>>> round(math.sin(math.radians(45))*10)
7
三角関数を使って線分を表示するプログラム
上記のことをふまえて、線分を表示するプログラムを書いてみましょう。
以下のプログラムは、円を描いて円の中心から円周までの線分を描画します。
角度を0にしているので、円の中心から真っすぐ右に線分が表示されます。
座標の位置はサイン、コサインで計算した値を円の中心(この場合、200,200)に置き換える必要があります。
また、サイン、コサインの結果は左下の座標を(0,0)としていますが、画面の座標は左上の座標が(0,0)なので、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 |
### インポート import math import pygame from pygame.locals import * ### 定数 WIDTH = 400 # 幅 HEIGHT = 400 # 高さ RADIUS = 180 # 半径 CENTER = int(WIDTH/2),int(HEIGHT/2) ### モジュール初期化 pygame.init() ### 画面設定 surface = pygame.display.set_mode((WIDTH,HEIGHT)) ### 円表示 pygame.draw.circle(surface, (255,0,0), (CENTER), RADIUS, 2) ### 線の終端位置 pos_x = round(math.cos(math.radians(0))*RADIUS) pos_y = round(math.sin(math.radians(0))*RADIUS) ### 線表示 pygame.draw.line(surface, (255,255,255), (CENTER), (CENTER[0]+pos_x,CENTER[1]-pos_y), 2) ### 画面更新 pygame.display.update() ### 無限ループ while True: ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、以下の画像が表示されます。
三角関数を使って複数の線分を表示するプログラム
以下のプログラムは、複数の線分を表示するプログラムです。
0、45、90、135、180、225、270、315度の線分を表示します。
上記のプログラム(pystart27-1.py)の22~29行目を修正しています。
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 |
### インポート import math import pygame from pygame.locals import * ### 定数 WIDTH = 400 # 幅 HEIGHT = 400 # 高さ RADIUS = 180 # 半径 CENTER = int(WIDTH/2),int(HEIGHT/2) ### モジュール初期化 pygame.init() ### 画面設定 surface = pygame.display.set_mode((WIDTH,HEIGHT)) ### 円表示 pygame.draw.circle(surface, (255,0,0), (CENTER), RADIUS, 2) ### 各角度を表示 for angle in 0,45,90,135,180,225,270,315: ### 線の終端位置 pos_x = round(math.cos(math.radians(angle))*RADIUS) pos_y = round(math.sin(math.radians(angle))*RADIUS) ### 線表示 pygame.draw.line(surface, (255,255,255), (CENTER), (CENTER[0]+pos_x,CENTER[1]-pos_y), 2) ### 画面更新 pygame.display.update() ### 無限ループ while True: ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、以下の画像が表示されます。