Hypnose-Spirale

Code-Stücke können hier veröffentlicht werden.
Antworten
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Mal wieder ein ganz wichtiges und brauchbares Snippet :D
WARNUNG: Nicht zu lange zusehen, kann zu Verblödung führen (Ihr wollt doch nicht so werden wie ich, oder?) :D

Code: Alles auswählen

from Tkinter import *
import math
import time

def create_spiral(x,y):
    res = [(x,y)]
    while len(res) <= 500:
        r = math.hypot(x,y) + 0.4
        a = math.atan2(y,x) + 0.2
        x = r * math.cos(a)
        y = r * math.sin(a)
        res.append((x,y))
    c.create_line(res, width=3, tags="line")

def rotate(x0,y0,d):
    coords = []
    old = c.coords("line")
    for i in range(0,len(old),2):
        x,y = old[i], old[i+1]
        r = math.hypot(y-y0, x-x0)
        a = math.atan2(y-y0, x-x0) + d
        x = x0 + r*math.cos(a)
        y = y0 + r*math.sin(a)
        coords.append((x,y))
    c.delete("line")
    c.create_line(coords, width=3, tags="line")

root = Tk()
c = Canvas(width=400, height=400)
c.pack()
create_spiral(0,0)
c.config(scrollregion=c.bbox(ALL))

while 1:
    rotate(0,0,0.1)
    root.update()
    time.sleep(0.01)

root.mainloop()
PS: Das ist nicht wirklich von mir, nur eine (fast 1:1) Übersetzung eines TCL Scripts.

Gruß, hypnotischer mawe
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

wie lange braucht man ca. um sowas zu programmieren?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Rootmentor hat geschrieben:wie lange braucht man ca. um sowas zu programmieren?
Mindestens eine Minute. Alles andere ist abhängig von deinem können ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

veers hat geschrieben:Mindestens eine Minute.
Vierzig Zeilen in einer Minute? Da muss man ja sehr schnell tippen und einen sehr guten Editor haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
zerghase
User
Beiträge: 15
Registriert: Samstag 19. November 2005, 21:15
Wohnort: München

Deswegen ist die Aussage ja auch genauso korrekt wie "mindestens eine Sekunde"...

Lustiges Programm... mit Antialiasing wärs aber noch schöner. Kann das tkinter überhaupt?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Leonidas hat geschrieben:
veers hat geschrieben:Mindestens eine Minute.
Vierzig Zeilen in einer Minute? Da muss man ja sehr schnell tippen und einen sehr guten Editor haben.
873 bytes -> ~15 Zeichen pro Sekunde, müsste knapp möglich sein ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
BlackJack

Ich hab's mal überarbeitet (Sternchen-Import beseitigt, kein Code auf Modulebene, usw.):

Code: Alles auswählen

import math
import time
import Tkinter as tk


def create_spiral(canvas, x, y, line_width=3):
    coords = [(x, y)]
    for dummy in xrange(500):
        r = math.hypot(x, y) + 0.4
        a = math.atan2(y, x) + 0.2
        x = r * math.cos(a)
        y = r * math.sin(a)
        coords.append((x, y))
    return canvas.create_line(coords, width=line_width)


def rotate(canvas, line, x0, y0, d):
    coords = list()
    old = canvas.coords(line)
    for i in range(0, len(old), 2):
        x, y = old[i] - x0, old[i + 1] - y0
        r = math.hypot(y, x)
        a = math.atan2(y, x) + d
        coords.append(x0 + r * math.cos(a))
        coords.append(y0 + r * math.sin(a))
    canvas.coords(line, *coords)


def main():
    root = tk.Tk()
    canvas = tk.Canvas(width=400, height=400)
    canvas.pack()
    spiral = create_spiral(canvas, 0, 0)
    canvas.config(scrollregion=canvas.bbox(tk.ALL))
    
    while True:
        rotate(canvas, spiral, 0, 0, 0.1)
        root.update()
        time.sleep(0.01)


if __name__ == '__main__':
    main()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo mave

Ein super Code-Snippet wo du hier präsentierst! Gratuliere!
Rootmentor hat geschrieben:wie lange braucht man ca. um sowas zu programmieren?
Mindestens 1 Minute plus ein Tages- oder mehrtägiges Mathematik-Studium. Und last but not least Tkinter-Insider Know How :lol:

Gruss wuf :wink:
Take it easy Mates!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

PyGTK-Version (benötigt gnomecanvas - also auch gnome-python). Hat etwas länger gedauert, da gnomecanvas grottig dokumentiert ist. Vielleicht wird es ja mal ersetzt.

2005 Zeichen, bei 15 Zeichen pro Sekunde dauert es etwas mehr als zwei Minuten (134 Sekunden) um das zu schreiben. Alternativ auch eine Minute wenn man sich etwas zusammenreist und ~34 Zeichen pro Sekunde schreibt. :twisted:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mit Pyglet/OpenGL, Framerate unabhängig und Vollbild, hat knappe 20 Minuten gedauert :)

http://paste.pocoo.org/show/85027/ 756 bytes ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
lunar

Ist zwar schon etwas älter, aber ich poste jetzt trotzdem noch meine Qt4 Version:
http://paste.pocoo.org/show/85761/
Antworten