Compare commits

...

21 Commits
1.0 ... main

Author SHA1 Message Date
15e5127c27 Fix table 2025-06-19 22:52:04 +02:00
e8f8182cb3 Icons + fortunate brain 2025-06-19 22:08:37 +02:00
9b2c721590 Typos 2025-06-19 22:08:28 +02:00
c4cdabe0ab Fix design 1 blockquotes 2025-06-16 12:05:33 +02:00
e73764caf8 Add the original notes as a submodule 2025-06-16 09:27:37 +02:00
8310f35663 Add bspline image 2025-06-16 09:27:27 +02:00
0e3b4678b3 Fix capitalization in links 2025-06-11 22:43:29 +02:00
25d2b24324 Notes for graphs and graph algorithms 2025-06-11 22:43:07 +02:00
b8f32cc898 Remove algo string matching 2025-06-11 22:42:54 +02:00
a21165d65d Change favicon 2025-06-11 21:36:35 +02:00
d460807286 Adjust binary search description 2025-06-09 22:34:24 +02:00
268f506a9c Use images for github callout icons #1 2025-06-09 21:02:08 +02:00
cf19330257 [Addition] Neuronky 2025-06-09 19:36:30 +02:00
2c735723bb Align difference equations 2025-06-09 11:43:32 +02:00
57e559cb26 Align newton method equations 2025-06-09 11:39:32 +02:00
bcd77cb314 Add newton approximation method and binary search 2025-06-09 11:27:44 +02:00
301ad7dff2 Add regula falsi figure 2025-06-09 11:17:41 +02:00
b497825295 Print improvement
Don't pagebreak inside callouts
2025-06-08 22:43:11 +02:00
360d1d9ebe Adjust index page 2025-06-08 21:09:26 +02:00
77eec532a5 Print pagebreaks, inline width images 2025-06-07 13:12:59 +02:00
83a00a467a Fix nested callout 2025-06-07 11:30:13 +02:00
59 changed files with 262 additions and 367 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "fi"]
path = fi
url = https://github.com/cafour/fi

View File

@ -4,34 +4,41 @@ import starlight from '@astrojs/starlight';
import remarkGithubAlerts from 'remark-github-alerts';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';
import rehypeCustomFootnotes from './src/plugins/custom-footnote';
import rehypeCustomization from './src/plugins/rehype-plugins';
// https://astro.build/config
export default defineConfig({
site: "https://fi.vojtechstruhar.com",
markdown: {
remarkPlugins: [remarkGithubAlerts, remarkMath],
rehypePlugins: [rehypeKatex, rehypeCustomFootnotes]
rehypePlugins: [rehypeKatex, rehypeCustomization]
},
integrations: [
starlight({
title: 'SZMGR',
favicon: "/favicon.png", // fi_16.png
logo: {
src: "./src/assets/fi_16.png"
},
social: [{ icon: 'github', label: 'GitHub', href: 'https://git.vojtechstruhar.com/Vojta/fi-notes' }],
head: [
{
tag: "script",
attrs: {
src: "/scripts/load-images-before-print.js"
}
}
],
customCss: [
"remark-github-alerts/styles/github-colors-light.css",
"remark-github-alerts/styles/github-colors-dark-class.css",
"remark-github-alerts/styles/github-base.css",
"remark-github-alerts/styles/github-colors-light.css",
"katex/dist/katex.min.css",
"./src/styles/theme.css",
"./src/styles/footnotes-fix.css",
"./src/styles/pixelated-logo.css",
"./src/styles/images-adjustment.css",
"./src/styles/scroll-fix.css",
"./src/styles/print-improvements.css",
],
sidebar: [
{
@ -85,8 +92,6 @@ export default defineConfig({
"szmgr/pgv09_minimalizace_energie",
"szmgr/pgv10_zpracovani_obrazu_pomoci_pde",
"szmgr/pgv_zpracovani_obrazu_intro",
]
},

View File

@ -14,7 +14,7 @@ rsync -avz \
dist/ \
root@vojtechstruhar.com:/var/www/fimuni-mgr-notes
rm -rf dist
#rm -rf dist
echo
echo "Done"

1
fi Submodule

@ -0,0 +1 @@
Subproject commit e08e804aab28594fa2fc0dbd5d2ecf03efe60d8f

View File

@ -19,4 +19,4 @@
"sharp": "^0.32.5",
"unist-util-visit": "^5.0.0"
}
}
}

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81 36 64 0 47 36l-1 2-9-10a6 6 0 0 0-9 9l10 10h-2L0 64l36 17h2L28 91a6 6 0 1 0 9 9l9-10 1 2 17 36 17-36v-2l9 10a6 6 0 1 0 9-9l-9-9 2-1 36-17-36-17-2-1 9-9a6 6 0 1 0-9-9l-9 10v-2Zm-17 2-2 5c-4 8-11 15-19 19l-5 2 5 2c8 4 15 11 19 19l2 5 2-5c4-8 11-15 19-19l5-2-5-2c-8-4-15-11-19-19l-2-5Z" clip-rule="evenodd"/><path d="M118 19a6 6 0 0 0-9-9l-3 3a6 6 0 1 0 9 9l3-3Zm-96 4c-2 2-6 2-9 0l-3-3a6 6 0 1 1 9-9l3 3c3 2 3 6 0 9Zm0 82c-2-2-6-2-9 0l-3 3a6 6 0 1 0 9 9l3-3c3-2 3-6 0-9Zm96 4a6 6 0 0 1-9 9l-3-3a6 6 0 1 1 9-9l3 3Z"/><style>path{fill:#000}@media (prefers-color-scheme:dark){path{fill:#fff}}</style></svg>

Before

Width:  |  Height:  |  Size: 696 B

BIN
public/icons/cafour.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/icons/caution.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/icons/edit_15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Binary file not shown.

BIN
public/icons/edit_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

BIN
public/icons/edit_8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

BIN
public/icons/fi_16.aseprite Normal file

Binary file not shown.

BIN
public/icons/fi_16.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
public/icons/fi_16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

6
public/icons/fi_16.svg Normal file
View File

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -0.5 16 16" shape-rendering="crispEdges" preserveAspectRatio="xMinYMin ">
<metadata>Made with Pixels to Svg https://codepen.io/shshaw/pen/XbxvNj</metadata>
<path stroke="#e3b53d" d="M1 0h9M0 1h1M10 1h1M15 1h1M10 2h1M15 2h1M15 3h1M4 4h1M6 4h2M14 4h1M4 5h2M8 5h1M14 5h1M8 6h1M13 6h1M13 7h1M6 8h1M12 8h1M6 9h1M12 9h1M7 10h1M11 10h1M7 11h1M11 11h1M7 12h1M10 12h1M10 13h1M9 14h1M7 15h3" />
<path stroke="#000000" d="M11 0h4M11 1h4M0 2h10M12 2h2M0 3h10M12 3h2M1 4h2M11 4h2M1 5h2M11 5h2M2 6h2M5 6h3M10 6h2M2 7h2M5 7h3M10 7h2M3 8h2M9 8h2M3 9h2M9 9h2M4 10h2M8 10h2M4 11h2M8 11h2M5 12h2M8 12h1M5 13h4M6 14h2" />
<path stroke="#f1d46c" d="M1 1h9M11 2h1M14 2h1M11 3h1M14 3h1M3 4h1M13 4h1M3 5h1M6 5h2M13 5h1M4 6h1M12 6h1M4 7h1M12 7h1M5 8h1M11 8h1M5 9h1M11 9h1M6 10h1M10 10h1M6 11h1M10 11h1M9 12h1M9 13h1M8 14h1" />
</svg>

After

Width:  |  Height:  |  Size: 860 B

BIN
public/icons/fi_32.aseprite Normal file

Binary file not shown.

BIN
public/icons/fi_32.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
public/icons/fi_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

BIN
public/icons/important.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

BIN
public/icons/note.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-stop mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true" fill="#d1242f"><path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>

After

Width:  |  Height:  |  Size: 576 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true" fill="#8250df"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>

After

Width:  |  Height:  |  Size: 609 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-info mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true" fill="#0969da"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>

After

Width:  |  Height:  |  Size: 437 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true" fill="#1a7f37"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>

After

Width:  |  Height:  |  Size: 889 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="octicon octicon-alert mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true" fill="#9a6700"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>

After

Width:  |  Height:  |  Size: 493 B

BIN
public/icons/tip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

BIN
public/icons/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,8 @@
function loadAllImages() {
document.querySelectorAll('img[loading="lazy"]').forEach(img => {
img.setAttribute('loading', 'eager');
});
}
// Before printing (manually or via browser)
window.addEventListener('beforeprint', loadAllImages);

View File

@ -3,12 +3,13 @@ title: FI Notes
description: Notes (mostly in Czech) from the Faculty of Informatics of Masaryk University in Brno.
---
Notes (mostly in Czech) from the [Faculty of Informatics of Masaryk University](https://www.fi.muni.cz) in Brno. Source files are available on GitHub. Contributions are welcome!
# Contents
Notes (mostly in Czech) from the [Faculty of Informatics of Masaryk University](https://www.fi.muni.cz) in Brno. Source files are [available on GitHub](https://github.com/cafour/fi). Contributions are welcome!
> [!NOTE]
> Work in progress!
> This is just a Astro + Starlight markdown port of [Adam's original notes](https://fi.cafour.cz/szmgr/).
> Only MGR materials are here, his website has everything. All credit goes to Adam.
# Contents
- [SZMGR Státní zkouška (magisterský studijní program)](/szmgr)

View File

@ -157,7 +157,7 @@ Vytvoříme povrch, kde hodnota je konstantní. Na vytvoření isosurface může
### Direct volume rendering
Vykreslíme objemová data přímo. Můžeme použít různé techniky, jako např. ray casting, nebo splatting.
Detailní fungování je popsané v otázce [PGV06](../PGV06_vykreslovani_objemovych_dat).
Detailní fungování je popsané v otázce [PGV06](../pgv06_vykreslovani_objemovych_dat).
## Geovizualizace

View File

@ -17,8 +17,10 @@ Taylorův polynom vypadá takto: $f(x + h) = f(x) + hf'(x) + \frac{h^2}{2!}f''(x
Z něho můžeme odvodit rovnici pro první derivaci (v našem případě ji nazýváme dopředná diference):
```math
f(x + h) \approx f(x) + hf'(x)\\
f'(x) \approx \frac{f(x + h) - f(x)}{h}
\begin{aligned}
f(x + h) \approx &\ f(x) + hf'(x)\\
f'(x) \approx &\ \frac{f(x + h) - f(x)}{h}
\end{aligned}
```
Tu můžeme dále zpřesnit, pokud si vypíšeme taylorův rozvoj až do druhé derivace včetně (tím získáme centrální diferenci):
@ -26,9 +28,11 @@ Taylorův polynom vypadá takto: $f(x + h) = f(x) + hf'(x) + \frac{h^2}{2!}f''(x
```math
h_1 = 1, h_2 = -1\\
f(x + h_1) - f(x + h_2) \\
f(x + 1) - f(x - 1) \approx f(x) + hf'(x) + \frac{h^2}{2!}f''(x) - f(x) + hf'(x) - \frac{h^2}{2!}f''(x)\\
f(x + 1) - f(x - 1) \approx 2hf'(x) \\
f'(x) \approx \frac{f(x + 1) - f(x - 1)}{2h}
\begin{aligned}
f(x + 1) - f(x - 1) \approx &\ f(x) + hf'(x) + \frac{h^2}{2!}f''(x) - f(x) + hf'(x) - \frac{h^2}{2!}f''(x)\\
f(x + 1) - f(x - 1) \approx &\ 2hf'(x) \\
f'(x) \approx &\ \frac{f(x + 1) - f(x - 1)}{2h}
\end{aligned}
```
Podobným stylem získáme i druhou derivaci

View File

@ -388,249 +388,6 @@ k + (\|S\| - k) - \|S\| = 0 & \text{pokud } \|S\| > k \\
\end{cases}
```
## Vyhledávání řetězců (string matching)
_String matching_ označuje rodinu problémů obsahující třeba:
- Nalezení prvního přesného výskytu podřetězce (_patternu_) v řetězci (_stringu_ / _textu_).
- Nalezení všech výskytů podřetězce v řetězci.
- Výpočet vzdálenosti dvou řetězců.
- Hledání opakujících se podřetězců.
Většinou je řetězec polem znaků z konečné abecedy $\Sigma$. String matching algoritmy se ale dají použít na ledacos.
Vzorek $P$ se vyskytuje v textu $T$ s posunem $s$, pokud $0 \le s \le n - m$ a zároveň $T\lbrack (s+1) .. (s + m) \rbrack = P$. Pro nalezení platných posunů lze použít řadu algoritmů, které se liší složitostí předzpracování i samotného vyhledávání: [^iv003-strings]
| Algoritmus | Preprocessing | Searching |
| ----------------------------------- | ------------------------------------ | ----------------------------------- |
| Brute force / naivní | $0$ | $\mathcal{O}((n - m + 1) \cdot m)$ |
| Karp-Rabin | $\Theta(m)$ | $\mathcal{O}((n - m + 1) \cdot m)$ |
| finite automata | $\Theta(m \cdot \vert \Sigma \vert)$ | $\Theta(n)$ |
| Knuth-Morris-Pratt | $\Theta(m)$ | $\Theta(m)$ |
| Boyer-Moore | $\Theta(m + \vert \Sigma \vert)$ | $\mathcal{O}((n - m + 1) \cdot m)$ |
- $T$ nebo $T\lbrack 1..n \rbrack$ -- text.
- $P$ nebo $P\lbrack 1..m \rbrack$ -- pattern.
- $n$ -- délka textu $T$.
- $m$ -- délka vzorku / podřetězce / patternu $P$.
- $\Sigma$ -- konečná abeceda, ze které je složen text i pattern.
### Brute force / naivní
Prochází všechny pozice v textu a porovnává je s patternem. Pokud se neshodují, posune se o jedno pole dopředu.
Pokud se text neshoduje už v prvním znaku, je složitost lineární. Avšak v nejhorším případě, kdy se pattern shoduje s textem až na poslední znak, je složitost až kvadratická.
```csharp
int Naive(string text, string pattern)
{
int n = text.Length;
int m = pattern.Length;
for (int i = 0; i < n - m + 1; i++)
{
// NB: Substring creates a new string but let's not worry about that.
if (text.Substring(i, m) == pattern)
{
return i;
}
}
return -1;
}
```
- **Složitost**\
Cyklus je proveden $n-m+1$-krát. V každé iteraci se provede přinejhorším až $m$ porovnání. (Zanedbáváme složitost `Substring`, která v C# dělá kopii.)
### Karp-Rabin
Používá hashování. Vytvoří hash z patternu a hashuje i všechny podřetězce délky $m$ v textu. Nejprve eliminuje všechny pozice, kde se hashe neshodují. Pokud se shodují, porovná je znak po znaku.
```csharp
int KarpRabin(string text, string pattern)
{
int n = text.Length;
int m = pattern.Length;
int patternHash = pattern.GetHash();
for (int i = 0; i < n - m + 1; i++)
{
// NB: Assume that `GetHash` is a rolling hash, even though in .NET it's not.
if (text.Substring(i, m).GetHash() == patternHash)
{
if (text.Substring(i, m) == pattern)
{
return i;
}
}
}
return -1;
}
```
- **Hashování**\
Trik spočívá v použití _rolling_ hashovacího algoritmu. Ten je schopný při výpočtu hashe pro $T\lbrack s .. (s + m) \rbrack$ použít hash $T\lbrack s .. (s + m - 1) \rbrack$ s využitím pouze jednoho dalšího znaku $T\lbrack s + m \rbrack$. Přepočet hashe je tedy $\mathcal{O}(1)$.
Jeden takový algoritmus lze získat použitím Hornerova schématu pro evaluaci polynomu. [^horner] Předpokládejme, že $\Sigma = \{0, 1, ..., 9\}$ (velikost může být libovolná), pak pro hash $h$ platí
```math
\begin{align*}
h &= P[1] + 10 \cdot P[2] + 10^2 \cdot P[3] + ... + 10^{m-1} \cdot P[m] \\
&= P[1] + 10 \cdot (P[2] + 10 \cdot (P[3] + ... + 10 \cdot P[m] ... ))
\end{align*}
```
Pokud jsou hashe příliš velké, lze navíc použít modulo $q$, kde $10 \cdot q \approx \text{machine word}$.
- **Složitost**\
Předzpracování zahrnuje výpočet $T \lbrack 1..m \rbrack$ v $\Theta(m)$.
Složitost výpočtu je v nejhorším případě $\mathcal{O}((n - m + 1) \cdot m)$, jelikož je potřeba porovnat všechny podřetězce délky $m$ s patternem.
Tento algoritmus se hodí použít, pokud hledáme v textu celé věty, protože neočekáváme velké množství "falešných" shod, které mají stejný hash jako $P$. V tomto případě je průměrná složitost $\mathcal{O}(n)$.
### Konečné automaty
Složitost naivního algortmu lze vylepšit použitím konečného automatu.
Mějmě DFA $A = (\{0, ..., m\}, \Sigma, \delta, \{0\}, \{m\})$, kde přechodobou funkci definujeme jako:
```math
\delta(q, x) = \text{největší } k \text{ takové, že } P[1..k] \text{ je \textbf{prefix} a zároveň \textbf{suffix} } P[1..q] . x
```
Jinými slovy, $\delta$ vrací delků nejdelšího možného začátku $P$, který se nachází na daném místě (stavu $q$) v řetězci $T$.
Prakticky by příprava přechodové funkce mohla vypadat takto:
```csharp
int[,] CreateAutomaton(string pattern)
{
int m = pattern.Length;
// NB: Assumes that the alphabet is ASCII.
int[,] automaton = new int[m + 1, 256];
for (int q = 0; q <= m; q++)
{
for (int c = 0; c < 256; c++)
{
int k = Math.Min(m + 1, q + 2);
do
{
k--;
}
while (!pattern.Substring(0, q).Equals(pattern.Substring(0, k) + (char)c));
automaton[q, c] = k;
}
}
return automaton;
}
```
Vyhledávání v textu pak bude vypadat takto:
```csharp
int FiniteAutomaton(string text, string pattern)
{
int n = text.Length;
int m = pattern.Length;
int[,] automaton = CreateAutomaton(pattern);
int q = 0;
for (int i = 0; i < n; i++)
{
q = automaton[q, text[i]];
if (q == m)
{
return i - m + 1;
}
}
return -1;
}
```
Tato metoda šetří čas, pokud se pattern v některých místech opakuje. Mějmě například pattern `abcDabcE` a text `abcDabcDabcE`. Tato metoda nemusí začínat porovnávat pattern od začátku po přečtení druhého `D`, ale začne od $P \lbrack 5 \rbrack$ (včetně), protože _ví_, že předchozí část patternu se již vyskytla v textu.
Jinými slovy na indexu druhého `D` je `abcD` nejdelší prefix $P$, který je zároveň suffixem už načteného řetězce.
- **Složitost**\
Vytvoření automatu vyžaduje $\Theta(m^3 \cdot |\Sigma|)$ času, dá se však provést efektivněji než v `CreateAutomaton` a to v čase $\Theta(m \cdot |\Sigma|)$.
Složitost hledání je pak v $\Theta(n)$. [^iv003-strings]
### Knuth-Morris-Pratt (KMP)
KMP představuje efektivnější využití idei z metody konečného automatu:
- Každý stav $q$ je označen písmenem z patternu. Výjimkou je počáteční stav $S$ a koncový stav $F$.
- Každý stav má hranu `success`, která popisuje sekvenci znaků z patternu, a `failure` hranu, která míří do některého z předchozích stavů -- takového, že už načtené znaky jsou největší možný prefix patternu.
V reálné implementaci nejsou `success` hrany potřeba; potřebujeme jen vědět, kam skočit v případě neúspěchu.
```csharp
/// <summary>
/// Computes the longest proper prefix of P[0..i]
/// that is also a suffix of P[0..i].
/// </summary>
int[] ComputeFailure(string pattern)
{
int m = pattern.Length;
int[] fail = new int[m];
int j = 0;
for (int i = 1; i < m; i++)
{
while (j >= 0 && pattern[j] != pattern[i])
{
j = fail[j];
}
// If comparison at i fails,
// return to j as the new starting point.
fail[i] = j;
j++;
}
return fail;
}
int KnuthMorrisPratt(string text, string pattern)
{
int[] fail = ComputeFailure(pattern);
int n = text.Length;
int m = pattern.Length;
// NB: I index from 0 here. Although I use 1..n in the text.
int i = 0;
int j = 0;
for (int i = 0; i < n; i++)
{
while (j >= 0 && text[i] != pattern[j])
{
/*
There can be at most n-1 failed comparisons
since the number of times we decrease j cannot
exceed the number of times we increment i.
*/
j = fail[j];
}
j++;
if (j == m)
{
return i - m;
}
}
return -1;
}
```
> [!WARNING]
> Nejsem si jistý, že ty indexy v kódu výše mám dobře.
> [!NOTE]
> "In other words we can amortize character mismatches against earlier character matches." [^iv003-strings]
- **Složitost**\
Amortizací neúspěšných porovnání vůči úspěšným získáme $\mathcal{O}(m)$ pro `ComputeFailure` a $\mathcal{O}(n)$ pro `KnuthMorrisPratt`.
[^iv003]: [IV003 Algoritmy a datové struktury II (jaro 2021)](https://is.muni.cz/auth/el/fi/jaro2021/IV003/)
[^iv003-strings]: https://is.muni.cz/auth/el/fi/jaro2021/IV003/um/slides/stringmatching.pdf
[^rabin-karp-wiki]: https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm
[^horner]: https://en.wikipedia.org/wiki/Horner%27s_method
[^backtracking]: https://betterprogramming.pub/the-technical-interview-guide-to-backtracking-e1a03ca4abad

View File

@ -77,6 +77,25 @@ description: "TODO"
3. Opakujeme 2. dokud nedosáhneme požadované přesnosti odhadu.
![width=400](./img/szp02_newton_method.png)
> [!TIP]
> How to derive Newton approximation method:
> 1. Start with Taylor $f(x)=\sum_{n=0}^{1} \frac{f_n(a)}{n!} \cdot (x-a)^n$
> 2. Substitute $a = x_n$
>
> $f(x) \approx f(x_n) + f'(x_n)(x-x_n)$
>
> Now, we want to find $x_{n+1}$ such that $f(x) = f(x_{n+1}) = 0$.
>
> ```math
> \begin{aligned}
> 0 \approx &\ f(x_n) + f'(x_n)(x_{n+1}-x_n) \\
> 0 \approx &\ \frac{f(x_n)}{f'(x_n)} + x_{n+1} - x_n \\
> x_{n+1} = &\ x_n - \frac{f(x_n)}{f'(x_n)}
> \end{aligned}
> ```
- **Metoda sečen / secant method**\
Používá k odhadu kořene funkce $f$ sečny, resp. _finite difference_, které aproximují derivaci funkce $f$. Díky tomu není potřeba znát derivaci funkce $f$. Iterační funkce je:
@ -96,6 +115,11 @@ description: "TODO"
kde $s$ je největší index takový, že $f(x_k)f(x_s) < 0$.
![width=400](./img/szp02_regula_falsi.png)
- **Metoda Binary search**\
Prvotní interval $(x_0, x_1)$ musí obsahovat kořen funkce $f$, tj. $x_0$ a $x_1$ mají různé znaménka. V každém kroku se rozdělí interval na dvě poloviny a dál hledáme v polovině která obsahuje kořen funkce. Metoda _regula falsi_ se pokouší o rychlejší kovergenci sofistikovanějším dělením intervalu.
## Přímé metody pro řešení systému lineárních rovnic
### Gaussova eliminace

View File

@ -121,9 +121,9 @@ description: "TODO"
> <br>
> Každý trojúhelník má 3 hrany a každá hrana je sdílena dvěma trojúhelníky, takže $E = \frac{3}{2} F$.
> <br>
> **💡 TIP**\
> > [!TIP]
> > Intuitivně: pokud jsme neúsporní, pak máme tři hrany pro každý trojúhelník ($3F$), každou hranu ale "přilepíme" k nějakému dalšímu trojúhelníku, takže každou hranu máme zbytečně dvakrát ($2E$), proto $3F = 2E$, tedy $E = \frac{3}{2} F$.
> <br>
>
> Z Euler-Poincaré plyne, že
> <br>
> ```math
@ -219,42 +219,18 @@ description: "TODO"
Ač Eulerových operátorů se dá zadefinovat mnoho, v praxi stačí:
|====
| Operátor
| Popis
| `MSFV`
| make shell, face, vertex
| `MEV`
| make edge, vertex
| `MFE`
| make face, edge
| `MSH`
| make shell, hole
| `MEKL`
| make edge, kill loop
2+|
| `KEV`
| kill edge, vertex
| `KFE`
| kill face, edge
| `KSFV`
| kill shell, face, vertex
| `KSH`
| kill shell, hole
| `KEML`
| kill edge, make loop
|====
| Operátor | Popis |
| -------- | ------------------------ |
| MSFV | make shell, face, vertex |
| MEV | make edge, vertex |
| MFE | make face, edge |
| MSH | make shell, hole |
| MEKL | make edge, kill loop |
| KEV | kill edge, vertex |
| KFE | kill face, edge |
| KSFV | kill shell, face, vertex |
| KSH | kill shell, hole |
| KEML | kill edge, make loop |
- **Regularizované booleovské operátory / regularized boolean operators**\
Reprezentace těles pomocí booleovských operací. _Regularizované_ značí, že výsledek je vždy platné 2-manifold těleso.
@ -322,7 +298,7 @@ description: "TODO"
### Změna struktury sítě
> [!IMPORTANT]
> Modifikace meshů mají značný přesah do otázky [Křivky a povrchy](../krivky-a-povrchy/) a taky [Pokročilá počítačová grafika](../vph01_pokrocila_grafika/)
> Modifikace meshů mají značný přesah do otázky [Křivky a povrchy](../szp05_krivky_a_povrchy/) a taky [Pokročilá počítačová grafika](../vph01_pokrocila_grafika/)
- **Překlápění hrany / edge flip**\
Lokální změna, která nahradí hranu $(b,c)$ hranou $(a,d)$. Trojúhelníky $(a,b,c)$ a $(b,d,c)$ se stanou $(a,d,c)$ a $(a,b,d)$. [^pa010-2021]

View File

@ -377,6 +377,9 @@ Mezi jejich vlastnosti patří:
**Basis spline / B-spline** stupně $n$ je aproximační křivka / splajn daná sekvencí $n$ uzlů. Jako funkce vrací užitečné hodnoty jen mezi prvním a posledním uzlem, všude jinde je nulová. Svůj název dostala podle toho, že B-splajny slouží jako bázové funkce pro splajnové křivky.
![width=400](./img/spz05_bspline.png)
Lze ji definovat pomocí **Cox-de Boorovy** rekurzivní formule:
> [!TIP]
@ -681,5 +684,4 @@ Polygonové povrchy dělíme v případě, kdy chceme je zjemnit, vyhladit.
- [NURBS Calculator](http://nurbscalculator.in/)
- [ČVUT: Computer Graphics](https://mat.fs.cvut.cz/computer-graphics/)
&lt;div class="fortunate-brain">
&lt;/div>
<div class="fortunate-brain"></div>

View File

@ -190,9 +190,9 @@ Neuronka je model, kde váhy neuronů jsou parametry. Při učení neuronek je n
```math
\begin{aligned}
E(\vec{w}) = -\frac{1}{p} \sum_{k=1}^p \sum_{j \in Y} d_{kj} \ln(y_j)
\end{aligned}
```
@ -286,6 +286,7 @@ Neuronové sítě uzpůsobené ke zpracování obrazu. Místo násobení matic p
- **Konvoluční vrstva**
- Každý neuron je napojen jen na malý _receptive field_ neuronů o vrstvu níže, který se posouvá o daný stride.
- Výstup z neuronu v konvoluční vrstvě je dán konvolucí jeho receptive field s váhami a přičtením biasu.
$f(i,j) = \sum_{q}^{K} \sum_{b}^{L} f(i-q, j-b) \cdot k(a,b)$
- Všechny neurony v konvoluční vrstvě sdílí stejné váhy a biasy dané velikostí receptive field, což jim umožňuje naučit se nějaký vzor o velikosti receptive field -- říkáme, že taková vrstva je feature mapa.
- Vzorů se chceme zpravidla naučit více, máme vícero vzájemně nezávislých feature map napojených na stejnou vstupní vrstvu.
- **Pooling vrstva**\
@ -324,13 +325,14 @@ Neuronové sítě, jejichž architektura obsahuje cykly. Tedy výstup v jednom b
- **Výhody**
- Umí zpracovat vstupy s variabilní, předem neznámou délkou.
- Vhodné pro time-series data (třeba akciový trh)
- Velikost modelu (množiny vah) je fixní nezávisle na velikosti vstupu.
- Váhy se sdílí mezi vstupy (např. slova ve větě), což umožňuje naučit se nějaký kontext.
- **Nevýhody**
- Trénování je složitější, protože se vyskytuje zpětná vazba.
- Výpočetně náročnější.
- Gradient může explodovat (exploding) nebo zaniknout (diminishing).
- Gradient může explodovat (exploding) nebo zaniknout (diminishing). ReLU je náchylná k explozi hodnoty neuronu. Třeba sigmoid je v tomto lepší. [V RNN se typicky používá tanh.](#LTSM)
![width=100%](./img/szp06_rnn.png)
@ -381,11 +383,11 @@ Neuronové sítě, jejichž architektura obsahuje cykly. Tedy výstup v jednom b
```math
\begin{aligned}
U_{kk'}^{(l+1)} &= U_{kk'}^{(l)} - \varepsilon(l) \cdot \frac{\partial E_{(x, d)}}{\partial U_{kk'}} \\
V_{kk'}^{(l+1)} &= V_{kk'}^{(l)} - \varepsilon(l) \cdot \frac{\partial E_{(x, d)}}{\partial V_{kk'}} \\
W_{kk'}^{(l+1)} &= W_{kk'}^{(l)} - \varepsilon(l) \cdot \frac{\partial E_{(x, d)}}{\partial W_{kk'}} \\
\frac{\partial E_{(x, d)}}{\partial U_{kk'}} &= \sum_{t=1}^T
\textcolor{brown}{\frac{\partial E_{(x, d)}}{\partial h_{tk}}}
\cdot \sigma'
@ -398,7 +400,7 @@ Neuronové sítě, jejichž architektura obsahuje cykly. Tedy výstup v jednom b
\textcolor{brown}{\frac{\partial E_{(x, d)}}{\partial h_{tk}}}
\cdot \sigma'
\cdot h_{(t-1)k'} \\
\end{aligned}
```
@ -408,7 +410,7 @@ Neuronové sítě, jejichž architektura obsahuje cykly. Tedy výstup v jednom b
\begin{aligned}
\textcolor{darkgreen}{\frac{\partial E_{(x, d)}}{\partial y_{tk}}}
&= y_{tk} - d_{tk} \\
\textcolor{brown}{\frac{\partial E_{(x, d)}}{\partial h_{tk}}}
&= \sum_{k'=1}^N
\textcolor{darkgreen}{\frac{\partial E_{(x, d)}}{\partial y_{tk'}}}
@ -426,7 +428,7 @@ Neuronové sítě, jejichž architektura obsahuje cykly. Tedy výstup v jednom b
> Pokud $\textcolor{red}{\sigma' \cdot W_{k'k}} \not\approx 1$, pak gradient buď vybouchne nebo se ztratí.
- **Long Short-Term Memory (LSTM)**\
LSTM řeší problém s vanishing a exploding gradientem, kterým RNN. V RNN je $\sigma$ typicky $\tanh$. V LSTM obsahuje jeden hidden neuron vlastně čtyři "podvrstvy", které mimo jiné umožňují část paměti zapomenout:
LSTM řeší problém s vanishing a exploding gradientem, kterým RNN. V RNN je $\sigma$ typicky $\tanh$. V LSTM obsahuje jeden hidden neuron vlastně čtyři "podvrstvy", které mimo jiné umožňují část paměti zapomenout: <a id="LTSM"></a>
![width=100%](./img/szp06_lstm.png)

View File

@ -135,6 +135,9 @@ Hledá nejkratší cesty z jednoho vrcholu do všech ostatních.
- Využívá relaxaci hran.
- Funguje i na grafech se zápornými hranami.
- Má časovou složitost $\mathcal{O}(\lvert V \rvert \cdot \lvert E \rvert)$.
- Udělá max $V-1$ iterací, protože nejdelší cesta může mít max $V-1$ hran (přes žádný vertex nepůjdeš dvakrát).
- _Modifikace_: Po $V-1$ by už nejkratší cesty měly být nalezeny. Udělejme ještě jednu iteraci - pokud se hodnoty změní, pak nejkratší cesta obsahuje negativní cyklus. Viz python kód dole.
- _Modifikace_: Early stop - pokud se 2 interace po sobě hodnoty vrcholů nezmění, pak jsme našli nejkratší cesty.
```python
def bellmanford(graph: List[List[Tuple[int, int]]], s: int) \
@ -226,9 +229,9 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
- **Fundamental cutset / řez**\
Fundamental cutset je množina hran $D$ v grafu $G$ taková, že přidáním libovolné hrany $e \in D$ získáme kostru.
- **Red rule**\
Najdi cyklus bez červených hran, vyber v něm **neobarvenou** hranu s **nejvyšší** cenou a obarvi ji červeně.
Najdi cyklus bez červených hran, vyber v něm **neobarvenou** hranu s **nejvyšší** cenou a obarvi ji červeně. Červená hrana znamená odebrání z finální kostry.
- **Blue rule**\
Najdi řez bez modrých hran, vyber v něm **neobarvenou** hranu s **nejmenší** cenou a obarvi ji modře.
Najdi řez bez modrých hran, vyber v něm **neobarvenou** hranu s **nejmenší** cenou a obarvi ji modře. Modrá hrana znamená přidání do finální kostry.
- **Greedy algoritmus**\
Nedeterministicky aplikuj red rule a blue rule, dokud to jde (stačí $n-1$ iterací). Modré hrany tvoří MST.
- **Jarníkův / Primův algoritmus**\
@ -305,7 +308,7 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
Je funkce $f: E \rightarrow \mathbb{R}^+$, která splňuje:
- podmínku kapacity: $(\forall e \in E)(f(e) \ge 0 \land f(e) \leq c(e))$
- _tok hranou je nezáporný a nepřevyšuje povolennou kapacitu_
- _tok hranou je nezáporný a nepřevyšuje povolenou kapacitu_
- podmínku kontinuity: $(\forall v \in V \setminus \{s, t\})(\sum_{e \in \delta^+(v)} f(e) = \sum_{e \in \delta^-(v)} f(e))$
- _tok do vrcholu je stejný jako tok z vrcholu_
@ -332,7 +335,7 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
$$
- **Augmenting path $P$**\
Jednoduchá $s \rightsquigarrow t$ cesta v residuální síti $G_f$.
Jednoduchá $s \rightsquigarrow t$ cesta v residuální síti $G_f$. Cesty hledáš buď BFS nebo DFS - každou iteraci si prostě nějakou vybereš.
> [!NOTE]
> T.j. cesta která může jít i proti směru toku $f$.
@ -518,11 +521,11 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
**Srovnání algoritmů Ford-Fulkerson a Push-Relabel**
| Ford-Fulkerson |
| ----------------------- | ------------------------------------ |
| Push-Relabel (Goldberg) | global character |
| local character | update flow along an augmenting path |
| update flow on edges | flow conservation |
| Ford-Fulkerson | Push-Relabel (Goldberg) |
| ------------------------------------ | ----------------------- |
| global character | local character |
| update flow along an augmenting path | update flow on edges |
| flow conservation | preflow |
## Maximální párování v bipartitních grafech
@ -556,9 +559,6 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
![width=300](./img/szp07_mcm_03.png)
[^ib000]: [IB000 Matematické základy informatiky (podzim 2022)](https://is.muni.cz/auth/el/fi/podzim2022/IB000/um/)
[^ib002]: [IB002 Algoritmy a datové struktury (jaro 2020)](https://is.muni.cz/auth/el/fi/jaro2020/IB002/um/)
[^ib003]: [IV003 Algoritmy a datové struktury II (jaro 2021)](https://is.muni.cz/auth/el/fi/jaro2021/IV003/um/)
[^matching]: [Wikipedia: Párování grafu](https://cs.wikipedia.org/wiki/P%C3%A1rov%C3%A1n%C3%AD_grafu)
[^mcm]: [Wikipedia: Maximum cardinality matching](https://en.wikipedia.org/wiki/Maximum_cardinality_matching)

View File

@ -776,7 +776,7 @@ Inverzní funkce je velice užitečná, ale poměrně složitá, takže doufám,
[^edge-detection]: [Wikipedia: Edge detection](https://en.wikipedia.org/wiki/Edge_detection)
[^fourier]: [Wikipedia: Fourier transform](https://en.wikipedia.org/wiki/Fourier_transform)
[^fft]: [Wikipedia: Fast Fourier transform](https://en.wikipedia.org/wiki/Fast_Fourier_transform)
[^samping]: [Wikipedia: Sampling (signal processing)](<https://en.wikipedia.org/wiki/Sampling_(signal_processing)>)
[^sampling]: [Wikipedia: Sampling (signal processing)](<https://en.wikipedia.org/wiki/Sampling_(signal_processing)>)
[^scaling]: [Wikipedia: Image scaling](https://en.wikipedia.org/wiki/Image_scaling)
[^n-s]: [Wikipedia: NyquistShannon sampling theorem](https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem)
[^geometric-transform]: [Wikipedia: Geometric transformation](https://en.wikipedia.org/wiki/Geometric_transformation)

View File

@ -4,7 +4,7 @@ description: "TODO"
---
> [!WARNING]
> Tato je stará verze otázky. Nová verze: [Grafické principy ve vývoji her](../VPH01_graficke_principy_ve_vyvoji_her).
> Tato je stará verze otázky. Nová verze: [Grafické principy ve vývoji her](../vph01_graficke_principy_ve_vyvoji_her).
> [!NOTE]
> Techniky aproximace objektů. Renderování objemových dat (bodový mrak, techniky rekonstrukce povrchů, přímé renderování objemu). Lokální a globální modely nasvícení. Renderování založené na fyzikálních modelech (PBR). Techniky renderování stínů.

View File

@ -4,7 +4,7 @@ description: "TODO"
---
> [!WARNING]
> Tato je stará verze otázky. Nová verze: [Fyzikální principy ve vývoji her](../VPH02_fyzikalni_principy_ve_vyvoji_her).
> Tato je stará verze otázky. Nová verze: [Fyzikální principy ve vývoji her](../vph02_fyzikalni_principy_ve_vyvoji_her).
> [!NOTE]
> Příprava a vývoj scény, grayboxing, zástupné modely (placeholders). Optimalizace výkonu vykreslování (úrovně detailů, odstřelování objektů, MIP mapy). Využití shaderů pro efekty ve hrách. Sledování paprsků, objekty pro detekci kolizí, fyzika hadrové panenky.

View File

@ -72,9 +72,10 @@ Hry se dají (poměrně hnidopišsky a rozhodně ne jednoznačně) rozdělit na:
- **Konzolová hra (console game)**\
Digitální videohra určená pro herní konzoli (PlayStation, Xbox, Nintendo Switch, ...).
Useless fun fact: _Xbox_ je zkratka pro _DirectX Box_. DirectX zastřešuje několik API jako je _Direct3D_, _DirectPlay_, _DirectSound_, _DirectInput_ atd.
Takže _Xbox X_ je vlastně _DirectX Box X_. Microsoft fakt neumí pojmenovávat věci.
> [!NOTE]
> Useless fun fact: _Xbox_ je zkratka pro _DirectX Box_. DirectX zastřešuje několik API jako je _Direct3D_, _DirectPlay_, _DirectSound_, _DirectInput_ atd.
>
> Takže _Xbox X_ je vlastně _DirectX Box X_. Microsoft fakt neumí pojmenovávat věci.
- **Hádanka**\
Hádanka je drobný slovesný projev v podobě hříčky, která v náznaku předkládá určitý problém, k jehož řešení lze dospět důvtipem nebo logickou úvahou [^hadanka].
@ -92,17 +93,17 @@ Lidi jsou různí a různí lidi hrají různé hry různě.
- **Socializer**\
Interaguje s ostatními hráči. Je pyšný na to, že se s ostatními hráči přátelí, že má kontakty a vliv.
What happened? I missed it, I was talking.
> What happened? I missed it, I was talking.
- **Killer**\
Působí na ostatní hráče. Záleží mu na jeho skillech a reputaci.
Die!
> Die!
- **Achiever**\
Snaží se dosáhnout cílů ve světě. Záleží mu na jeho postavení v rámci herní hierarchie a na tom, jak rychle se tam dostal.
Only 4211 points to go!
> Only 4211 points to go!
- **Explorer**\
Snaží se objevovat a poznávat svět. Je hrdý na hloubku svých znalostí o světě.
@ -245,7 +246,7 @@ Game designer produkuje taky hromady abstraktních teorií o herním designu.
> - It's expensive whether it's **high or low quality**.
> - It's a **fuel for magic**.
> - **Without doing something with it it's useless**.
>
> — Ano&comma; stále ZZ
### Analytická činnost
@ -270,7 +271,7 @@ Při balancování hry designer úmyslně ničí svoji hru, aby odhalil její hr
- Chápej **numerické / elementální atributy** svojí hry.
### Komunikační činnost
Zjednodušit a předat informace o tom co fungeje a co ne ostatním. Musí umět obhájit své návrhy.
Zjednodušit a předat informace o tom co funguje a co ne ostatním. Musí umět obhájit své návrhy.
## The Core Game Ontology

View File

@ -37,7 +37,7 @@ I přes to, že je game engine obecný, neznamená to, že v něm dokážeme (ro
- Crash reporty
- Debug gizmos (debug ray, box, sphere...)
- Debug menu a konzole
- **Zvkuk**\
- **Zvuk**\
Speciální engine pro zvuk, často middleware jako FMOD nebo Wwise.
- **Graphics**\
Zařizuje vykreslování grafiky, osvětlení, stíny, postprocessing, atd.

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@ -1,25 +0,0 @@
import { visit } from 'unist-util-visit';
export default function rehypeCustomFootnotes() {
return (tree: any) => {
visit(tree, 'element', (node) => {
if (
node.tagName === 'h2' &&
node.properties?.id === 'footnote-label'
) {
node.children[0].value = 'Zdroje'; // Change heading text
}
if (
node.tagName === 'span' &&
node.properties?.className?.includes('sr-only') &&
node.children?.[0]?.value?.startsWith('Section titled')
) {
node.children[0].remove;
}
});
};
}

View File

@ -0,0 +1,34 @@
import { visit } from 'unist-util-visit';
export default function rehypeCustomization() {
return (tree: any) => {
visit(tree, 'element', (node) => {
// Change the footnotes heading text (hard-wired to "Footnotes")
// by Astro or remark (not sure)
if (
node.tagName === 'h2' &&
node.properties?.id === 'footnote-label'
) {
node.children[0].value = 'Zdroje';
}
// Embed SVG icons instead of using inline style supplying data url
if (
node.tagName === 'span' &&
node.properties?.class?.includes("octicon")
) {
let octicon_kind = node.properties.class.split(" ")[1]
node.tagName = "img"
node.properties.src = `/icons/${octicon_kind}.svg`
node.properties.alt = octicon_kind
node.properties.class = `custom-octicon`
node.properties.style = ""
}
});
};
}

View File

@ -0,0 +1,58 @@
.site-title img {
image-rendering: pixelated;
}
img[alt="width=30%"] {
width: 30%;
display: inline;
}
img[alt="width=69%"] {
width: 69%;
display: inline;
}
img[alt="width=49%"] {
width: 49%;
display: inline;
}
img[alt="width=150"] {
width: 150px;
margin: auto;
}
img[alt="width=200"] {
width: 200px;
margin: auto;
}
img[alt="width=300"] {
width: 300px;
margin: auto;
}
img[alt="width=400"] {
width: 400px;
margin: auto;
}
img[alt="width=500"] {
width: 500px;
margin: auto;
}
img[alt="width=600"] {
width: 600px;
margin: auto;
}
img[alt="width=700"] {
width: 700px;
margin: auto;
}
/* Github callout icons */
.custom-octicon {
margin-right: .5rem;
overflow: visible !important;
display: inline-block;
vertical-align: text-bottom;
width: 1em;
height: 1em;
}

View File

@ -1,3 +0,0 @@
.site-title img {
image-rendering: pixelated;
}

View File

@ -0,0 +1,10 @@
@media print {
h2,
h3 {
break-after: avoid-page;
}
.markdown-alert, .markdown-alert * {
break-inside: avoid-page;
}
}

View File

@ -36,4 +36,26 @@
blockquote {
font-style: italic;
}
.fortunate-brain {
position: relative;
width: 100%;
text-align: center;
display: flex;
flex-direction: row;
justify-content: center;
}
.fortunate-brain::before {
background-image: url("/icons/fortunate_brain_32.png");
background-repeat: no-repeat;
background-size: contain;
image-rendering: pixelated;
inset: 0;
width: 5rem;
height: 5rem;
opacity: .7;
display: block;
content: " ";
}

View File

@ -50,6 +50,11 @@ for f in files:
search = f"../{url}"
if search in l:
lines[i] = l.replace(search, f"../{links[url].lower()}")
l = lines[i]
for filename in links.values():
if filename in l:
lines[i] = l.replace(filename, filename.lower())
with open(os.path.join(TARGET_DIR, f), "w") as file:
file.writelines(lines)