0
1

More than 1 year has passed since last update.

DDAによる線分描画

Last updated at Posted at 2023-01-24

DDA(デジタル微分解析器)による線分の描画をします。
整数演算のみで描画ができるので、アセンブラに落とすときなど便利です。
Pythonで書かれています。グラフィックス・キー入力はpygameを使っています。

line.py
#!/usr/bin/python3
from pygame.locals import *
import pygame
import sys
import os

def draw_line(screen,p1,p2):
  (x1,y1)=p1
  (x2,y2)=p2
  dx,dy =x2-x1 if x2>x1 else x1-x2  ,  y2-y1 if y2>y1 else y1-y2
  sx,sy = 1    if x2>x1 else -1     ,   1    if y2>y1 else -1
  if ( dx >= dy ):
    e = -dx
    for i in range( dx+1 ):
      set( screen,(x1,y1) )
      x1 += sx
      e += 2*dy
      if ( e>=0 ):
        y1 += sy
        e -= 2*dx
  else:
    e = -dy
    for i in range( dy+1 ):
      set( screen,(x1,y1) )
      y1 += sy
      e+= 2*dx
      if ( e>=0 ):
        x1 +=sx
        e -=2*dy

def set(screen,p):
  screen.set_at(p,(255,255,255))

def waitkey():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit(0)
            if event.type == KEYDOWN:  # キーを押したとき
                k=pygame.key.name(event.key)
                return(k)

def main():
    pygame.init()    # Pygameを初期化
    screen = pygame.display.set_mode((200,200))    # 200x200の画面を作成
    pygame.display.set_caption("DDAによる線分描画")    # タイトルを作成
    screen.fill((0,0,0)) # clear screen

    for x in range(0,205,5):
        draw_line(screen,(x,0),(100,100))
        draw_line(screen,(x,200),(100,100))
    for y in range(0,205,5):
        draw_line(screen,(0,y),(100,100))
        draw_line(screen,(200,y),(100,100))

    pygame.display.update()
    key=waitkey()
    pygame.quit()
    sys.exit()

if __name__=='__main__':
    main()

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1