2012-07-29 98 views
1

我想在pygame畫一個拋物線。我製作了一個pixelarray物體並通過它循環來確定像素是否在拋物線上。我似乎得到了一個有點差距的圖像。我如何使它成爲一條連續的線?用Pygame畫一個拋物線

import pygame 
import sys 
from pygame.locals import * 
import math 

WIDTH = 640 
HEIGHT = 480 

pygame.init() 
screen = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32) 

pxarray = pygame.PixelArray(screen) 

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

    screen.fill((0,0,0)) 

    for y, py in enumerate(pxarray): 
     for x, px in enumerate(py): 
      if int(x) == (int(y)*int(y)) - 30*int(y) + 450: 
       pxarray[y][x] = 0xFFFFFF 

    pygame.display.update() 

回答

7
color = 255, 0, 0 
first = True 
prev_x, prev_y = 0, 0 
while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    screen.fill((0,0,0)) 

    for y, py in enumerate(pxarray): 
     for x, px in enumerate(py): 
      if int(x) == (int(y)*int(y)) - 30*int(y) + 450: 
       pxarray[y][x] = 0xFFFFFF 

       if first: 
        first = False 
        prev_x, prev_y = x, y 
        continue 

       pygame.draw.line(screen, color, (prev_y, prev_x), (y, x)) 
       prev_x, prev_y = x, y 

    first = True 
    pygame.display.flip() 

enter image description here

1

您需要將拋物線繪製爲一系列線段。你使用多少段將決定它看起來的平滑程度,所以如果你計算拋物線x = y^2 + 30y + 450,你可以計算y值的x值並從(x0 ,y0)到(x1,y1)等等。

如果您沒有畫線原語,則需要使用Bresenham's Algorithm之類的東西來實現一個。