PyGame, введение II

Начальниые знания, необходимые для того, чтобы перетащить проект «Рисование Графика» в PyGame

  • {o} — тема по Linux

  • <!> ­— необязательная тема

Домашнее задание

  • {i} — теоретическое задание

  • {*} — новая тема

  1. Рисование мышью
    1. Самое простое (лишь бы рисовало)
    2. + включение диагностических сообщений
    3. +выход по закрытию окна
    4. +Только при нажатой кнопке мыши

         1 #!/usr/bin/env python
         2 # -*- coding: utf-8 -*-
         3 '''
         4 Рисование мышью
         5 
         6    0. Самое простое (лишь бы рисовало)
         7    1. + включение диагностических сообщений
         8    2. +выход по закрытию окна
         9    3. +Только при нажатой кнопке мыши
        10 '''
        11 
        12 import pygame, sys
        13 
        14 # Начало работы PyGame
        15 pygame.init()
        16 size = (1024, 768)
        17 screen = pygame.display.set_mode(size)
        18 width, color = 2, (250,200,150)
        19 debug = False	# Нужно ли выводить отладочные сообщения
        20 pos = (0,0)	# Предыдущая координата при ремещении мыши
        21 
        22 while 1:
        23   event = pygame.event.wait()
        24   if debug: print event
        25   if event.type == pygame.KEYUP:
        26     if event.key == 32:
        27       debug = not debug
        28   if event.type == pygame.MOUSEBUTTONDOWN:
        29     pos = event.pos
        30   if event.type == pygame.MOUSEMOTION:
        31     if event.buttons[0]:	# Левая кнопка -- линия
        32       pygame.draw.line(screen, color, pos, event.pos, width)
        33     pos = event.pos		# запоминает, куда переместился курсор
        34   if event.type == pygame.QUIT: sys.exit()
        35   pygame.display.flip()
      
      pygame0.py
  2. Воспроизвести задачу «Рисование графика произвольной функции» в PyGame

    •    1 #!/usr/bin/env python
         2 # -*- coding: UTF-8 -*-
         3 '''
         4 Построение графика произвольной функции
         5 в произвольном диапазоне на экране произвольных размеров
         6 Используется PyGame
         7 '''
         8 
         9 from math import *
        10 import sys, pygame
        11 
        12 pen,paper,width=(200,250,100),(0,0,0),2
        13 
        14 def definput(prompt, *default):
        15   'Реализация Input, возвращающая default, если введённые данные пусты'
        16   s = raw_input(prompt+": ")
        17   if s:
        18     return eval(s)
        19   elif len(default)==1:
        20     return default[0]
        21   else:
        22     return default
        23 
        24 def scale(x, X0, X1, Z0, Z1):
        25   'Преобразует координату x в диапазоне [X0, X1] в координату z в диапазоне [Z0, Z1]'
        26   return Z0+(Z1-Z0)*(x-X0)/float(X1-X0)
        27 
        28 def grafun(X0, X1, count, formulae):
        29   'Список длиной count вида [(x, formulae(x)),..], х из диапазона [X0, X1]'
        30   ret=[]
        31   for i in range(count):
        32     x=scale(i, 0, count-1, X0, X1)
        33     y=eval(formulae)
        34     ret.append((x,y))
        35   return ret
        36 
        37 fml = definput("Функция в виде формулы от x", "sin(x)")
        38 X0, X1 = definput("Начало и конец диапазона", -4., 4.)
        39 W, H = definput("Ширина и высота экрана", 1024, 768)
        40 X0, X1 = float(X0), float(X1)
        41 
        42 # вычисляем график (по одной точке на вертикальную колонку пикселей)
        43 gr = grafun(X0, X1, W, fml)
        44 # находим максимальное и минимальные значения функции
        45 Fx=zip(*gr)[1]	# список [ gr[0][1], gre[1][1], gr[2][1], ... ]
        46 Min, Max = min(Fx), max(Fx)
        47 # масштабируем график к экрану (x известны, они от 0 до W-1)
        48 # по-хорошему, x также надо было бы вычислять из gr[*][0]
        49 grs = [(x,scale(gr[x][1], Min, Max, 0, H)) for x in xrange(W)]
        50 
        51 # всё посчитали, открываем окошко
        52 pygame.init()
        53 screen = pygame.display.set_mode((W,H))
        54 
        55 # рисуем график
        56 pygame.draw.lines(screen, pen, False, grs, width)
        57 # цикл до закрытия окна
        58 while pygame.event.wait().type != pygame.QUIT:
        59   pygame.display.flip()
      
      pygame_grafun.py


CategoryClass CategoryVmsh

LecturesVMSH/2010-02-03 (последним исправлял пользователь FrBrGeorge 2010-02-10 15:29:00)