Seite 1 von 1
xturtle - kreise in begrenztem bereich zeichnen
Verfasst: Donnerstag 14. Januar 2010, 15:20
von LP640
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
Verfasst: Donnerstag 14. Januar 2010, 16:28
von numerix
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.
Verfasst: Donnerstag 14. Januar 2010, 16:41
von LP640
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
Verfasst: Donnerstag 14. Januar 2010, 16:58
von numerix
LP640 hat geschrieben:habe ich dich da missverstanden???
Anscheinend eher umgekehrt. Dann beschreib doch nochmal genau, was du erreichen möchtest.
Verfasst: Donnerstag 14. Januar 2010, 17:05
von LP640
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
Verfasst: Donnerstag 14. Januar 2010, 17:41
von numerix
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.
Verfasst: Donnerstag 14. Januar 2010, 19:13
von LP640
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
mfg
LP640
Verfasst: Donnerstag 14. Januar 2010, 19:31
von numerix
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.
Verfasst: Donnerstag 14. Januar 2010, 19:45
von LP640
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
mfg
LP640
Verfasst: Freitag 15. Januar 2010, 16:32
von LP640
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
Verfasst: Freitag 15. Januar 2010, 23:15
von LP640
hi
ich hab jetzt ne alternative gefunden, mit der ich leben kann
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
Verfasst: Samstag 16. Januar 2010, 02:06
von EyDu