Napiši program, ki nariše nekaj naključno postavljenih krožnic,
tako kot je prikazano na sliki:
import risar
from random import *
for i in range(50):
x = randint(0, risar.maxX)
y = randint(0, risar.maxY)
r = randint(20, 60)
barva = risar.barva(randint(0, 255), randint(0, 255), randint(0, 255))
# barva = risar.barva(randint(0, 255), 255, 255) # zima
# barva = risar.barva(255, randint(32, 224), 0) # jesen
risar.krog(x, y, r, barva)
risar.stoj()
Poveži s prvo
Podobno kot prej, hkrati pa poveži še središče prve krožnice s
središči vseh ostalih krožnic.
import risar
from random import *
for i in range(20):
x = randint(0, risar.maxX)
y = randint(0, risar.maxY)
r = randint(20, 60)
barva = risar.barva(randint(0, 255), randint(0, 255), randint(0, 255))
risar.krog(x, y, r, barva)
if i == 0:
xx, yy = x, y
else:
risar.crta(x, y, xx, yy, barva)
risar.stoj()
Vse povezano
Sedaj pa s črtami poveži središča vseh krožnic.
import risar
from random import *
krogi = []
for i in range(10):
x = randint(0, risar.maxX)
y = randint(0, risar.maxY)
r = randint(20, 60)
barva = risar.barva(randint(0, 255), randint(0, 255), randint(0, 255))
risar.krog(x, y, r, barva)
for xx, yy in krogi:
risar.crta(x, y, xx, yy, barva)
krogi.append((x, y))
risar.stoj()
Krožnice na krožnici
Namesto, da točke po risalni površini posjueš naključno, jih raje
enakomerno razporedi po krožnici.
import risar
from math import *
from random import randint
n = 20
r = 200
phi = 2 * pi / n
rr = sin(phi / 2) * r
for i in range(n):
x = risar.maxX / 2 + r * cos(phi * i)
y = risar.maxY / 2 + r * sin(phi * i)
barva = risar.barva(randint(0, 255), randint(0, 255), randint(0, 255))
risar.krog(x, y, rr, barva)
risar.stoj()
... in jih, tako kot prej, poveži z daljicami.
import risar
from math import *
from random import *
n = 20
r = 200
krogi = []
phi = 2 * pi / n
rr = sin(phi / 2) * r
for i in range(n):
x = risar.maxX / 2 + r * cos(phi * i)
y = risar.maxY / 2 + r * sin(phi * i)
barva = risar.barva(randint(0, 255), randint(0, 255), randint(0, 255))
risar.krog(x, y, rr, barva)
for xx, yy in krogi:
risar.crta(xx, yy, x, y, barva)
krogi.append((x, y))
risar.stoj()
Nesekajoči se krogi
Napiši program, ki naključno razmeče 1000 krogov, tako da
se središče nobenega kroga ne nahaja znotraj drugega kroga,
se krožnice med seboj ne sekajo.
Naloge se loti tako, da si naključno izmišljaš koordinate središča in
polmere. Če je središče kroga znotraj katerega od že narisanih krogov
(te si boš moral očitno zapomniti), si izmisliš novo središče. Če
pa ugotoviš, da bi se krožnica sekala s katero od obstoječih krožnic,
zmanjšaj polmer kroga za toliko, da se bosta krožnici ravno dotikali.
import risar
from random import *
from math import *
krogi = []
for i in range(1000):
while True:
x = randint(0, risar.maxX)
y = randint(0, risar.maxY)
r = randint(50, 80)
for xx, yy, rr in krogi:
dist = sqrt((xx - x)**2 + (yy - y)**2)
r = min(r, dist - rr)
if dist <= rr:
break
else:
krogi.append((x, y, r))
risar.krog(x, y, r)
break
risar.stoj()
Gore
Napiši program, ki ustvari naključno gorato pokrajno.
Nalog se lahko lotiš po svoje, lahko pa uporabiš eleganten
rekurzivni algoritem:
Začni z vodoravno daljico čez celo platno.
Poišči točko na sredini in jo dvigni ali spusti za naključno število
pikslov.
Postopek rekurzivno ponovi na levi in desni daljici. Interval znotraj
katerega izbiraš odmik sredinske točke pa zmanjšaj na polovico. Če si
za odmik prve sredinski točke izbiral med števili iz intervala [-200,
200], boš za novi sredinski točki interval skrčil na [-100, 100].
Po štirih iteracijah lahko pričakuješ nekaj takega: