User:Decimus Schomer/Scripts/Fractal viewer

From The SchomEmunity Wiki
< User:Decimus Schomer‎ | Scripts
Revision as of 15:48, 21 August 2007 by Decimus Schomer (talk | contribs) (Headers, plus pre-coded an interesting fractal)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Decimus' user page | Decimus' talk page | Decimus' scripts | Decimus' script libraries | Decimus' projects
Main scripts page | Toggling Rotate script | UUID-getter scripts | Texture changer | Channel spier | Chatbot | Jump slab | Emailer | Fractal viewer | Grammar analyser | SPD viewer


About

This script, written by Decimus, is a basic fractal viewer, with a simple 'zoom'-like feature and easily customisable fractal and colouring.

To run this, you will need Python and Pygame.

Comments will be added later.

The script

# Fractal viewer - display and zoom a fractal
# Copyright (C) 2007 Decimus Schomer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

# (you can find version 2 of the GPL at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html)

import pygame, math
pygame.init()

psz = 1. / (1 << 3)

sd = 512
sc = pygame.display.set_mode((sd, sd))

pygame.event.set_allowed(None)
pygame.event.set_allowed(pygame.QUIT)

def n2c(a):
    b, c, d = a & 255, (a >> 8) & 255, (a >> 16) & 255
    return b, c, d

def getpx(x, y):
    ox, oy = x, y
    i = 0
    while ((x*x) + (y*y) < 4096) and (i < 255):
        x += 1 + (x*y) - (ox*oy)
        y -= x
        i += 1
    return (i, 0, 0)

def drawpx(x, y):
    xc = (x - sd//2) * psz
    yc = (sd//2 - y) * psz
    c = getpx(xc, yc)
    sc.set_at((x, y), c)

xp = yp = 0

while 1:
    if pygame.event.get(pygame.QUIT):
        break
    drawpx(xp, yp)
    xp += 1
    if xp == sd:
        pygame.display.update((0, yp, sd, 1))
        xp = 0
        yp += 1
        if yp == sd:
            psz /= 2
            xp = yp = 0