三角関数を使って物体を壁に当てて反射させよう
以前の記事でボールを壁に当てて跳ね返すプログラムを作りました。
このプログラムは角度を気にせず、単に座標をずらしてボールを移動させていましたが、今回は三角関数を使って角度から座標を計算して物体を動かしてみましょう。
45度のように切りのいい角度であれば良いのですが、三角関数を使わないと指定した角度に従って物体を動かすことは難しいです。
三角関数を使った物体反射のプログラム
このプログラムでは、物体が画面の端にきたら角度を反転させます。
Y座標は単純に角度を反転させるだけですが、X座標は180度から反射前の角度を引いた値です。
以下の図のように、角度aで物体が壁に当たると角度bで跳ね返ります。
このことから、角度bは180度から角度aで引いた値になります。
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
### インポート import math import pygame from pygame.locals import * ### 定数 WIDTH = 640 # 幅 HEIGHT = 400 # 高さ SIZE = 20 # 辺長 M_DOT = 5 # 移動ドット ### モジュール初期化 pygame.init() ### 時間オブジェクト生成 clock = pygame.time.Clock() ### 画面設定 surface = pygame.display.set_mode((WIDTH, HEIGHT)) ### 座標初期設定 x = y = 0 ### 四角形作成 rect = pygame.Rect(x, y, SIZE, SIZE) ### 初期角度 angle = 35 while True: ### 座標設定 rect.left = x rect.top = y ### 画面初期化 surface.fill((0,0,0)) ### 四角形描画 surface.fill((255,255,255), rect) pygame.display.update() ### フレームレート設定 clock.tick(70) ### 座標取得 x += round(math.cos(math.radians(angle))*M_DOT) y += round(math.sin(math.radians(angle))*M_DOT) ### 横座標設定 if x < 0: angle = 180 - angle x = 0 elif x >= WIDTH-SIZE: angle = 180 - angle x = WIDTH-SIZE ### 縦座標設定 if y < 0: angle = -angle y = 0 elif y >= HEIGHT-SIZE: angle = -angle y = HEIGHT-SIZE ### 角度修正 if angle > 360: angle -= 360 ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、物体が壁に反射します。