更新於 2024/08/19閱讀時間約 4 分鐘

The Nature of Code閱讀心得與Python實作:3.1 Angles

角度有兩種單位,一個就是大家耳熟能詳的「度」(degree),記做 °;另一個是「弳度」(radian),也翻譯成「弧度」,記做rad。當使用弳度來度量角度的大小時,通常會把rad省略,不寫出來。

弳度的定義是:一個圓的圓弧長度,和這個圓的半徑的比值。所以,1 rad就相當於是圓弧長度和半徑相等時的角度大小。

利用弳度的定義,可以很容易就推導出度和弳度間的關係。假設圓的半徑是r,那整個圓繞一圈的長度,也就是圓周長,就是2πr。所以,整個圓繞一圈,就相當於是繞了

2πr / r = 2π rad

眾所周知,整個圓繞一圈是360°,所以

2π = 360°

也就是說

π = 180°

有了這個關係式,可以很容易就看出,弳度和度之間的轉換可以寫成

弳度 / 度 = π / 180

在python的math module裡頭,提供了兩個方法,可以很方便地在度和弳度間進行轉換

  • math.radians(deg):把度轉換成弳度。
  • math.degrees(rad):把弳度轉換成度。

關於角度,除了要注意單位之外,還要注意正負號代表的意思。正的角度,代表的是逆時針方向旋轉的角度;負的角度,則代表順時針方向旋轉的角度。

Exercise 3.1

pygame.transform.rotate()來旋轉圖案。不過,要注意的是,這個方法使用的角度單位是度,而不是弳度。

# python version 3.10.9
import sys

import pygame # version 2.3.0

pygame.init()

pygame.display.set_caption("Exercise 3.1")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

WIDTH, HEIGHT = screen_size = 640, 360
screen = pygame.display.set_mode(screen_size)

FPS = 60
frame_rate = pygame.time.Clock()

baton_length = 200 # 指揮棒長度
radius = 10 # 指揮棒端點球半徑

# 建造用來繪製指揮棒圖案的surface並以白色清空
surface_size = (baton_length, baton_length)
surface = pygame.Surface(surface_size)
surface.fill(WHITE)

# 在surface上繪製指揮棒圖案
endpoint1 = (radius, baton_length//2)
endpoint2 = (baton_length-radius, baton_length//2)
pygame.draw.circle(surface, BLACK, endpoint1, radius)
pygame.draw.circle(surface, BLACK, endpoint2, radius)
pygame.draw.line(surface, BLACK, endpoint1, endpoint2, 5)

# surface的旋轉角度,單位是度
angle = 1

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

screen.fill(WHITE)

angle -= 1 # 順時針旋轉
rotated_surface = pygame.transform.rotate(surface, angle)
rect = rotated_surface.get_rect(center=(WIDTH//2, HEIGHT//2))
screen.blit(rotated_surface, (rect.x, rect.y))

pygame.display.update()
frame_rate.tick(FPS)




分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.