Sierpinski-Kurve

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Hat er doch geschrieben: Es war ein IndentFehler, daher macht sein Skript gar nichts, wenn der Fehler kommt :)
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
BeneCrack
User
Beiträge: 9
Registriert: Sonntag 20. Januar 2008, 13:04
Kontaktdaten:

Hallo

Diese SierpA - B Funktionen hab ich desswegen weil ich diese Aufgabe
rekursiv lösen muss. :lol:
BeneCrack
User
Beiträge: 9
Registriert: Sonntag 20. Januar 2008, 13:04
Kontaktdaten:

Ich hab jetzt die Zeile neu geschrieben (ganz links und dann eingerückt) und es kommt noch immer dieser Fehler.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ah, erst habe ich übersehen, wo der Fehler liegt. Aber schau doch mal auf die Position der 'def's, die dahinter folgen. Na? Liegen die alle an derselben Stelle? Am besten nimmst Du einen Editor, der Dir bei der Einrückung hilft. Wie schon gesagt: Wenn Du Tabs und Leerzeichen gemischt hast, kannst Du solche Fehler auch provozieren. Gute Editoren zeigen auf Wunsch auch an, ob Tabs oder Leerzeichen vorliegen und machen auch Korrekturen.

Gruß,
Christian
BlackJack

@BeneCrack: Rekursiv lösen heisst nicht, dass man *vier* Funktionen braucht, das geht auch mit einer. Siehe das BASIC-Beispiel. Die Regeln kann man auch in eine Datenstruktur stecken. Dann lässt sich der gleiche Code dazu nutzen mit anderen Regeln auch andere Kurven zu zeichnen.

Die Klassenaufteilung ist übrigens unsinnig. Am Ende landet doch alles in einer Klasse, warum sind das also drei "verschiedene"? Der Inhalt von `Sierpinski` und `SierKurve` sollte eine Klasse sein. Und da die nichts mit Sierpinski im besonderen zu tun hat, wäre ein allgemeinerer Name angebracht. `Canvas` zum Beispiel. Die unbedingten ``return True`` am Ende von `save()` und `show()` sind überflüssig und sollten weg fallen.

Dann sind die letzten Koordinaten Klassenattribute, wo sie besser Instanzattribute sein sollten. Auf `dist` und `dist0` sollte man auch besser über `self` zugreifen. Und wenn das Klassenkonstanten sein sollten, wäre komplette Grossschreibung der Namen eine gute Idee, um das deutlicher zu machen.

Der Inhalt von `SierpinskiKurve` braucht nicht in einer Klasse zu stecken. Hier reichen ganz normale Funktionen.
BeneCrack
User
Beiträge: 9
Registriert: Sonntag 20. Januar 2008, 13:04
Kontaktdaten:

Hallo

Das mit dem Tabs und Leerzeichen hab ich schon gelöst. Aber ich schaffs
einfach nicht die 4 Rekursionen in einem zu unterbringen.

Und kann mir jemand dieses Programm:
(http://paste.pocoo.org/show/22789/)
in python umschreiben oder nur die Rekursion weil ich versteh diese Programmiersprache nicht.

Danke Leute
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BeneCrack hat geschrieben:Das mit dem Tabs und Leerzeichen hab ich schon gelöst. Aber ich schaffs einfach nicht die 4 Rekursionen in einem zu unterbringen.
Das sind keine "4 Rekursionen".
Eine rekursion hast du z.B. dann, wenn eine Funktion sich selber aufruft, das typische Beispiel ist da die fakultät: !3 = 3 * !2
Es wäre hier vmtl besser, wenn du erstmal, unabhängig von der Programmiersprache das konzept "Rekursion" zu verstehen versuchst.
Und kann mir jemand dieses Programm:
(http://paste.pocoo.org/show/22789/)
in python umschreiben oder nur die Rekursion weil ich versteh diese Programmiersprache nicht.
Das ist so ziemlich der einzige weg, sich hier böse kommentare einzufangen.
Die populären Antworten dürften sein:
"Was bietest du denn als Bezahlung dafür, dass ich deine Arbeit mache?"
oder einfach
"Wir machen dir nicht deine Hausaufgaben".

Python ist recht leicht zu lernen, aber man muss (wie bei Mathe) nicht versuchen, nur das zu verstehen, was man gerade für die Aufgabe braucht, das Funktioniert nie.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

keppla hat geschrieben:
BeneCrack hat geschrieben:Das mit dem Tabs und Leerzeichen hab ich schon gelöst. Aber ich schaffs einfach nicht die 4 Rekursionen in einem zu unterbringen.
Das sind keine "4 Rekursionen".
Eine rekursion hast du z.B. dann, wenn eine Funktion sich selber aufruft, das typische Beispiel ist da die fakultät: !3 = 3 * !2
Es wäre hier vmtl besser, wenn du erstmal, unabhängig von der Programmiersprache das konzept "Rekursion" zu verstehen versuchst.
"The Little Schemer" lehrt beispielsweise Rekursion. Mehr als dass es Scheme lehrt.
keppla hat geschrieben:Das ist so ziemlich der einzige weg, sich hier böse kommentare einzufangen.
Die populären Antworten dürften sein:
"Was bietest du denn als Bezahlung dafür, dass ich deine Arbeit mache?"
oder einfach
"Wir machen dir nicht deine Hausaufgaben".
Oh, jetzt wollt ich doch grad das sagen :P
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BeneCrack
User
Beiträge: 9
Registriert: Sonntag 20. Januar 2008, 13:04
Kontaktdaten:

Hallo Leute

Habs heute geschafft. Morgen muss ich die Aufgabe abgeben und alles
funktioniert.
Achja ich hab es mit PYX gemacht weil es so verlang ist.
Hier der Sourcecode:

Datei Ausfuehren_sierKurve.py:

Code: Alles auswählen


   # erstellt am: 24.01.2008
   # Projektname: Sierpinski Kurve
   # Dateiname: Ausfuehren_sierKurve.py
   # Autor: Benedek Benjamin, 2BHDV, d06035, 03
   # (C) Copyright 2007-2008 Benedek Benjamin
   

import sierKurve

level = 1

kurve = sierKurve.SierpinskiKurve()
kurve.generate(level)
kurve.save("SierpinskiKurve_Stufe" + str(level))
Datei sierKurve.py:

Code: Alles auswählen


   # erstellt am: 24.01.2008
   # Projektname: Sierpinski Kurve
   # Dateiname: sierKurve.py
   # Autor: Benedek Benjamin, 2BHDV, d06035, 03
   # (C) Copyright 2007-2008 Benedek Benjamin

from pyx import *


class SierKurve():
	thisX = 0
	thisY = 0
	
	def __init__(self):	#Zeichenfläche wird erstellt
		self.img = canvas.canvas()
	
	def goToXY(self, x, y):
		SierKurve.thisX = x
		SierKurve.thisY = y
	
	def lineRel(self, deltaX, deltaY):	#Linie wird gezeichnet
		self.img.stroke(path.line(SierKurve.thisX, SierKurve.thisY, SierKurve.thisX+deltaX, SierKurve.thisY+deltaY))
		SierKurve.thisX += deltaX
		SierKurve.thisY += deltaY
	def save(self, filename):	#Die Zeichnung wird als PDF abgespeichert
		self.img.writeEPSfile(filename)
		self.img.writePDFfile(filename)
	        print 'Gespeichert als: %s' % filename

class SierpinskiKurve(SierKurve):
	dist = 1
	dist0 = 1
	def __init__(self):
		SierKurve.__init__(self)
	
	def generate(self, level):	#Hier beginnt alles
		print "Einen Moment bitte, Daten werden verarbeitet..."
		SierpinskiKurve.dist = SierpinskiKurve.dist0
		
		#Grundmuster besteht aus dem aufruf von den A B C D Funktionen
		self.goToXY(2*SierpinskiKurve.dist,SierpinskiKurve.dist)
		self.sierpA(level) 	#Rekursion wird gestartet
		self.lineRel(+SierpinskiKurve.dist,+SierpinskiKurve.dist)
		self.sierpB(level)      #Rekursion wird gestartet
		self.lineRel(-SierpinskiKurve.dist,+SierpinskiKurve.dist)
		self.sierpC(level) 	#Rekursion wird gestartet
		self.lineRel(-SierpinskiKurve.dist,-SierpinskiKurve.dist)
		self.sierpD(level)      #Rekursion wird gestartet  
		self.lineRel(+SierpinskiKurve.dist,-SierpinskiKurve.dist)
	
	
	#So ensteht einfach erklärt eine Sierpinski Kurve:
	#A: 	aufruf von A B D A
	#B:	aufruf von B C A B
	#C:	aufruf von C D B C
	#D:	aufruf von D A C D
	# Bei jedem Rekursionsaufruf wird die Rekursionstiefe um 1 vermindern
	#In den Rekursionsfunktionen wird auch die Zeichen Funktion (lineRel) mit den entsprechenden Koordinaten aufgerufen
	def sierpA (self, level):
		if (level > 0):
			self.sierpA(level-1)    
			self.lineRel(+SierpinskiKurve.dist,+SierpinskiKurve.dist)
			self.sierpB(level-1)   
			self.lineRel(+2*SierpinskiKurve.dist,0)
			self.sierpD(level-1)    
			self.lineRel(+SierpinskiKurve.dist,-SierpinskiKurve.dist)
			self.sierpA(level-1)
		


	def sierpB (self, level):
		if (level > 0):
			self.sierpB(level-1)    
			self.lineRel(-SierpinskiKurve.dist,+SierpinskiKurve.dist)
			self.sierpC(level-1)    
			self.lineRel(0,+2*SierpinskiKurve.dist)
			self.sierpA(level-1)    
			self.lineRel(+SierpinskiKurve.dist,+SierpinskiKurve.dist)
			self.sierpB(level-1)
		


	def sierpC (self, level):
		if (level > 0):
			self.sierpC(level-1)    
			self.lineRel(-SierpinskiKurve.dist,-SierpinskiKurve.dist)
			self.sierpD(level-1)    
			self.lineRel(-2*SierpinskiKurve.dist,0)
			self.sierpB(level-1)    
			self.lineRel(-SierpinskiKurve.dist,+SierpinskiKurve.dist)
			self.sierpC(level-1)
		


	def sierpD (self, level):
		if (level > 0):
			self.sierpD(level-1)    
			self.lineRel(+SierpinskiKurve.dist,-SierpinskiKurve.dist)
			self.sierpA(level-1)    
			self.lineRel(0,-2*SierpinskiKurve.dist)
			self.sierpC(level-1)    
			self.lineRel(-SierpinskiKurve.dist,-SierpinskiKurve.dist)
			self.sierpD(level-1)
	
Ein grosses dankeschön an euch, weil Ihr ein wenig geholfen habt. :lol: :lol: :lol:
Antworten