Driehoeksvulling

We gaan nu een start maken met de volgende vlaksvulling

We kunnen hiervoor de code van de vorige opdrachten goed gebruiken. Daar moesten wij een deeltaak driehoek maken. Deze hoeft alleen nog worden uitgebreid met een fill_color()

import turtle
import math

t = turtle.Turtle()
t.speed(0)

def driehoek(zijde,kleur):
  t.fillcolor(kleur)
  t.begin_fill()
  t.forward(zijde)
  t.left(90)
  t.forward(zijde)
  t.left(135)
  t.forward(math.sqrt(2)*zijde)
  t.left(135)
  t.end_fill()

In het de vlakvulling zien we dat het driehoekje steeds wordt herhaald. Maar de kleur wisselt steeds
Om onze code flexibel te maken starten we met het aanmaken van variabele.

# variabele
zijde = 50
rijen = 4
kolommen = 5

Als we dan later meer rijen of kolommen willen tekenen kan dat eenvoudig door het getal achter de variabele aan te passen.

In de vlakvulling zien we dat op elke rij 5 driehoekjes staan. Dit kunnen we oplossen met een loop

for kolom in range(kolommen):
  driehoek(zijde,"red")

Dit tekent echter 5 driekhoekjes over elkaar heen. Dus na het tekenen van een driehoek moeten we onze turtle zijde opschuiven om de volgende te tekenen.

for kolom in range(kolommen):
  driehoek(zijde,"red")
  t.forward(zijde)
We krijgen nu
Als we nu meerdere rijen willen gaan tekenen is het belangrijk dat na het tekenen van een rij onze turtle weer helemaal teruggaat naar het begin. En liever nog naar de positie waar de nieuwe rij getekend moet gaan worden.
Hieronder drie manieren die je kan gebruiken:
 
Optie 1: Gebruik van forward(), left() etc...
t.penup()
t.backward(kolommen*zijde) # je gaan in ons geval 5x50 terug
t.right(90)
t.forward(zijde)
t.left(90)
t.pendown()

De andere manier is door een goto(x,y), daarbij heb je weer twee mogelijkheden

Optie 2: Code die uitgevoerd wordt voordat er een rij wordt getekend

t.penup()
t.goto(0,-rij*zijde) # let op variabele rij moeten we nog aanmaken
t.pendown()

Optie 3: Code die volgt na het tekenen van een rij

t.penup()
t.goto(0,-(rij+1)*zijde) # let op variabele rij moeten we nog aanmaken
t.pendown()

Omdat we in de tekening steeds de volgende rij eronder tekenen is bij de goto() de y-coördinaat negatief. rij loopt daarbij van 0 tot 4, die gaat we zo aanmaken als we ook de loop voor de rijen gaan gebruiken.

De optie met de minste code is uiteraard de meest aantrekkelijke om te gebruiken. Dus we gaan voor optie 2, maar de andere opties zijn natuurlijk ook juist.

Code tot nu toe

import turtle
import math

t = turtle.Turtle()
t.speed(0)

def driehoek(zijde,kleur):
  t.fillcolor(kleur)
  t.begin_fill()
  t.forward(zijde)
  t.left(90)
  t.forward(zijde)
  t.left(135)
  t.forward(math.sqrt(2)*zijde)
  t.left(135)
  t.end_fill()

# variabele
zijde=50
rijen=4
kolommen=5

#vlakvulling
t.penup()
t.goto(0, -rij * zijde) # let op geeft foutmelding want rij bestaat nog niet!!!!
t.pendown()
for kolom in range(kolommen):
  driehoek(zijde, "red")
  t.forward(zijde)
Nu moeten we de code van de vlakvulling rijen keer herhalen
for rij in range(rijen):
  t.penup()
  t.goto(0, -rij * zijde)
  t.pendown()
  for kolom in range(kolommen):
    driehoek(zijde, "red")
    t.forward(zijde)

Dus voor het tekenen van een rij wordt de turtle in de juiste positie gezet dmv goto(). Daarna wordt de rij getekend.

Nu het laatste probleem de driehoekjes veranderen steeds van kleur. De kleur is afhankelijk van de de positie in de rij en welke kolom.

Voor de eerste rij starten we met rood, onze herhaling loopt van 0 tot 5. Hierbij moet driehoek 0, 2, 4 rood worden en 1, 3 blauw. Je ziet waarschijnlijk al dat we iets met even/oneven moeten gaan doen.

Als kolom even is dan teken we rood en anders blauw

if kolom % 2 == 0:  # bij kolom=even geeft de deling geen rest (modulo = 0)
  driehoek(zijde, "red")
else:
  driehoek(zijde, "blue")

Maar bij de volgende rij die we tekenen is het weer net andersom

if kolom % 2 == 1:  # bij kolom=oneven geeft de deling rest 1 (modulo = 1)
  driehoek(zijde, "red")
else:
  driehoek(zijde, "blue")

Dus bij een even rij moeten we de eerste gebruiken en bij een oneven rij de tweede

if rij % 2 == 0:             # even rij
  if kolom % 2 == 0:         # even kolom
    driehoek(zijde, "red")
  else:                      # oneven kolom
    driehoek(zijde, "blue")
else:                        # oneven rij
  if kolom % 2 == 1:         # oneven kolom
    driehoek(zijde, "red")
  else:                      # even kolom
    driehoek(zijde, "blue")