0. Priprava

  • Da boste lahko reševali naloge, si morate namestiti PyQt. Če se kaj zaplete, pišite, pošljite kako sliko zaslona, pa bomo poskusili pomagati.
  • Poleg tega si morate pobrati modul risar in ga skopirati v direktorij, v katerem boste imeli svoje programe.
  • Napišite program
import risar
risar.stoj()

Pojaviti se mora prazno okno z naslovom Janezovo zasilno platno. Program se "konča", ko zaprete to okno.

1. Črte

Tole je za spoznavanje modula risar. Ogrevanje; potrebovali boste le zanke.

Risar ima med drugim funkcije

  • risar.crta(x0, y0, x1, y1, sirina=1, barva=risar.bela), ki nariše črto med podanima koordinatama. Argumenta sirina in barva lahko izpustimo.
  • risar.nakljucne_koordinate() vrne naključne koordinate (x, y) znotraj okna.
  • risar.nakljucna_barva() vrne naključno barvo, ki jo lahko uporabite za argument barva.
  • risar.stoj() ustavi izvajanje programa (poklicati ga je potrebno na koncu programa, sicer se okno takoj zapre).

Napišite program, ki nariše 100 črt naključnih barv in naključne širine med 2 in 20 (uporabite lahko random.randint) med naključnimi koordinatami.

2. Besede

Vaja iz zanke in spremenljivk.

Risar ima tudi funkcijo - risar.besedilo(x, y, s, pisava="Arial", velikost=20, barva=risar.bela), ki na podanih koordinatah s podano barvo izpiše podano besedilo.

Ima tudi konstanti

  • risar.maxX in risar.maxY, ki vrneta širino in višino okna v enakih enotah, kot so koordinate, ki jih podajamo funkcijam, kot sta crta in besedilo.

Datoteka krst-zacetek.txt vsebuje začetek pesnitve nekega prešernega pesnika. Preberite vse besede in jih izpišite z naključnimi barvami in velikostmi na naključnih koordinatah. (Nasvet: namesto nakljucne_koordinate uporabite randint in jih odmaknite za 50 točk od spodnjega roba, od desnega pa za 30-kratnik števila črk.)

Glavni izziv bo razbiranje besed. Tistim, ki to znajo narediti z regularnimi izrazi predlagam, da vseeno poskusijo brez.

Al' nek znak c je črka ali ločilo,
pove nam c.isalpha().

3. Oblak besed (no, bolj roj)

Tule bomo malo ponavljali slovarje in urejanje.

V krst-celoten.txt najdete celotno pesnitev, od Valjuna, ki bije krvavi boj, do Bogomila, ki vrne se k očeti in Črtomira ne vidi več na sveti.

Storite podobno kot v prejšnji nalogi, vendar - izpustite besede, krajše od štirih črk, - vsako besedo izpišite le enkrat, - velikost pisave naj bo enaka osemkratniku številu pojavitev besede, - besede izpisujte od redkejših proti pogostejšim.

Nasvet: spoprijateljite s tipom po imenu collections.Counter.

4. Mehurčki

Zdaj pa vaja iz seznamov in zank z malo bolj zanimivimi pogoji.

Risar ima tudi funkcijo

  • risar.krog(x, y, r, sirina=1, barva=bela), ki nariše krog s središčem v (x, y) in polmerom r.

Narišite tisoč krogov s širino črte 3. Postopek naj bo takšen. Za vsak krog si izberete naključne koordinate, ki ne ležijo znotraj nobenega od obstoječih krogov. Nato si izberite naključen polmer med 10 in 50, ki ga potem po potrebi še zmanjšajte, tako da ta krog ne bo sekal nobenega od že narisanih krogov.

Matematika: dva kroga se sekata, če je razdalja med njima, $\sqrt{(x_0 - x_1)^2 + (y_0 - y_1)^2}$ manjša od vsote njunih polmerov. Torej mora biti polmer drugega kroga, $r_1$ manjši od $\sqrt{(x_0 - x_1)^2 + (y_0 - y_1)^2} - r_0$.

5. Pokanje mehurčkov

Zdaj pa se bomo spomnili, kako brisati stvari iz seznamov. Ker mehurčki, realno, pokajo.

Risarjeve funkcije vračajo rezultate. risar.krog vrne objekt, ki predstavlja krog, zato ga boste v tej nalogi najbrž poklicali s krog = risar.krog(x, y, r, sirina=3) in ga shranili v seznam, v katerem že zdaj beležite x, y in r.

Risar ima tudi funkcijo

  • risar.odstrani(element), ki odstrani podani element (recimo krog).

Na osnovi prejšnjega programa napiši novega, ki deluje tako, da si izbere koordinate in polmer kroga (med 10 in 30). Če novi krog seka katerega od obstoječih, obstoječi krogi počijo.

6. Trikotniki v trikotniku. Večkrat.

Smo razpoloženi za malo rekurzije?

Potem bomo vsekakor narisali trikotnik z oglišči v (10, 475), (537, 475) in (271, 10). Vanj bomo vrisali trikotnik. Nato bomo v vsakega od zunanjih treh trikotnikov vrisali nov trikotnik. To bomo ponavljali, dokler stranice ne bodo manjše od 30. Takšnih ne delimo več.

To poznamo pod imenom trikotnik Sierpinskega.

Da ne bi kdo obupal zaradi matematike: koordinati središča daljice so pač na sredi med krajiščema. Manj učeno: če je imamo stranico trikotnika, ki gre od $(x_a, y_a)$ do $(x_b, y_b)$, je središče te stranice v $(x_a + x_b) / 2, (y_a + y_b) / 2$.

Kako pa boste vedeli, ali ima trikotnik stranice krajše od 30? Preprosto: ena stranica je vedno vodoravna. Izračunajte razliko med njenima koordinatama $x$.

Posnetek na desni je upočasnjen, da je postopek očitnejši.

7. Štirje krogi

Smo razpoloženi za še malo rekurzije?

V tem primeru v sredino platna narišimo krog s polmerom risar.maxY / 2 - 10. Vanj vrišemo štiri kroge, kot kaže slika. V vsakega od njih vrišemo štiri kroge ... in tako naprej do globine 5.

Pri tem vas bo neizbežno zanimalo, kakšne so koordinate središča notranjega kroga in njegov polmer. Seveda vas vabim, da to doženete same, kdor raje ne bi, pa lahko pogleda odpre spodnji kvarnik.

Kvarnik: Izračun polmera in koordinat središča vrisanega kroga R d r r r r Naj bo $R$ polmer zunanjega kroga in $r$ polmer včrtanega (torej: vsakega od štirih včrtanih). $r$ smo narisali na par mest; tisti trije v krogu so očitno polmer kroga, oni spodaj pa tudi, saj je vzporeden onemu zgoraj. $d$ je diagonala kvadrata s stranico $r$ in matematika nas uči, da je $d = r\sqrt{2}$. Slika pa nas pouči, da je $R=d + r$. Torej $R=d + r=r\sqrt{2} + r=r(\sqrt{2} + 1)$. Mi imamo $R$, izračunati želimo $r$. Za to bi morali deliti obe strani s $\sqrt{2} + 1$, jaz pa sem zvit človek in ju raje pomnožim z $\sqrt{2} - 1$ (kar je isto :)). $R(\sqrt{2} - 1)=r(\sqrt{2} + 1)(\sqrt{2} - 1)=r(2 - 1)=r$. Pa preberemo z desne proti levi: $r = R(\sqrt{2} - 1)$. Zdaj imamo polmer včrtanega kroga, vidimo pa tudi, kje je njegovo središče: točno za polmer desno/levo višje/nižje od središča zunanjega kroga.

8. Spirala

Tule pa jaz programiram, vi pa izbrskate nekaj novega o Pythonu in ponovite nekaj, kar boste tako ali tako potrebovali pri izpitu iz matematike.

Zakaj spodnji program nariše sliko na desni?

import risar

cx, cy = risar.maxX / 2, risar.maxY / 2
x0 = 1 + 0j
while abs(x0) < cy:
    x1 = x0 * (1 + 0.05j)
    risar.crta(cx + x0.real, cy + x0.imag, cx + x1.real, cy + x1.imag, sirina=3)
    x0 = x1

risar.stoj()
Zadnja sprememba: sobota, 27. december 2025, 11.06