読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



図形を描画する

Pygame

pygame.drawを使うと四角形、円、楕円、直線などを基本的な図形を描画できます。ゲームでは画像を使うのが一般的ですが、テスト用に図形を描画する方法を知っておくと便利です。

f:id:aidiary:20100605084527p:plain
f:id:aidiary:20100605084528p:plain

サンプルスクリプト

draw_figure.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
 
SCREEN_SIZE = (640, 480)
 
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption(u"図形の描画")
 
while True:
    screen.fill((0,0,0))
    
    # 図形を描画
    # 黄の矩形
    pygame.draw.rect(screen, (255,255,0), Rect(10,10,300,200))
    # 赤の円
    pygame.draw.circle(screen, (255,0,0), (320,240), 100)
    # 紫の楕円
    pygame.draw.ellipse(screen, (255,0,255), (400,300,200,100))
    # 白い線
    pygame.draw.line(screen, (255,255,255), (0,0), (640,480))
    
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

四角形の描画

# 黄の矩形(塗りつぶし)
pygame.draw.rect(screen, (255,255,0), Rect(10,10,300,200))
# 線の太さ指定
pygame.draw.rect(screen, (255,255,0), Rect(10,10,300,200), 2)

四角形(矩形)を描くには、pygame.draw.rect()関数を使います。第1引数は、図形を描画したいSurfaceを指定します。第2引数は図形の色を(R,G,B)で指定します。第1引数にSurface、第2引数に色を指定するのはどの図形を描く場合でも同じです。第3引数以降は図形によって違います。四角形の場合、矩形の左上の座標と幅、高さをpygame.Rectで指定します。上の例の場合、左上の座標が(10,10)、幅が300、高さが200の四角形を描いています。矩形領域を指定するpygame.Rectはあちこちでよく使います。第4引数で、線の太さを指定することもできます。線の太さを指定した場合、四角形の内部は塗りつぶされません。省略するか0を指定した場合は内部が塗りつぶされます。

塗りつぶす矩形を描く場合は、Surface.fill()も使えます。こちらの関数はハードウェアによる高速化が可能なため描画速度が速いです。まあ大量に描くのでなければそんなに違わないと思いますが。

screen.fill((255,255,0), Rect(10,10,300,200))

円の描画

# 赤の円(塗りつぶし)
pygame.draw.circle(screen, (255,0,0), (320,240), 100)
# 線の太さ指定
pygame.draw.circle(screen, (255,0,0), (320,240), 100, 5)

# 紫の楕円(塗りつぶし)
pygame.draw.ellipse(screen, (255,0,255), (400,300,200,100))
# 線の太さ指定
pygame.draw.ellipse(screen, (255,0,255), (400,300,200,100), 10)

円を描画するメソッドは、pygame.draw.circle()とpygame.draw.ellipse()の2種類があります。circle()は中心点と半径を指定して真円を描きます。半径を指定するので楕円は描けません。上の例の場合、中心の座標が(320,240)、半径が100の円を描いています。一方、ellipse()は楕円が内接する矩形を指定して楕円を描きます。こちらは正方形を指定すれば真円も描けます。上の例の場合、左上の座標が(400,300)、幅が200、高さが100の矩形に内接する楕円を描いています。他のライブラリだと ellipse()型の関数しかなく、circle型の関数は自作する場合が多いですが、Pygameではあらかじめ用意されていて便利です。

直線の描画

# 白い線(幅1)
pygame.draw.line(screen, (255,255,255), (0,0), (640,480))
# 幅8の線
pygame.draw.line(screen, (255,255,255), (0,0), (640,480), 8)

直線を描画するメソッドは、pygame.draw.line()です。始点と終点の座標を指定します。上の例の場合、始点は(0,0)、終点は(640,480)です。つまり、左上から右下へ線を引きます。widthを省略すると塗りぶつしではなく幅1の線になります。

他にもポリゴン、円弧、連続直線、アンチエイリアス直線を描く関数がありますがあまり使わないような気がするので省略します。