Razmetane krožnice

Napiši program, ki nariše nekaj naključno postavljenih krožnic, tako kot je prikazano na sliki:

krogi

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.

Krogi

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.

krogi_crte

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.

Krogi

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.

Krogi

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.

Krogi

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.

gora

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

Začni z vodoravno daljico čez celo platno.

gora0

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

gora1

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

gora2

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

gora4

import risar from random import randint 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 + 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()
Última modificación: miércoles, 10 de mayo de 2023, 11:41