Kirjautuminen

Haku

Tehtävät

Koodivinkit: Python: Plasmaefekti

Kirjoittaja: flob; viimeksi muokattu 28.10.2012.

Tagit: grafiikka, kirjastot

Pekin plasmaoppaan luettuani sain inspiraation tehdä tällaisen pienen ja yksinkertaisen plasmaefektin Pythonilla. Pygame ja numpy pitäis löytyä jos haluaa testailla.

import pygame
from pygame.locals import *
import math as M
from Numeric import *

def main():

    # luodaan taulukko funktion avulla
    # kaava on pekin loistavasta plasmaoppaasta
    def plasma(x, y):
        return 127 + 127 * sin(x / (50 + 10 * cos(y / 78.))) \
                         * cos(y / (60 + 10 * sin(x / 60.)))

    screen_array = fromfunction(plasma, (1520, 1800)).astype(Int)

    # alustetaan pygame ja asetetaan ikkunan koko
    pygame.init()
    screen = pygame.display.set_mode((320, 200), 0, 8)

    # Clockin avulla framerate voidaan lukita
    clock = pygame.time.Clock()

    # toistetaan samaa kunnes jotain nappia painetaan
    aika = 1
    done = 0
    while not done:
        for event in pygame.event.get():
            if event.type in (QUIT, KEYDOWN):
                done = 1

        # luodaan paletti ... tämä se vasta on kivaa!
        tiheys = (M.sin(aika / 55) + 1.04) * 60
        paletti = []
        for k in range(256):

            R = int((M.sin(k * 0.025      + aika / 6) + 1) * 127.5)
            G = int((M.cos(k * 0.025      + aika / 5) + 1) * 127.5)
            B = int((M.sin(k * 6 / tiheys + aika / 4) + 1) * 127.5)
            #                  |            |       |          |
            #                  |            |       |          |
            #                  tiheys       pyöritys|          värien kirkkaus
            #                                       |
            #                                       |pyöritysnopeus

            paletti.append([R, G, B])
        screen.set_palette(paletti)

        # pilkotaan taulukosta sopivat palaset ja heitetään näytölle
        mx = int(M.cos(aika / 110) * 600)
        my = int(M.cos(aika / 120) * 800)
        pygame.surfarray.blit_array(screen, screen_array[600+mx : 920+mx, 800+my : 1000+my])

        # asetetaan framerate
        clock.tick(55)

        aika += 0.5
if __name__ == '__main__': main()

Kommentit

ZcMander [31.10.2005 18:44:22]

Lainaa #

Juuri tälläistä olen tarvinnu, kiitokset sinulle ;)

Multibyte [24.01.2018 20:26:08]

Lainaa #

Python 3.6.4 seuraavin muutoksin:

import pygame
from pygame.locals import *
import math as M
#from Numeric import *
from numpy import *
from numbers import *
#...
    screen_array = fromfunction(plasma, (1520, 1800)).astype(int) #Int->int
#...

Ja kyllä on hieno :) En vaan saa resoluutiota muutettua...

Kirjoita kommentti

Muista lukea keskustelun ohjeet.
Tietoa sivustosta