Naloge
Testov ta teden ne bo.
Razmetane krožnice
Napišite program, ki nariše 50 naključno postavljenih krožnic, kot prikazuje slika:
Rešitev
import risar
import random
for i in range(50):
x, y = risar.nakljucne_koordinate()
r = random.randint(20, 60)
barva = risar.nakljucna_barva()
risar.krog(x, y, r, barva)
risar.stoj()
Poveži s prvo
Podobno kot prej, hkrati pa povežite še središče prve krožnice s središči vseh ostalih krožnic.
Rešitev
import random
import risar
for i in range(20):
x, y = risar.nakljucne_koordinate()
r = random.randint(20, 60)
barva = risar.nakljucna_barva()
risar.krog(x, y, r, barva)
if i == 0:
x0, y0 = x, y
else:
risar.crta(x, y, x0, y0, barva)
risar.stoj()
Vse povezano
Sedaj pa s črtami povežite središča vseh krožnic.
Rešitev
import random
import risar
krogi = []
for i in range(20):
x, y = risar.nakljucne_koordinate()
r = random.randint(20, 60)
barva = risar.nakljucna_barva()
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 naključno posujete po risalni površini, jih raje enakomerno razporedite po krožnici. Definirajte polmer krožnice in število krogov, nato pa iz tega izračunajte središča krogov in njihov polmer.
Rešitev
Najprej je treba poiskati središča manjših krogov ![ilustracija](https://ucilnica.fri.uni-lj.si/file.php/166/vaje/lokacija_kroga.png "Središča krogov") nato pa izračunati njihov radij ![ilustracija](https://ucilnica.fri.uni-lj.si/file.php/166/vaje/mali_radij.png "Radij")import math
import risar
n = 20 # Število manjših krogov
R = 200 # Radij velikega kroga
x0, y0 = risar.maxX / 2, risar.maxY / 2 # Središče velikega kroga
for i in range(n):
phi = 2 * math.pi / n
x = x0 + R * math.cos(phi * i)
y = y0 + R * math.sin(phi * i)
barva = risar.nakljucna_barva()
r = math.sin(phi / 2) * R
risar.krog(x, y, r, barva)
risar.stoj()
in jih, tako kot prej, povežite z daljicami.
Rešitev
import math
import risar
n = 20 # Število manjših krogov
R = 200 # Radij velikega kroga
x0, y0 = risar.maxX / 2, risar.maxY / 2 # Središče velikega kroga
krogi = []
for i in range(n):
phi = 2 * math.pi / n
x = x0 + R * math.cos(phi * i)
y = y0 + R * math.sin(phi * i)
barva = risar.nakljucna_barva()
r = math.sin(phi / 2) * R
risar.krog(x, y, r, barva)
for xx, yy in krogi:
risar.crta(x, y, xx, yy, barva)
krogi.append((x, y))
risar.stoj()
Nesekajoči se krogi
Napišite 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 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.
Rešitev
import math
import random
import risar
krogi = []
while len(krogi) < 1000:
x, y = risar.nakljucne_koordinate()
r = random.randint(20, 80)
for xx, yy, rr in krogi:
dist = math.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)
risar.stoj()
Gore
Napiši program, ki ustvari naključno gorato pokrajino.
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š nakaj takega:
Rešitev
import random
import risar
def gore(x0, y0, x2, y2, globina):
if globina == 0:
risar.crta(x0, y0, x2, y2)
else:
odmik = (x2 - x0) // 4
x1 = (x0 + x2) / 2
y1 = (y0 + y2) / 2 + random.randint(-odmik, odmik)
gore(x0, y0, x1, y1, globina - 1)
gore(x1, y1, x2, y2, globina - 1)
gore(0, risar.maxY / 2, risar.maxX, risar.maxY / 2, 10)
risar.stoj()