@Sirius3 Natürlich kann man kubische Splines durch quadratische Splines gut annähern. Die kubischen Splines sind selbst nur eine Annäherung an die Form. Exakt gibt es bei unendlichen Reihen und Folgen eh nichts, nur bis zu einer gewissen Genauigkeit auf soundsoviel Stellen und bis auf unendlich viel Stellen nach dem Komma wollen wir eh nicht rechnen, weil wir auch nicht unendlich viel Zeit haben und kein unendlich langes Papier.
Also kubische Splines lassen sich auch durch quadratische gut annähern. Allerdings sind es bei tk parabolische Splines, die tangential durch die Mitten von Geraden verlaufen oder als gerade Linie von Mitte zu Mitte, wenn die Tangenten sich nicht schneiden, weil sie gleiche oder annähernd gleiche Steigung haben.
Und ein dementsprechender Algorithmus wäre mir zu aufwändig.
Die andere Frage ist, bringt smooth etwas oder nichts? Der Unterschied ist nicht groß, wenn wir statt 3 Bezierpunkten 30 berechnete Punkte nehmen (Faktor 10):
Links ohne Smooth rechts mit Smooth bei 12 Splinesteps. Links sieht man kleine Unregelmäßigkeiten auf dem Rücken. Rechts ist es schön regelmäßig. Bei anderen Formen kann es ohne Smooth auch etwas mehr ausgefranst sein. Wie gesagt, der Unterschied ist nicht groß. Wer das links so schön regelmüäßg hinbringen möchte, kann ja die Anzahl der berechneten Punkte verzwölffachen. Dann kommt in etwa auch dasselbe so schön regelmäßig heraus wie rechts.
Nur wird dann das Ganze speicherintensiv. Eine Form durch Bezier ausgedrückt mit einer Filegröße von 4 KB wird vielleicht als TkInter Polygone bei einer Verzehnfachung der Punkte und mit tkinter Floatzahlen ausgedrückt bereits mit vielleicht 70 KB gespeichert. Wenn wir für links das nochmals verzwölffachen würden, dann wäre der Speicherplatzbedarf zum Abspeichern bereits etwa 1 MB. Und das muß ja wohl wirklich nicht sein. Außerdem werden bei solchen Datenmengen im Speicher auch Bewegungen mittels move verzögert.
Wem es auf schöne Regelmäßigkeit ankommt, sollte daher wohl besser den Smooth vorziehen statt speicherintensiver Datenmengen.
Was beim Smooth wichtig ist, ist, dass auch gerade Linien richtig kommen. Und dafür sind nicht nur die Linienendpunkte zu verdoppeln, sondern auch der Startpunkt:
Code: Alles auswählen
def line_to(*args):
x0 = self.coordinates[-2]
y0 = self.coordinates[-1]
self.coordinates.extend((x0,y0))
for index in range(0,len(args),2):
self.coordinates.append(args[index])
self.coordinates.append(args[index+1])
self.coordinates.append(args[index])
self.coordinates.append(args[index+1])