Seite 1 von 1
3D-Zeichnen mit pygame
Verfasst: Dienstag 28. November 2006, 23:32
von abgdf
Hallo,
mein Skript heute malt mit pygame / SDL ein hübsches 3D-Muster ("Gauß'sche Normalverteilung") auf den Bildschirm. Beenden mit "q":
Code: Alles auswählen
#!/usr/bin/python
import pygame, sys,os
import math
from pygame.locals import *
pygame.display.init()
# Anzahl Bildschirmpunkte:
RESX = 1024
RESY = 768
# RESX = 800
# RESY = 600
window = pygame.display.set_mode((RESX, RESY))
pygame.display.set_caption('Normalverteilung')
screen = pygame.display.get_surface()
b = 0.3
ULIM = 100.
UDIV = 1.8
for u in range(0, int(ULIM), 1):
# Voll krass Mathe, Alder:
a = float(u) / (ULIM / UDIV)
if u > ULIM / 2:
a = UDIV - (float(u) / (ULIM / UDIV))
m = u / 16.
for x in range(50, RESX - 50):
c = x / (RESX / 16.) - 5.
y = a * math.exp(-b * (c - m) * (c - m))
# Nach unten:
y = RESY / 10 + (y * RESY / 1.5 + u * 3)
# Nach oben:
# y = RESY * 9 / 10 - (y * RESY / 1.5 + u * 3)
pygame.draw.line(screen, (200,200,200), (x, y), (x, y), 1)
pygame.display.update()
def input(events):
for event in events:
if str(event).find("'key': 113,") != -1 or event.type == QUIT:
sys.exit(0)
while True:
input(pygame.event.get())
Könnt ihr noch schönere Muster zeichnen (lassen) ?
Viele Grüße
Verfasst: Mittwoch 29. November 2006, 00:26
von Leonidas
Kannst du auch einen Screenshot posten?
Ich kann dir die verteilung von Primzahlen posten wenn du magst. Alternativ auch eine stilisierte Sinuskurve, also beides Dinge von recht geringem künstlerischen Niveau

Verfasst: Mittwoch 29. November 2006, 21:23
von abgdf
Kannst du auch einen Screenshot posten?
Gern. Den Screenshot erhält man mit
Code: Alles auswählen
wget -c http://www.angelfire.com/linux/tux25/pygauss.png
(Man muß "wget" benutzen, weil man auf dem Server Grafiken nicht direkt ansteuern kann.)
Viele Grüße
Verfasst: Mittwoch 29. November 2006, 21:29
von Python 47
abgdf hat geschrieben:
(Man muß "wget" benutzen, weil man auf dem Server Grafiken nicht direkt ansteuern kann.)
Das halt ich für ein Gerücht...

Verfasst: Donnerstag 30. November 2006, 01:33
von abgdf
Ist ja irre: Das geht auch in ZX Spectrum-Basic:
Code: Alles auswählen
wget -c http://www.angelfire.com/linux/tux25/specscr.png
wget -c http://www.angelfire.com/linux/tux25/speccode.png
Viele Grüße
Verfasst: Donnerstag 30. November 2006, 13:47
von Leonidas
Dann werf ich auch noch mal die Primzahlen-Verteilung ein:
Die Ausgabe deines Programme ist cool, allerdings würde ich def input umbenennen und es auch sonst in Funktionen aufteilen. Die locals würde ich auch nicht per *-Import reinziehen, ich schmeiss das immer in den `pyl`-Namespace.
Verfasst: Samstag 2. Dezember 2006, 22:15
von abgdf
Die Ausgabe deines Programme ist cool,
Dankeschön !
Bei Deinem Bild müßte man wohl noch genauer wissen, was es mathematisch darstellt, um die Schönheit besser würdigen zu können ...
Wie man solche Bilder plotten läßt, war für mich ein altes Programmierrätsel, dem ich erst jetzt langsam auf die Spur komme.
Die Rechner früher, selbst 8-bit-Rechner, konnten das zwar (s.o.), aber ich wußte nie, wie. Sah damals wie Zauberei aus.
Eines Tages möchte ich z.B. so ein Bild von einem eigenen Python-Skript berechnen lassen:
http://www.linux-magazin.de/Artikel/aus ... ample0.gif
von
http://www.linux-magazin.de/Artikel/aus ... gauss.html
Viele Grüße
Verfasst: Samstag 2. Dezember 2006, 22:25
von Leonidas
abgdf hat geschrieben:Bei Deinem Bild müßte man wohl noch genauer wissen, was es mathematisch darstellt, um die Schönheit besser würdigen zu können ...
Dann löse ich mal auf: Jeder der Pixel ist eine Zahl, von 0 oben links bis X-Auflösung mal Y-Auflösung unten rechts, diese Zahlen sind hintereinander aufgereiht, und nun sind sie verschieden eingefärbt: schwarz für prim, weiß für nicht-prim. Es hat Spaß gemacht einen ausreichend schnellen Algorithmus zu finden und es hat Spaß gemacht, den Code so zu optimieren, dass es nicht Stunden fürs Ausrechnen und Anzeigen gebraucht hat.
Verfasst: Samstag 2. Dezember 2006, 23:33
von birkenfeld
Leonidas hat geschrieben:
Dann löse ich mal auf: Jeder der Pixel ist eine Zahl, von 0 oben links bis X-Auflösung mal Y-Auflösung unten rechts, diese Zahlen sind hintereinander aufgereiht, und nun sind sie verschieden eingefärbt: schwarz für prim, weiß für nicht-prim. Es hat Spaß gemacht einen ausreichend schnellen Algorithmus zu finden und es hat Spaß gemacht, den Code so zu optimieren, dass es nicht Stunden fürs Ausrechnen und Anzeigen gebraucht hat.
Um das ganze übersichtlicher zu machen, hättest du die geraden Primzahlen blau und die ungeraden rot einfärben können.

Verfasst: Sonntag 3. Dezember 2006, 00:11
von Leonidas
birkenfeld hat geschrieben:Um das ganze übersichtlicher zu machen, hättest du die geraden Primzahlen blau und die ungeraden rot einfärben können.

Vor allem die blauen Punkte wären sicher sehenswert gewesen

Verfasst: Sonntag 3. Dezember 2006, 09:23
von Crush
hallo
Dieses Bild ist zwar auch keine "3D"-Zeichnung, aber ich finde die Ausgabe trotzdem interessant. Es handelt sich um die grafische Darstellung des Nagel-Schreckenberg-Modells (
http://de.wikipedia.org/wiki/Nagel-Schreckenberg-Modell).
Gruss Crush
edit: noch was grafisches, das ich mal gemacht habe:
http://www.python-forum.de/viewtopic.php?p=46287 -- jedoch auch hier wieder nur 2D...
Verfasst: Sonntag 3. Dezember 2006, 10:20
von mawe
Hi!
Ich mag Grafiken

Könntet ihr auch den Code posten, mit dem ihr die erstellt habt?
Gruß, mawe
Verfasst: Sonntag 3. Dezember 2006, 11:00
von Crush
Hi mawe
klar:
ca.py
[Edit: Code ins LodgeIt
ausgelagert]
plot.py
[Edit: Code ins LodgeIt
ausgelagert]
Das habe ich vor etwa zwei Tagen geschrieben für eine kleine Arbeit über Zelluläre Automaten, es ist jedoch noch lange nicht "fertig". Daher auch nicht wirklich dokumentiert und einiges ist auch noch fest einprogrammiert und wenig dynamisch... Werde ich aber (wohl ab nächster Woche) noch verbessern und erweitern.
Zuerst muss man die Datei ca.py ausführen und erhält als Ausgabe eine Datei namens 'data.txt'. Führ man dann die Datei plot.py aus, erhält man ein Bild 'foo.png'.
abgdf: Will dir da den Thread nicht besudeln... Falls dir das zu Off-Topic ist, sag bitte Bescheid, dann werd' ich meinen Kram irgendwo anders posten.
Crush
Edit (Leonidas): Code ins LodgeIt ausgelagert.
Verfasst: Sonntag 3. Dezember 2006, 18:15
von abgdf
Falls dir das zu Off-Topic ist
Nee, ist doch super. Klasse Bild !
Viele Grüße
Verfasst: Freitag 6. April 2007, 19:03
von thelittlebug
Leonidas hat geschrieben:Dann werf ich auch noch mal die Primzahlen-Verteilung ein:
Die Ausgabe deines Programme ist cool, allerdings würde ich def input umbenennen und es auch sonst in Funktionen aufteilen. Die locals würde ich auch nicht per *-Import reinziehen, ich schmeiss das immer in den `pyl`-Namespace.
sieht wie ein defekter grafikkartenram aus, dazu gleich ne aufgabe: modifizieren sie den hauptspeicher ihrer grafikkarte dahingehend eine ausreichend schnelle lösung für alle in den ram passender primzahlen zu erhalten.
lgherby
€: hab unabsichtlich das bild mitge"quote"d
Verfasst: Freitag 6. April 2007, 21:12
von Crush
Ich beschäftige mich momentan mit Optimierungsalgorithmen (Stichwort: Travelling Salesman Problem,
http://en.wikipedia.org/wiki/Travelling ... an_problem) und schreibe dazu in Python und pygame einige Beispiele zur Veranschaulichung. Heute kam dabei sowas heraus, ich hoffe es gefällt

:
http://claude.nouk.ch/screenshot.png
Wenn man das ganze laufen lässt, sieht man, wie die Route langsam aber sicher optimaler wird, bis irgendwann keine kürzeren Wege gefunden werden. Ich habe heute aber nicht wirklich "schönen" Code geschrieben (und das ganze steht sowieso noch im Anfagsstadium), daher poste ich momentan noch keinen Code. Falls das jemand interessiert, kann ich das ganze aber in den nächsten Wochen mal zeigen.
Gruss Crush