mit python turtle olympische ringe?
möchte mit py die olympischen ringe erstellen und zwar nicht nur diese wo die ringe übereinander liegen ich möchte das so machen das die so richtig verkettet sind
weiß jemand wie man das machen könnte hab da schon was aber das sieht nicht gut aus und ist zu aufwändig sitze schon ca 5 stunden dran
Ich bedanke mich im Voraus
so sieht es jetzt aus
hier der code:
import turtle as turtle
import time
print(turtle.pos())
# set thickness for each ring
turtle.pensize(5)
turtle.speed(20)
turtle.pencolor
#turtle.pos()
turtle.color("blue")
turtle.penup()
turtle.goto(-90, -25)
turtle.pendown()
turtle.circle(45)
turtle.color("black")
turtle.penup()
turtle.goto(-10, -25)
turtle.pendown()
turtle.circle(45,240) #(mit der zzweiten zahl kann ich die vollständigkeit des kreises bestimmen )
#print(turtle.pos())
turtle.penup()
turtle.goto(-53, 37)
turtle.pendown()
turtle.color('black')
turtle.circle(42, 53)
print(turtle.pos())
turtle.penup()
turtle.color('black')
turtle.goto(-50, -5.50)
turtle.pendown()
turtle.circle(35.65, 85)
#(-55.29,-0.41)
turtle.done()
Könntest du mal das ergänzen, was du bisher hast?
ich habe 2 Kreise diese sind aber nicht wirklich miteinander verkettet und dazu hab ich sie noch falsch verkettet
2 Antworten
Das wäre meine Lösung:
import turtle as turtle
turtle.pensize(8)
turtle.speed(20)
def drawFullCircle(circleColor, posX):
turtle.color(circleColor)
turtle.penup()
turtle.goto(posX, 0)
turtle.pendown()
turtle.circle(45)
def drawSkippingCircle(circleColor, posX):
turtle.color(circleColor)
turtle.penup()
turtle.goto(posX, -45)
turtle.pendown()
turtle.circle(45, 82)
turtle.penup()
turtle.circle(45, 18)
turtle.pendown()
turtle.circle(45, 82)
turtle.penup()
turtle.circle(45, 18)
turtle.pendown()
turtle.circle(45, 160)
drawFullCircle('blue', -2*45 - 2*8)
drawFullCircle('black', 0)
drawFullCircle('red', 2*45 + 2*8)
drawSkippingCircle('yellow', -45 - 8)
drawSkippingCircle('green', 45 + 8)
turtle.done()
Ich habe davon gebrauch gemacht, dass man Teile eines Kreises "skippen" kann, indem man penup() macht, dann circle() mit der gewünschten Anzahl an Grad, welche man überspringen möchte, aufruft, und anschließend wieder pendown() macht. Danach kann man den Rest des Kreises mit circle() weiterzeichnen.
Edit: Hab den Code noch ein wenig gekürzt:
import turtle as turtle
turtle.pensize(8)
turtle.speed(20)
def drawCircle(circleColor, posX, posY, fullCircle=False):
turtle.color(circleColor)
turtle.penup()
turtle.goto(posX, posY)
turtle.pendown()
for _ in range(0 if fullCircle else 2):
turtle.circle(45, 82)
turtle.penup()
turtle.circle(45, 18)
turtle.pendown()
turtle.circle(45, 360 if fullCircle else 160)
drawCircle('blue', -2*45 - 2*8, 0, True)
drawCircle('black', 0, 0, True)
drawCircle('red', 2*45 + 2*8, 0, True)
drawCircle('yellow', -45 - 8, -45)
drawCircle('green', 45 + 8, -45)
turtle.done()
Danke hab es letztendlich auch so gelöst, aber mein Code ist ein paar Zeilen länger und liegt jetzt bei meinem Chef auf dem Tisch (mach ein Praktikum meine eigentliche Programmiersprache ist c# soll aber Py machen, um zu sehen, wie die Firma Funktioniert arbeite aber auch nächste Woche mit c# )
Das ist eine ganz nette Challenge. Hier mal meine Version:
import turtle
ring_defs = [
{
"color": "#0082c9",
"position": (-1, 1)
}, {
"color": "#fcb32d",
"position": (-0.5, 0)
}, {
"color": "#000000",
"position": (0, 1)
}, {
"color": "#00a850",
"position": (0.5, 0)
}, {
"color": "#ef304d",
"position": (1, 1)
}
]
def coordinates(x, y):
return (110*x, 45*y)
# initialize turtle
turtle.pensize(10)
turtle.hideturtle()
turtle.tracer(False)
turtle.penup()
# draw upper 3/4 of upper rings and upper 1/4 of lower rings
# from right to left (upper intersections)
for ring in ring_defs[::-1]:
turtle.goto(*coordinates(*ring["position"]))
turtle.setheading(180)
turtle.color(ring["color"])
if ring["position"][1] == 0: # lower rings
turtle.circle(45, -45)
turtle.pendown()
turtle.circle(45, 90)
turtle.penup()
else: # upper rings
turtle.circle(45, -135)
turtle.pendown()
turtle.circle(45, 270)
turtle.penup()
# draw rest of the circles from left to right (lower intersections)
for ring in ring_defs:
turtle.goto(*coordinates(*ring["position"]))
turtle.setheading(180)
turtle.color(ring["color"])
if ring["position"][1] == 0: # lower rings
turtle.circle(45, 45)
turtle.pendown()
turtle.circle(45, 270)
turtle.penup()
else: # upper rings
turtle.circle(45, 135)
turtle.pendown()
turtle.circle(45, 90)
turtle.penup()
turtle.update()
turtle.done()
Ich lass halt erst den Teil zeichnen, wo die Kreise sich oben überschneiden und dann den Teil, wo die Kreise sich unten überschneiden. Wenn du die Zeile mit turtle.tracer(False) rausnimmst, kannst du sehen, wie es gezeichnet wird.
danke für deine Hilfe werde eure Rangehensweise übernehmen