xturtle - kreise in begrenztem bereich zeichnen

Fragen zu Tkinter.
Antworten
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
hier erstmal der code:

Code: Alles auswählen

from xturtle import*
winsize(600,600)
bgcolor("black")
tracer(0)
goto(-200,-200)
fillcolor("yellow")
begin_fill()
for i in range(4):
    forward(400)
    right(90)
end_fill()
fritz=Turtle()
tracer(1)
fritz.penup()
fritz.goto(120,80)
fritz.color("blue")
fritz.pendown()

x=0
for i in range(1000):
    tracer(0)
    fritz.clear()
    fritz.circle(x)
    x=x+1
    print x
    tracer(1)
    
mainloop()
ich hätte nun aber gerne, dass der kreis nicht über den gelben bereich hinaus gezeichnet wird

mein lösung hierzu:

Code: Alles auswählen

from xturtle import*
winsize(600,600)
bgcolor("black")
tracer(0)
goto(-200,-200)
fillcolor("yellow")
begin_fill()
for i in range(4):
    forward(400)
    right(90)
end_fill()
fritz=Turtle()
tracer(1)
fritz.penup()
fritz.goto(120,80)
fritz.color("blue")
fritz.pendown()

x=0
for i in range(1000):
    tracer(0)
    fritz.clear()
    for i in range(360):
        fritz.pendown()
        if fritz.xcor()>200 or fritz.ycor()>200 or fritz.xcor()<-200 or fritz.ycor()<-200:
            fritz.penup()
        fritz.circle(x,1)
    x=x+1
    print x
    tracer(1)
    
mainloop()
jetzt habe ich jedoch das problem, dass die kreise viel zu langsam gezeichnet werden

hat jemand eine bessere lösung oder einen forschlag???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Abstand des Mittelpunktes des Kreises von der oberen Kante des gelben Rechtecks berechnen und den Radius dann nur bis zu dem berechneten Abstand anwachsen lassen. Da das Rechteck parallel zu den Achsen im Koordinatensystem liegt, brauchst du nur die Differenz der y-Werte zu nehmen.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
Abstand des Mittelpunktes des Kreises von der oberen Kante des gelben Rechtecks berechnen und den Radius dann nur bis zu dem berechneten Abstand anwachsen lassen. Da das Rechteck parallel zu den Achsen im Koordinatensystem liegt, brauchst du nur die Differenz der y-Werte zu nehmen.
@ numerix: hast du dir meinen zweiten pythoncode angeschaut???

weil wenn ich das so mache wie du es beschreibst hört der kreis ja auf zu wachsen, wenn er den gelben bereich verlässt, aber er soll ja eben weiterwachsen aber halt eben nur im gelben bereich sichtbar sein oder habe ich dich da missverstanden???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:habe ich dich da missverstanden???
Anscheinend eher umgekehrt. Dann beschreib doch nochmal genau, was du erreichen möchtest.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

ich hätte gerne genau das hier:

Code: Alles auswählen

from xturtle import* 
winsize(600,600) 
bgcolor("black") 
tracer(0) 
goto(-200,-200) 
fillcolor("yellow") 
begin_fill() 
for i in range(4): 
    forward(400) 
    right(90) 
end_fill() 
fritz=Turtle() 
tracer(1) 
fritz.penup() 
fritz.goto(120,80) 
fritz.color("blue") 
fritz.pendown() 

x=0 
for i in range(1000): 
    tracer(0) 
    fritz.clear() 
    for i in range(360): 
        fritz.pendown() 
        if fritz.xcor()>200 or fritz.ycor()>200 or fritz.xcor()<-200 or fritz.ycor()<-200: 
            fritz.penup() 
        fritz.circle(x,1) 
    x=x+1 
    print x 
    tracer(1) 
    
mainloop()
nur, dass alles etwas schneller gezeichnet werden soll wie hier:

Code: Alles auswählen

from xturtle import*
winsize(600,600)
bgcolor("black")
tracer(0)
goto(-200,-200)
fillcolor("yellow")
begin_fill()
for i in range(4):
    forward(400)
    right(90)
end_fill()
fritz=Turtle()
tracer(1)
fritz.penup()
fritz.goto(120,80)
fritz.color("blue")
fritz.pendown()

x=0
for i in range(1000):
    tracer(0)
    fritz.clear()
    fritz.circle(x)
    x=x+1
    print x
    tracer(1)
    
mainloop()
(hier tritt der kreis jetzt aber aus dem gelben feld aus)

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich wollte eine Beschreibung, nicht den Code. Ich habe xturtle nicht installiert und mit turtle (unter Python 3) sieht es offenbar anders aus als bei dir, denn deine Beschreibung passt nicht zu dem, was ich sehe.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo

also der hintergrund ist schwarz und darauf befindet sich ein gelbes quadrat mit den längen 400*400 pixel. der mittelpunkt des quadrates ist bei 0/0

so jetzt kommt fritz (name einer zweiten turtle). dieser bewegt sich zuerst zu 120/80 und von da aus zeichnet er 1000 mal einen kreis. der radius des kreises beträgt am anfang 0 und wird mit jedem durchgang um 1 größer und hat dann am ende 999 (oder 1000, bin mir net ganz sicher)
jedoch soll dieser kreis nur im gelben feld erscheinen, also soll er nicht ins schwarze feld treten aber er soll halt nicht (wie bei deinem vorschlag zuvor, numerix) aufhören zu zeichnen, wenn er den rand des gelben quadrates berührt sondern immer weiter bis die 1000 durchgänge durch sind.
so ich hoffe man kann das verstehen :wink:

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Alles klar. Bei der Darstellung, die ich (mit turtle) gesehen habe, war der Kreis von Anfang an außerhalb des gelben Rechtecks ...

Das einfachste wäre, den Kreis nicht blau, sondern schwarz zu zeichnen, dann würde man ihn vor dem schwarzen Hintergrund nicht sehen.

Wenn das nicht passt, dann kannst du eben keinen ganzen Kreis mehr zeichnen, sondern nur noch zwei Kreisbögen. Statt diese jeweils um 1 Grad fortzusetzen könntest du die Schnittpunkte des Kreises mit den Kanten des Rechtecks berechnen und so direkt nur 1x mit dem benötigten Mittelpunktswinkel zeichnen. Das geht dann schneller.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

ha genau das selbe habe ich mir auch schon gedacht aber ich dachte, das wird dann doch zu kompliziert aber ich versuchs mal

danke für deine hilfe numerix :D

mfg
LP640
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
ich glaube, es ist doch zu kompliziert für mich
ich komm irgendwie nicht weiter kann mir jemand einen ansatz geben???

ach ja mein programm hab ich jetzt so geändert:

Code: Alles auswählen

from xturtle import*
winsize(600,600)
bgcolor("black")
tracer(0)
goto(-200,-200)
fillcolor("yellow")
begin_fill()
for i in range(4):
    forward(400)
    right(90)
end_fill()
fritz=Turtle()
tracer(1)
fritz.penup()
fritz.goto(120,80)
fritz.color("blue")
fritz.pendown()

x=0
for i in range(1000):
    tracer(0)
    fritz.clear()
    for i in range(360):
        fritz.goto(fritz.xcor()+x,fritz.ycor())
        fritz.pendown()
        if fritz.xcor()>200 or fritz.ycor()>200 or fritz.xcor()<-200 or fritz.ycor()<-200:
            fritz.penup()
        fritz.circle(x,1)
        fritz.penup()
        fritz.goto(fritz.xcor()-x,fritz.ycor())
    x=x+1
    print x
    tracer(1)
    
mainloop()
jetzt ist bei 120/80 immer der mittelpunkt des kreises

mfg
LP640
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hi
ich hab jetzt ne alternative gefunden, mit der ich leben kann :wink:

ich hab noch kurz ne andre frage und zwar was bewirken die folgenden drei zeilen?:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
# -*- coding: cp1252 -*-
mfg
LP640
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Leben ist wie ein Tennisball.
Antworten