mit python turtle olympische ringe?


21.07.2022, 21:36

so sieht es jetzt aus


21.07.2022, 21:37

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()

MrAmazing2  21.07.2022, 21:33

Könntest du mal das ergänzen, was du bisher hast?

Saas115 
Beitragsersteller
 21.07.2022, 21:37

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()
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Saas115 
Beitragsersteller
 23.07.2022, 23:19

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# )

1

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.


Saas115 
Beitragsersteller
 23.07.2022, 23:20

danke für deine Hilfe werde eure Rangehensweise übernehmen

1