Naloge

Testov ta teden ne bo.

Razmetane krožnice

Napišite program, ki nariše 50 naključno postavljenih krožnic, kot prikazuje slika:

ilustracija

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.

ilustracija

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.

ilustracija

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.

ilustracija

Rešitev

Najprej je treba poiskati središča manjših krogov

ilustracija

nato pa izračunati njihov radij

ilustracija

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.

ilustracija

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.

ilustracija

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.

ilustracija

Nalog se lahko lotiš po svoje, lahko pa uporabiš eleganten rekurzivni algoritem:

Začni z vodoravno daljico čez celo platno.

ilustracija

Poišči točko na sredini in jo dvigni ali spusti za naključno število pikslov.

ilustracija

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].

ilustracija

Po štirih iteracijah lahko pričakuješ nakaj takega:

ilustracija

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

Last modified: Monday, 4 January 2021, 12:23 PM