Compare commits

...

3 Commits

Author SHA1 Message Date
ef3f201bf0 Up to CMAKE 2026-05-26 15:41:57 +02:00
cdd6ff688d fix caption spacing 2026-05-26 15:12:08 +02:00
32b3899bff Naslovi 2026-05-26 15:02:16 +02:00

View File

@@ -47,7 +47,7 @@
#set math.equation(supplement: "Enačba") #set math.equation(supplement: "Enačba")
#let avthor = "Nikola Petrov" #let avthor = "Nikola Petrov"
#let mentor = "red. prof. dr. Aleš Holobar" #let mentor = "red. prof. dr. Alešu Holobarju"
#let naslov = upper("Uporabniško vodena evolucija fraktalnih dreves") #let naslov = upper("Uporabniško vodena evolucija fraktalnih dreves")
#let naslov_en = upper("User-guided evolution of fractal trees") #let naslov_en = upper("User-guided evolution of fractal trees")
@@ -195,17 +195,17 @@ IZJAVA O AVTORSTVU ZAKLJUČNEGA DELA
= UVOD = UVOD
V današnjem digitalnem svetu je interaktivnost in prilagodljivost ključnega pomena za ustvarjanje uporabniških izkušenj, ki so tako zabavne kot tudi funkcionalne. Fraktalna drevesa, kot matematična in umetniška oblika, ponujajo neskončno raznolikost struktur, ki jih je mogoče uporabiti v raznovrstnih aplikacijah, od vizualnih umetnosti do simulacij naravnih procesov. V tem kontekstu se pojavi vprašanje: *Kako lahko uporabniki aktivno vplivajo na razvoj in oblikovanje teh struktur?* V današnjem digitalnem svetu sta interaktivnost in prilagodljivost ključnega pomena za ustvarjanje uporabniških izkušenj, ki so tako zabavne kot tudi funkcionalne. Fraktalna drevesa kot matematična in umetniška oblika ponujajo neskončno raznolikost struktur, ki jih je mogoče uporabiti v raznovrstnih aplikacijah, od vizualnih umetnosti do simulacij naravnih procesov. V tem kontekstu se pojavi vprašanje: *kako lahko uporabniki aktivno vplivajo na razvoj in oblikovanje teh struktur?*
Ta diploma se osredotoča na razvoj aplikacije *Treender*, ki uporabnikom omogoča interaktivno vodenje evolucije fraktalnih dreves. S pomočjo algoritmov za genetsko evolucijo in uporabniških ocen aplikacija ustvarja in prilagaja fraktalna drevesa, ki odražajo individualne okuse in preference uporabnikov. Ta diploma se osredotoča na razvoj aplikacije *Treender*, ki uporabnikom omogoča interaktivno vodenje evolucije fraktalnih dreves. S pomočjo algoritmov za genetsko evolucijo in uporabniških ocen aplikacija ustvarja in prilagaja fraktalna drevesa, ki odražajo individualne okuse in preference uporabnikov.
Cilj projekta je raziskati, kako lahko algoritmi za evolucijo in z uporabniško povratno informacijo ustvarimo dinamične in osebne izkušnje. Cilj projekta je raziskati, kako lahko z algoritmi za evolucijo in uporabniško povratno informacijo ustvarimo dinamične in osebne izkušnje.
V nadaljevanju bomo predstavili osnovne koncepte za generiranje in evolucijo fraktalnih dreves, opisali strukturo aplikacije in podrobno razložili uporabljene algoritme. Prav tako bomo raziskali uporabniški vmesnik in proces objave aplikacije na Google Play Store. Na koncu bomo oceni uporabniško izkušnjo in učinkovitost algoritmov, ki jih uporabljamo. V nadaljevanju bomo predstavili osnovne koncepte za generiranje in evolucijo fraktalnih dreves, opisali strukturo aplikacije in podrobno razložili uporabljene algoritme. Prav tako bomo raziskali uporabniški vmesnik in proces objave aplikacije na Google Play Store. Na koncu bomo ocenili uporabniško izkušnjo in učinkovitost algoritmov, ki jih uporabljamo.
#pagebreak() #pagebreak()
= OPIS APLIKACIJE = OPIS APLIKACIJE
Treender je aplikacije, ki nam omogoča, da izbiramo in ocenjujemo fraktalna drevesa, ki se na podlagi naših ocen evoluirajo in prilagajajo našim okusom. V desnem zgornjem kotu nam prikaže všečnost, na dnu nam pa prikaže generacijo evolucije in kateri vzorec se prikazuje (@aplikacija-slika-def). Če povlečemo po zaslonu levo se nam v zgornjem levem kotu prikaže napis "DISLIKE" (@aplikacija-slika-dislike) v desno pa se nam prikaže napis "LIKE" (@aplikacija-slika-like). Treender je aplikacija, ki nam omogoča, da izbiramo in ocenjujemo fraktalna drevesa, ki se na podlagi naših ocen razvijajo in prilagajajo našim okusom. V desnem zgornjem kotu nam prikaže všečnost, na dnu nam pa prikaže generacijo evolucije in kateri vzorec se prikazuje (@aplikacija-slika-def). Če povlečemo po zaslonu levo se nam v zgornjem levem kotu prikaže napis "DISLIKE" (@aplikacija-slika-dislike), v desno pa se nam prikaže napis "LIKE" (@aplikacija-slika-like).
#grid( #grid(
columns: 3, columns: 3,
@@ -213,30 +213,24 @@ Treender je aplikacije, ki nam omogoča, da izbiramo in ocenjujemo fraktalna dre
[ [
#figure( #figure(
image("assets/rand/capture_show_noraml.jpg"), image("assets/rand/capture_show_noraml.jpg"),
caption: [ caption: [Primer aplikacije],
Primer aplikacije
],
)<aplikacija-slika-def> )<aplikacija-slika-def>
], ],
[ [
#figure( #figure(
image("assets/rand/capture_show_liked.jpg"), image("assets/rand/capture_show_liked.jpg"),
caption: [ caption: [Primer aplikacije like],
Primer aplikacije like
],
)<aplikacija-slika-like> )<aplikacija-slika-like>
], ],
[ [
#figure( #figure(
image("assets/rand/capture_show_dislike.jpg"), image("assets/rand/capture_show_dislike.jpg"),
caption: [ caption: [Primer aplikacije dislike],
Primer aplikacije dislike
],
)<aplikacija-slika-dislike> )<aplikacija-slika-dislike>
], ],
) )
Ko vzorec ocenimo si aplikacija zapomni in nato, ko ocenimo vse vzorce se nam prikaže črna slika z napisom "new generation". V tem trenutku se glede na ocenitve ustvari nova generacija in izračuna všečnost. Ko vzorec ocenimo, si aplikacija zapomni, in ko ocenimo vse vzorce, se nam prikaže črna slika z napisom "new generation". V tem trenutku se glede na ocenitve ustvari nova generacija in izračuna všečnost.
#pagebreak() #pagebreak()
@@ -244,13 +238,13 @@ Ko vzorec ocenimo si aplikacija zapomni in nato, ko ocenimo vse vzorce se nam pr
= UPORABLJENE TEHNOLOGIJE = UPORABLJENE TEHNOLOGIJE
== C++ == C++
C++ je visokonivojni programski jezik, ki je nastal kot razširitev jezika C. Razvil ga je Bjarne Stroustrup v zgodnjih 1980-ih letih z namenom, da združi moč in učinkovitost jezika C z objektno-usmerjenimi koncepti, ki podpirajo boljšo organizacijo in ponovno uporabo kode @wiki_cpp. C++ je visokonivojni programski jezik, ki je nastal kot razširitev jezika C. Razvil ga je Bjarne Stroustrup v zgodnjih 1980. letih z namenom, da združi moč in učinkovitost jezika C z objektno usmerjenimi koncepti, ki podpirajo boljšo organizacijo in ponovno uporabo kode @wiki_cpp.
=== Glavne značilnosti C++: === Glavne značilnosti C++:
1. *Objektno-usmerjeno programiranje (OOP)*: C++ podpira objektno-usmerjeno programiranje, kar omogoča uporabo razredov in objektov za modeliranje realnih svetovnih problemov. To olajša organizacijo kode in omogoča ponovno uporabo kode. 1. *Objektno usmerjeno programiranje (OOP)*: C++ podpira objektno usmerjeno programiranje, kar omogoča uporabo razredov in objektov za modeliranje realnih svetovnih problemov. To olajša organizacijo kode in omogoča ponovno uporabo kode.
2. *Učinkovitost*: C++ je znan po svoji visoki učinkovitosti in hitrosti izvajanja, kar ga naredi primerno za razvoj aplikacij, ki zahtevajo visoko zmogljivost, kot so igre, sistemsko programiranje in razvoj vgrajenih sistemov. 2. *Učinkovitost*: C++ je znan po svoji visoki učinkovitosti in hitrosti izvajanja, kar ga naredi primernega za razvoj aplikacij, ki zahtevajo visoko zmogljivost, kot so igre, sistemsko programiranje in razvoj vgrajenih sistemov.
3. *Nizkonivojni dostop*: C++ omogoča dostop do spomina in drugih sistemskih virov na nizki ravni, kar omogoča večjo kontrolo nad strojno opremo. To je posebno koristno v sistemskem programiranju in razvoju vgrajenih sistemov. 3. *Nizkonivojni dostop*: C++ omogoča dostop do spomina in drugih sistemskih virov na nizki ravni, kar omogoča večjo kontrolo nad strojno opremo. To je posebno koristno v sistemskem programiranju in razvoju vgrajenih sistemov.
@@ -260,7 +254,7 @@ C++ je visokonivojni programski jezik, ki je nastal kot razširitev jezika C. Ra
=== Uporaba C++: === Uporaba C++:
- *Razvoj iger*: Zaradi svoje visoke učinkovitosti in možnosti za nizkonivojni dostop je C++ priljubljen jezik za razvoj iger. - *Razvoj iger*: Zaradi svoje visoke učinkovitosti in možnosti za nizkonivojni dostop je \ C++ priljubljen jezik za razvoj iger.
- *Sistemsko programiranje*: Uporablja se za razvoj operacijskih sistemov, gonilnikov in drugih sistemskih programov. - *Sistemsko programiranje*: Uporablja se za razvoj operacijskih sistemov, gonilnikov in drugih sistemskih programov.
- *Vgrajeni sistemi*: Zaradi svoje učinkovitosti in možnosti za nizkonivojni dostop je C++ priljubljen za razvoj vgrajenih sistemov. - *Vgrajeni sistemi*: Zaradi svoje učinkovitosti in možnosti za nizkonivojni dostop je C++ priljubljen za razvoj vgrajenih sistemov.
- *Računalniška grafika*: Uporablja se za razvoj grafičnih aplikacij in orodij za obdelavo slik. - *Računalniška grafika*: Uporablja se za razvoj grafičnih aplikacij in orodij za obdelavo slik.
@@ -277,7 +271,7 @@ Raylib je odprtokodna knjižnica, namenjena predvsem razvoju iger in multimedijs
2. *Podpora za 2D in 3D grafiko*: Raylib podpira tako 2D kot 3D grafiko, kar omogoča razvoj različnih vrst iger in aplikacij. 2. *Podpora za 2D in 3D grafiko*: Raylib podpira tako 2D kot 3D grafiko, kar omogoča razvoj različnih vrst iger in aplikacij.
3. *Vhodne naprave*: Podpira različne vhodne naprave, kot so tipkovnica, miška, igralni nadzorniki in dotikalni zasloni. 3. *Vhodne naprave*: Podpira različne vhodne naprave, kot so tipkovnica, miška, igralni nadzorniki in zaslon na dotik.
4. *Zvok*: Vključuje osnovno podporo za predvajanje zvoka in glasbe, kar je pomembno za razvoj iger. 4. *Zvok*: Vključuje osnovno podporo za predvajanje zvoka in glasbe, kar je pomembno za razvoj iger.
@@ -295,7 +289,7 @@ Raylib je zaradi svoje preprostosti in zmogljivosti priljubljen izbir za razvija
#pagebreak() #pagebreak()
== ImGui == ImGui
Dear ImGui (ali preprosto ImGui) je odprtokodna knjižnica uporabniškega vmesnika, ki omogoča hitro in enostavno ustvarjanje uporabniških vmesnikov za aplikacije v realnem času. Zasnovana je za razvijalce, ki potrebujejo preprost in učinkovit način za dodajanje uporabniških vmesnikov v svoje aplikacije, predvsem v igrah, orodjih in drugih interaktivnih programih @git_imgui @git_rlImgui. Dear ImGui (ali preprosto ImGui) je odprtokodna knjižnica, ki omogoča hitro in enostavno ustvarjanje uporabniških vmesnikov za aplikacije v realnem času. Zasnovana je za razvijalce, ki potrebujejo preprost in učinkovit način za dodajanje uporabniških vmesnikov v svoje aplikacije, predvsem v igrah, orodjih in drugih interaktivnih programih @git_imgui @git_rlImgui.
=== Glavne značilnosti ImGui: === Glavne značilnosti ImGui:
@@ -315,23 +309,23 @@ Dear ImGui (ali preprosto ImGui) je odprtokodna knjižnica uporabniškega vmesni
- *Interaktivna orodja*: Uporablja se za razvoj različnih interaktivnih orodij, kot so simulacije, vizualizacije podatkov in druge aplikacije, ki zahtevajo uporabniški vmesnik. - *Interaktivna orodja*: Uporablja se za razvoj različnih interaktivnih orodij, kot so simulacije, vizualizacije podatkov in druge aplikacije, ki zahtevajo uporabniški vmesnik.
- *Prototipiranje*: Zaradi svoje enostavnosti in hitrosti je ImGui priljubljen za prototipiranje uporabniških vmesnikov. - *Prototipiranje*: Zaradi svoje enostavnosti in hitrosti je ImGui priljubljen za prototipiranje uporabniških vmesnikov.
ImGui je zaradi svoje preprostosti, učinkovitosti in fleksibilnosti priljubljen izbir za razvijalce, ki potrebujejo hitro in enostavno rešitev za ustvarjanje uporabniških vmesnikov v svojih aplikacij ImGui je zaradi svoje preprostosti, učinkovitosti in fleksibilnosti priljubljena izbira za razvijalce, ki potrebujejo hitro in enostavno rešitev za ustvarjanje uporabniških vmesnikov v svojih aplikacijah
#pagebreak() #pagebreak()
== CMAKE == CMAKE
*CMake* je orodje za avtomatizacijo gradnje (build automation tool), ki je zasnovano za upravljanje procesa prevajanja, sestavljanja in paketiranja programske kode, zlasti v večplatformskih okoljih. Razvil ga je Kitware leta 2000, da bi olajšal proces gradnje programov, ki so napisani v različnih programskih jezikih, kot so C, C++, Fortran in drugi @web_cmake @wiki_cmake. *CMake* je orodje za avtomatizacijo gradnje (build automation tool), ki je zasnovano za upravljanje procesa prevajanja, sestavljanja in paketiranja programske kode zlasti v večplatformskih okoljih. Razvil ga je Kitware leta 2000, da bi olajšal proces gradnje programov, ki so napisani v različnih programskih jezikih, kot so C, C++, Fortran in drugi @web_cmake @wiki_cmake.
=== Glavne značilnosti CMake: === Glavne značilnosti CMake:
1. *Večplatformska podpora* CMake omogoča generiranje gradbenih datotek (npr. Makefile za Unix/Linux, projektne datoteke za Visual Studio na Windowsu, Xcode na macOS) za različne operacijske sisteme in razvojna okolja. To pomeni, da lahko isti izvorni kod prevajate in sestavljate na različnih platformah brez spreminjanja gradbenih skript. 1. *Večplatformska podpora:* CMake omogoča generiranje gradbenih datotek (npr. Makefile za Unix/Linux, projektne datoteke za Visual Studio na Windowsu, Xcode na macOS) za različne operacijske sisteme in razvojna okolja. To pomeni, da lahko isto izvorno kodo prevajamo in sestavljamo na različnih platformah brez spreminjanja gradbenih skript.
2. *Konfiguracijske datoteke (CMakeLists.txt)* CMake uporablja tekstovne datoteke z imenom `CMakeLists.txt`, ki vsebujejo navodila za konfiguracijo projekta. Te datoteke opisujejo, kako naj se projekt sestavi: kateri viri (source files) so vključeni, katere knjižnice so potrebne, in kakšne so odvisnosti med posameznimi komponentami. 2. *Konfiguracijske datoteke (CMakeLists.txt):* CMake uporablja tekstovne datoteke z imenom `CMakeLists.txt`, ki vsebujejo navodila za konfiguracijo projekta. Te datoteke opisujejo, kako naj se projekt sestavi: kateri viri (source files) so vključeni, katere knjižnice so potrebne in kakšne so odvisnosti med posameznimi komponentami.
3. *Upravljanje odvisnosti* CMake omogoča enostavno upravljanje odvisnosti med knjižnicami in programi. Podpira iskanje in povezovanje z zunanjimi knjižnicami (npr. OpenCV, Boost) in omogoča definicijo lastnih ciljev (targets), kot so izvršljivi programi ali knjižnice. 3. *Upravljanje odvisnosti:* CMake omogoča enostavno upravljanje odvisnosti med knjižnicami in programi. Podpira iskanje in povezovanje z zunanjimi knjižnicami (npr. OpenCV, Boost) in omogoča definicijo lastnih ciljev (targets), kot so izvršljivi programi ali knjižnice.
4. *Podpora za različne prevajalnike* CMake deluje z različnimi prevajalniki (npr. GCC, Clang, MSVC) in omogoča uporabo specifičnih nastavitev za vsakega od njih. 4. *Podpora za različne prevajalnike:* CMake deluje z različnimi prevajalniki (npr. GCC, Clang, MSVC) in omogoča uporabo specifičnih nastavitev za vsakega od njih.
5. *Modularnost in ponovno uporabo kode* CMake podpira modularno strukturo projektov, kar olajša ponovno uporabo kode in deljenje knjižnic med različnimi projekti. 5. *Modularnost in ponovna uporaba kode:* CMake podpira modularno strukturo projektov, kar olajša ponovno uporabo kode in deljenje knjižnic med različnimi projekti.
=== Kako CMake deluje? === Kako CMake deluje?
@@ -341,8 +335,8 @@ ImGui je zaradi svoje preprostosti, učinkovitosti in fleksibilnosti priljubljen
=== Tipična uporaba CMake: === Tipična uporaba CMake:
- *Razvoj programske opreme v C/C++:* CMake je standardno orodje za gradnjo projektov v C in C++, zlasti v večjih ali kompleksnih projektih. - *Razvoj programske opreme v C/C++:* CMake je standardno orodje za gradnjo projektov v C in C++ zlasti v večjih ali kompleksnih projektih.
- *Večplatformski projekti:* Če razvijate programsko opremo, ki mora delovati na več platformah (Windows, Linux, macOS), je CMake idealno orodje za upravljanje gradnje. - *Večplatformski projekti:* Če razvijamo programsko opremo, ki mora delovati na več platformah (Windows, Linux, macOS), je CMake idealno orodje za upravljanje gradnje.
- *Integracija z drugimi orodji:* CMake se lahko integrira z orodji za testiranje (npr. CTest), paketiranje (npr. CPack) in dokumentacijo. - *Integracija z drugimi orodji:* CMake se lahko integrira z orodji za testiranje (npr. CTest), paketiranje (npr. CPack) in dokumentacijo.
@@ -357,7 +351,7 @@ add_executable(moj_program main.cpp)
``` ```
Ta datoteka določa, da je minimalna potrebna različica CMake 3.10, da je ime projekta "MojProjekt" in da naj se iz datoteke `main.cpp` generira izvršljivi program z imenom `moj_program`. Ta datoteka določa, da je minimalna potrebna različica CMake 3.10, da je ime projekta "MojProjekt" in da naj se iz datoteke `main.cpp` generira izvršljivi program z imenom `moj_program`.
CMake je močno orodje, ki olajša in avtomatizira proces gradnje programske opreme, zlasti v večplatformskih okoljih. Njegova glavna prednost je fleksibilnost in možnost generiranja gradbenih datotek za različne sisteme, kar ga naredi nezaobhodljivega pri razvoju v C in C++. Ali te zanima kakšen specifičen vidik CMake ali primer uporabe? CMake je močno orodje, ki olajša in avtomatizira proces gradnje programske opreme zlasti v večplatformskih okoljih. Njegova glavna prednost je fleksibilnost in možnost generiranja gradbenih datotek za različne sisteme, kar ga naredi nezaobhodljivega pri razvoju v C in C++.
#pagebreak() #pagebreak()
== SQLITE3 == SQLITE3
@@ -407,14 +401,12 @@ Jedro je hrbtenica, ki povezuje vse komponente, ob zagonu preračuna razmerja za
#figure( #figure(
image("assets/potek_diagram/diagram.svg", height: 400pt), image("assets/potek_diagram/diagram.svg", height: 400pt),
caption: [ caption: [Diagram poteka podatkov],
Diagram poteka podatkov
],
) )
#pagebreak() #pagebreak()
== UPORABNIŠKI VMESNIK ROTACIJA SLIKE == UPORABNIŠKI VMESNIK - ROTACIJA SLIKE
Proces rotiranja slike glede na premik miške, je sestavljen iz treh korakov Proces rotiranja slike glede na premik miške, je sestavljen iz treh korakov
in uporabo trigometrije in uporabo trigometrije
@@ -438,17 +430,13 @@ $
[ [
#figure( #figure(
image("assets/rand/cordinats_show_mouse_picture.jpg"), image("assets/rand/cordinats_show_mouse_picture.jpg"),
caption: [ caption: [Prikaz vektorjev za premik slike],
Prikaz vektorjev za premik slike
],
)<Prikaz_vektorjev> )<Prikaz_vektorjev>
], ],
[ [
#figure( #figure(
image("assets/rand/show_mouse_movement.jpg"), image("assets/rand/show_mouse_movement.jpg"),
caption: [ caption: [Prikaz delta razdalje],
Prikaz delta razdalje
],
)<Prikaz_razdalje> )<Prikaz_razdalje>
], ],
) )
@@ -542,7 +530,7 @@ Funkcija #like sprejme indeks in liked in nato shrani index v vector liked ali d
Medtem funkcija #newGen vsebuje glavno logiko. Deluje na principu naravne evolucije naključno izbere dva DNA in ustvari otroka tako da naključno kopira DNA od obeh staršev, da ima v povprečju 50% DNA od enega starša in 50% od drugega starša. Ko ustvari novo generacijo celotno generacijo mutira tako da naključno spremeni specificirano število genov(byte). Tukaj lahko upazimo robni primer kaj če imamo samo en ali nič DNA-jev ki so uporabniku všeč, v primeru da kloniramo dokler ne ustvarimo novo generacijo in v primeru ko uporabniku ni noben všeč generiramo novo naključno generacijo. Medtem funkcija #newGen vsebuje glavno logiko. Deluje na principu naravne evolucije naključno izbere dva DNA in ustvari otroka tako da naključno kopira DNA od obeh staršev, da ima v povprečju 50% DNA od enega starša in 50% od drugega starša. Ko ustvari novo generacijo celotno generacijo mutira tako da naključno spremeni specificirano število genov(byte). Tukaj lahko upazimo robni primer kaj če imamo samo en ali nič DNA-jev ki so uporabniku všeč, v primeru da kloniramo dokler ne ustvarimo novo generacijo in v primeru ko uporabniku ni noben všeč generiramo novo naključno generacijo.
#figure(caption: "DnaManager")[ #figure(caption: [DnaManager])[
#grid( #grid(
columns: 2, columns: 2,
[ [
@@ -593,7 +581,7 @@ Medtem funkcija #newGen vsebuje glavno logiko. Deluje na principu naravne evoluc
== DNA == DNA
Dna je sestavljen iz dveh struktur, (@dna_objekt). Zanimljiv del ki ga opazimo je da je vsak gen točno en bite dolg in celoten objekt je v pomnilniku samo en velik list bitov (array of bites). To značinost uporabljamo v complementarnih funkcijah `newDna`, `makeChiled`, `clone` in `mutate`. Dna je sestavljen iz dveh struktur, (@dna_objekt). Zanimljiv del ki ga opazimo je da je vsak gen točno en bite dolg in celoten objekt je v pomnilniku samo en velik list bitov (array of bites). To značinost uporabljamo v complementarnih funkcijah `newDna`, `makeChiled`, `clone` in `mutate`.
#figure(caption: "DNA objekt")[ #figure(caption: [DNA objekt])[
#grid( #grid(
columns: 2, columns: 2,
@@ -682,9 +670,7 @@ Ostale funkcije so podobne najprej pretvorimo v `uint_8*` in nato:
#figure( #figure(
image("assets/rand/slika_drevesa.jpg", height: 200pt), image("assets/rand/slika_drevesa.jpg", height: 200pt),
caption: [ caption: [Končna slika po vizualizaciji],
Končna skika po vizualizaciji
],
) )
Je sestavljena iz treh razredov `Canvas`, `BackGround`, `Tree`(@razredi_vizualizacije). Tukaj Canvas je samo umesni razred ki postavi risanje na teksturo in nato pokliče BackGround in Tree Je sestavljena iz treh razredov `Canvas`, `BackGround`, `Tree`(@razredi_vizualizacije). Tukaj Canvas je samo umesni razred ki postavi risanje na teksturo in nato pokliče BackGround in Tree
@@ -769,75 +755,57 @@ Postopek izrisa ozadja je sestavljen iz 5 korakov
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_1.png", height: 100pt), image("assets/draw_steps/steps_1_1.png", height: 100pt),
caption: [ caption: [Korak nebo],
Korak nebo
],
)<steps_nebo> )<steps_nebo>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_2_2.png", height: 100pt), image("assets/draw_steps/steps_2_2.png", height: 100pt),
caption: [ caption: [Korak nebo],
Korak nebo
],
)<steps_zvezde> )<steps_zvezde>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_2.png", height: 100pt), image("assets/draw_steps/steps_1_2.png", height: 100pt),
caption: [ caption: [Korak sonce],
Korak soce
],
)<steps_sonce> )<steps_sonce>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_3_1.png", height: 100pt), image("assets/draw_steps/steps_1_3_1.png", height: 100pt),
caption: [ caption: [Korak gora 1],
Korak gora 1
],
)<steps_gora_1> )<steps_gora_1>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_3_2.png", height: 100pt), image("assets/draw_steps/steps_1_3_2.png", height: 100pt),
caption: [ caption: [Korak gora 2],
Korak gora 2
],
)<steps_gora_2> )<steps_gora_2>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_3.png", height: 100pt), image("assets/draw_steps/steps_1_3.png", height: 100pt),
caption: [ caption: [Korak gora 3],
Korak gora 3
],
)<steps_gora_3> )<steps_gora_3>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_4.png", height: 100pt), image("assets/draw_steps/steps_1_4.png", height: 100pt),
caption: [ caption: [Korak gora 4],
Korak gora 4
],
)<steps_gora_4> )<steps_gora_4>
], ],
[ [
#figure( #figure(
image("assets/draw_steps/steps_1_5.png", height: 100pt), image("assets/draw_steps/steps_1_5.png", height: 100pt),
caption: [ caption: [Korak gora 5],
Korak gora 5
],
)<steps_gora_5> )<steps_gora_5>
], ],
) )
#figure( #figure(
image("assets/rand/Triangle_Strip.svg.png", height: 150pt), image("assets/rand/Triangle_Strip.svg.png", height: 150pt),
caption: [ caption: [Triangle strip],
Triangle strip
],
)<Triangle_Strip> )<Triangle_Strip>
] ]
@@ -882,7 +850,7 @@ Veja je struktura ki vsebuje podatke o:
// TODO: Dodaj slike za lazjo predstavo // TODO: Dodaj slike za lazjo predstavo
==== Algoritem ==== Algoritem
Začnemo tako, da damo v list @prvi_drawArgs in ponavljamo naslednje postopke dokler imamo nekaj v listi Začnemo tako, da damo v list @prvi_drawArgs in ponavljamo naslednje postopke dokler imamo nekaj v listi
#figure(caption: "Prvi DrawArgs")[ #figure(caption: [Prvi DrawArgs])[
```cpp ```cpp
struct DrawArgs struct DrawArgs
{ {
@@ -993,50 +961,38 @@ Začnemo tako, da damo v list @prvi_drawArgs in ponavljamo naslednje postopke do
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika00.png", height: 100pt), image("assets/vizualizacija_drevo/slika00.png", height: 100pt),
caption: [ caption: [Začetna točka],
Začetna točka
],
)<viztree0> )<viztree0>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika01.png", height: 100pt), image("assets/vizualizacija_drevo/slika01.png", height: 100pt),
caption: [ caption: [Dolžina veje],
Dolžina veje
],
)<viztree1> )<viztree1>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika02.png", height: 100pt), image("assets/vizualizacija_drevo/slika02.png", height: 100pt),
caption: [ caption: [Kot in končna točka],
Kot in končna točka
],
)<viztree2> )<viztree2>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika03.png", height: 100pt), image("assets/vizualizacija_drevo/slika03.png", height: 100pt),
caption: [ caption: [Debeline],
Debeline
],
)<viztree3> )<viztree3>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika04.png", height: 100pt), image("assets/vizualizacija_drevo/slika04.png", height: 100pt),
caption: [ caption: [Barve],
Barve
],
)<viztree4> )<viztree4>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika05.png", height: 100pt), image("assets/vizualizacija_drevo/slika05.png", height: 100pt),
caption: [ caption: [Izris veje],
Izris veje
],
)<viztree5> )<viztree5>
], ],
) )
@@ -1046,17 +1002,13 @@ Začnemo tako, da damo v list @prvi_drawArgs in ponavljamo naslednje postopke do
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika06.png", height: 200pt), image("assets/vizualizacija_drevo/slika06.png", height: 200pt),
caption: [ caption: [Novi otroki],
Novi otriki
],
)<viztree6> )<viztree6>
], ],
[ [
#figure( #figure(
image("assets/vizualizacija_drevo/slika07.png", height: 200pt), image("assets/vizualizacija_drevo/slika07.png", height: 200pt),
caption: [ caption: [Ponovimo],
Ponovimo
],
)<viztree7> )<viztree7>
], ],
) )
@@ -1075,7 +1027,7 @@ Začnemo tako, da damo v list @prvi_drawArgs in ponavljamo naslednje postopke do
Sprava se je drevo izrisalo s pomočjo raylib funkcije `DrawLineEx`, drevo se je izrisevalo vsak okvir(frame). Kasneje smo hoteli dodali veje z spremenljivo debelino, najlažja rešitev ki smo se jo spomnili je bila da narišemo krogce z spremenljivim polmerom. To nas je prisililo da moramo narisati čez 55,000 krogov. Z raylib-ovo funkcijo `DrawCircleV` za risanje krogov, je applikacija začela zaostajati(lagged). To smo rešili tako da najprej drevo narišemo na teksturo, ki je zelo enostavna za izris. To je rešilo večino problemov občasno se je ševedno pojavil zaostanek(lag spoke), ki smo ga rešili tako da smo omejili število risalnih klicov na okvir in drevo narisali v parih okvirih. Sprava se je drevo izrisalo s pomočjo raylib funkcije `DrawLineEx`, drevo se je izrisevalo vsak okvir(frame). Kasneje smo hoteli dodali veje z spremenljivo debelino, najlažja rešitev ki smo se jo spomnili je bila da narišemo krogce z spremenljivim polmerom. To nas je prisililo da moramo narisati čez 55,000 krogov. Z raylib-ovo funkcijo `DrawCircleV` za risanje krogov, je applikacija začela zaostajati(lagged). To smo rešili tako da najprej drevo narišemo na teksturo, ki je zelo enostavna za izris. To je rešilo večino problemov občasno se je ševedno pojavil zaostanek(lag spoke), ki smo ga rešili tako da smo omejili število risalnih klicov na okvir in drevo narisali v parih okvirih.
#align(center)[ #align(center)[
#figure(caption: "Optimizacije izrisa")[ #figure(caption: [Optimizacije izrisa])[
#table( #table(
columns: 5, columns: 5,
align: horizon, align: horizon,
@@ -1102,7 +1054,7 @@ Na zažetku (@dna_manager_v1) je DnaManager samo bil struktura kazalcev na `Dna`
gutter: 16pt, gutter: 16pt,
align: center, align: center,
[ [
#figure(caption: "DnaManager v1")[ #figure(caption: [DnaManager v1])[
```cpp ```cpp
struct DnaManagerData struct DnaManagerData
{ {
@@ -1116,7 +1068,7 @@ Na zažetku (@dna_manager_v1) je DnaManager samo bil struktura kazalcev na `Dna`
]<dna_manager_v1> ]<dna_manager_v1>
], ],
[ [
#figure(caption: "DnaManager v2")[ #figure(caption: [DnaManager v2])[
```cpp ```cpp
struct DnaManagerData struct DnaManagerData
{ {
@@ -1132,7 +1084,7 @@ Na zažetku (@dna_manager_v1) je DnaManager samo bil struktura kazalcev na `Dna`
) )
] ]
#figure(caption: "DnaManager v3")[ #figure(caption: [DnaManager v3])[
```cpp ```cpp
struct DnaManagerData struct DnaManagerData
{ {
@@ -1166,7 +1118,7 @@ $ "maxDistance" = 255 sqrt(n) $
Normalizacija je nato: Normalizacija je nato:
$ "normalizedDistance" = frac(d(p, q), "maxDistance") $ $ "normalizedDistance" = frac(d(p, q), "maxDistance") $
=== Skalarni product === Skalarni produkt
Skalarni produkt (tudi dot produkt ali notranji produkt) je operacija med dvema vektorjema v vektorskem prostoru, ki kot rezultat vrne skalar (realno število). @wiki_dot_product Skalarni produkt (tudi dot produkt ali notranji produkt) je operacija med dvema vektorjema v vektorskem prostoru, ki kot rezultat vrne skalar (realno število). @wiki_dot_product
==== Formula: ==== Formula:
@@ -1196,11 +1148,11 @@ $
==== Variation ==== Variation
Variaciaja, ki jo bomo testirali je da najprej mapiramo vrednosti genov iz (0, 255) v (-127 to 128) in s tem razširimo izhodno območje. Variaciaja, ki jo bomo testirali je da najprej mapiramo vrednosti genov iz (0, 255) v (-127 to 128) in s tem razširimo izhodno območje.
=== Hamming razdalja === Hammingova razdalja
Hammingova razdalja je koncept v matematiki in računalništvu, ki meri razliko med dvema zaporedjema enake dolžine. Najpogosteje se uporablja za nize znakov, binarne zaporedja (npr. bitne nize) ali DNA zaporedja. @wiki_hamming_distance Hammingova razdalja je koncept v matematiki in računalništvu, ki meri razliko med dvema zaporedjema enake dolžine. Najpogosteje se uporablja za nize znakov, binarne zaporedja (npr. bitne nize) ali DNA zaporedja. @wiki_hamming_distance
=== Jaccard indeks === Jaccardov indeks
Jaccardov indeks (ali Jaccardov koeficient podobnosti) je metrika, ki meri podobnost med dvema množicama. Izračuna se kot razmerje med velikostjo presečiška obeh množic in velikostjo njihove unije. @wiki_jaccard_index Jaccardov indeks (ali Jaccardov koeficient podobnosti) je metrika, ki meri podobnost med dvema množicama. Izračuna se kot razmerje med velikostjo presečiška obeh množic in velikostjo njihove unije. @wiki_jaccard_index
==== Formula: ==== Formula:
@@ -1237,7 +1189,7 @@ tail(x) is a string of all but the first character of x
head(x) is first character of x head(x) is first character of x
=== Needleman-Wunsch algoritem === Needleman-Wunschev algoritem
Needleman-Wunschov algoritem je algoritem, ki se uporablja v bioinformatiki za poravnavo beljakovinskih ali nukleotidnih zaporedij. Bil je ena prvih aplikacij dinamičnega programiranja za primerjavo bioloških zaporedij. Včasih se imenuje tudi algoritem optimalnega ujemanja in tehnika globalne poravnave. Needleman-Wunschov algoritem se še vedno široko uporablja za optimalno globalno poravnavo, zlasti kadar je kakovost globalne poravnave najpomembnejša. Algoritem dodeli oceno vsakemu možnemu poravnavanju, njegov namen pa je najti vsa možna poravnavanja z najvišjo oceno. @wiki_needlemanwunsch_algorithm Needleman-Wunschov algoritem je algoritem, ki se uporablja v bioinformatiki za poravnavo beljakovinskih ali nukleotidnih zaporedij. Bil je ena prvih aplikacij dinamičnega programiranja za primerjavo bioloških zaporedij. Včasih se imenuje tudi algoritem optimalnega ujemanja in tehnika globalne poravnave. Needleman-Wunschov algoritem se še vedno široko uporablja za optimalno globalno poravnavo, zlasti kadar je kakovost globalne poravnave najpomembnejša. Algoritem dodeli oceno vsakemu možnemu poravnavanju, njegov namen pa je najti vsa možna poravnavanja z najvišjo oceno. @wiki_needlemanwunsch_algorithm
#pagebreak() #pagebreak()
@@ -1251,7 +1203,7 @@ Algoritmi so bili testirani na računalniku z AMD Ryzen 5 5500U procesorjem in 1
=== Rezultati podobnosti === Rezultati podobnosti
#align(center)[ #align(center)[
#figure(caption: "Rezultati podobnosti")[ #figure(caption: [Rezultati podobnosti])[
#table( #table(
columns: 7, columns: 7,
table.header([generacija], [evklidij], [dot], [cos\_sim], [cos\_sim\_var], [hamming], [levenshtein]), table.header([generacija], [evklidij], [dot], [cos\_sim], [cos\_sim\_var], [hamming], [levenshtein]),
@@ -1296,9 +1248,9 @@ Algoritmi so bili testirani na računalniku z AMD Ryzen 5 5500U procesorjem in 1
) )
#pagebreak() #pagebreak()
=== Časa računanja podobnosti v us === Čas računanja podobnosti v us
#align(center)[ #align(center)[
#figure(caption: "Čas računanja podobnosti")[ #figure(caption: [Čas računanja podobnosti])[
#table( #table(
columns: 7, columns: 7,
table.header([generation], [euclidean], [dot], [cos\_sim], [cos\_sim\_var], [hamming], [levenshtein]), table.header([generation], [euclidean], [dot], [cos\_sim], [cos\_sim\_var], [hamming], [levenshtein]),
@@ -1353,7 +1305,7 @@ Opazili ste da Jaccard indeks in Needleman-Wunsch algoritem manjakta v testiranj
#pagebreak() #pagebreak()
= APP STORE = Google Play Store
Da lahko objavimo aplikacijo na Google Play Store potrebujemo Play Console razvijalski račun @web_google_play_console. Koraki za izdelavo računa so zelo enostavni, vpiši potrebne podatke, sprejmi razvojni sporazum, in plačaj registracijo. Naši problemi so se začeli z vnosom podatkov ni so hoteli sprejeti naše telefonske številke, ker ni so mogli preverit, ko smo pa sledili korakom za odstranjevaje težav, ki so večinoma samo bili počakajte en dan in poskusite ponovno, še vedno ni delovalo. Nato smo kontaktirali njihovo pomoč, ki so nam vrnili podoben odgovor da naj čakamo, po tem smo obupali in samo uporabili drugo telefonsko številko. Da lahko objavimo aplikacijo na Google Play Store potrebujemo Play Console razvijalski račun @web_google_play_console. Koraki za izdelavo računa so zelo enostavni, vpiši potrebne podatke, sprejmi razvojni sporazum, in plačaj registracijo. Naši problemi so se začeli z vnosom podatkov ni so hoteli sprejeti naše telefonske številke, ker ni so mogli preverit, ko smo pa sledili korakom za odstranjevaje težav, ki so večinoma samo bili počakajte en dan in poskusite ponovno, še vedno ni delovalo. Nato smo kontaktirali njihovo pomoč, ki so nam vrnili podoben odgovor da naj čakamo, po tem smo obupali in samo uporabili drugo telefonsko številko.
V naslednjih korakih moramo naložiti zapakirano aplikacijo, dodati opis applikacije, slike delovanja in politiko varstva osebnih podatkov (@privacy_policy). Po tem pa moramo spraviti aplikacijo čez notranje testiranje, ki je zelo ne specificirano, generalna ideja naj bi bila da potrebujemo 12 testerjev, ki naj bi uporabljali aplikacijo vsaj 12 dni nikjer pa ni omenjeno koliko časa na dan morajo uporabljati aplikacijo da se šteje. Par tednov smo poskušali z prijatelji ugotoviti kdaj postaneš aktiven samo smo brez uspeha. Nato smo se odločili da bi pogledali po internetu kako ta problem rešujejo ostali. Našli smo dve rešitvi. Prva zastonj rešitev, je nekaj forumov na spletu kjer ljudje objavljajo svoje aplikacije in ideja je da si med samo pomagajo s tem da testirajo drug od drugih aplikacije. Droga plačljiva rešitev za katero smo se mi odločili je da najamemo testerja za pribljižno 20€. Z testerjem smo se zmenili kaj potrebujemo in po izmenjavi potrebnih podatko je po dveh tednih aplikacija testirana in lahko nadaljuje na zadnji pregled pred objavo. V naslednjih korakih moramo naložiti zapakirano aplikacijo, dodati opis applikacije, slike delovanja in politiko varstva osebnih podatkov (@privacy_policy). Po tem pa moramo spraviti aplikacijo čez notranje testiranje, ki je zelo ne specificirano, generalna ideja naj bi bila da potrebujemo 12 testerjev, ki naj bi uporabljali aplikacijo vsaj 12 dni nikjer pa ni omenjeno koliko časa na dan morajo uporabljati aplikacijo da se šteje. Par tednov smo poskušali z prijatelji ugotoviti kdaj postaneš aktiven samo smo brez uspeha. Nato smo se odločili da bi pogledali po internetu kako ta problem rešujejo ostali. Našli smo dve rešitvi. Prva zastonj rešitev, je nekaj forumov na spletu kjer ljudje objavljajo svoje aplikacije in ideja je da si med samo pomagajo s tem da testirajo drug od drugih aplikacije. Droga plačljiva rešitev za katero smo se mi odločili je da najamemo testerja za pribljižno 20€. Z testerjem smo se zmenili kaj potrebujemo in po izmenjavi potrebnih podatko je po dveh tednih aplikacija testirana in lahko nadaljuje na zadnji pregled pred objavo.
@@ -1456,13 +1408,13 @@ This Privacy Policy is effective as of February 26, 2025. We reserve the right t
Po tem ko smo objavili aplikacijo na Play Store smo prosili prijatelje in sodelavce, naj probajo aplikacijo. Med uporabo so naleteli na nekaj pričakovanih in nepričakovanih problemov. Po tem ko smo objavili aplikacijo na Play Store smo prosili prijatelje in sodelavce, naj probajo aplikacijo. Med uporabo so naleteli na nekaj pričakovanih in nepričakovanih problemov.
== Ni inititivno kako uprabljati aplikacijo == Ni intuitivno, kako uprabljati aplikacijo
Uporabnikom ni bilo jasno kako uporabiti aplikacijo, ni jim bilo jasno da lahko povlečejo sliko levo ali delsno da označijo ali jim je všeč ali ne. Da rešimo to lahko ob prvem zagonu aplikacije prikažemo animacijo kako lahko premikajo sliko po zaslonu. Uporabnikom ni bilo jasno kako uporabiti aplikacijo, ni jim bilo jasno da lahko povlečejo sliko levo ali delsno da označijo ali jim je všeč ali ne. Da rešimo to lahko ob prvem zagonu aplikacije prikažemo animacijo kako lahko premikajo sliko po zaslonu.
== Ne pričakovani rezultati == Nepričakovani rezultati
Po razlagi kako uporabljati aplikacijo jim ni bilo jasno zakaj niso videli nobenih sprememb na drevesih in v rezultatu podobnosti. Tukaj je glavni problem majhno stevilo vzorcev na generacijo (trenutno 16) s tem težko izločimo kaj je uporabniku všeč. Med testiranjem pa nam večje število vzorcev ni bilo všeč ker predolgo traja da pridemo skozi generacijo, in vidimo spremembe. In med izdelavo aplikacije, ker smo vedeli kako deluje algoritem, nismo uporabljali aplikacijo kot uporabnik. Namesto da bi izbirali izgled celotne slike smo izbirali specifične lastnosti na slikah. Nekaterim uporabnikom je tudi ratalo to ugotoviti in so s tem ustvarili precej lepe slike. Po razlagi kako uporabljati aplikacijo jim ni bilo jasno zakaj niso videli nobenih sprememb na drevesih in v rezultatu podobnosti. Tukaj je glavni problem majhno stevilo vzorcev na generacijo (trenutno 16) s tem težko izločimo kaj je uporabniku všeč. Med testiranjem pa nam večje število vzorcev ni bilo všeč ker predolgo traja da pridemo skozi generacijo, in vidimo spremembe. In med izdelavo aplikacije, ker smo vedeli kako deluje algoritem, nismo uporabljali aplikacijo kot uporabnik. Namesto da bi izbirali izgled celotne slike smo izbirali specifične lastnosti na slikah. Nekaterim uporabnikom je tudi ratalo to ugotoviti in so s tem ustvarili precej lepe slike.
== Motil rezultat podobnosti == Mot rezultat podobnosti
Nekaj uporabnikov nam je sporočilo da jih je motili da jim ni uspelo doseči 100% podobnost. Da lahko to rešimo bi mogoče lahko uporabili kak drugačen algoritem, ali bi pa lahko preslikali rezultat, da vsaka vrednost nad 85% se prikaže kot 100%. Nekaj uporabnikov nam je sporočilo da jih je motili da jim ni uspelo doseči 100% podobnost. Da lahko to rešimo bi mogoče lahko uporabili kak drugačen algoritem, ali bi pa lahko preslikali rezultat, da vsaka vrednost nad 85% se prikaže kot 100%.
== Zgodovina == Zgodovina