Compare commits
No commits in common. "main" and "1.0" have entirely different histories.
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "fi"]
|
||||
path = fi
|
||||
url = https://github.com/cafour/fi
|
@ -4,41 +4,34 @@ import starlight from '@astrojs/starlight';
|
||||
import remarkGithubAlerts from 'remark-github-alerts';
|
||||
import remarkMath from 'remark-math';
|
||||
import rehypeKatex from 'rehype-katex';
|
||||
import rehypeCustomization from './src/plugins/rehype-plugins';
|
||||
import rehypeCustomFootnotes from './src/plugins/custom-footnote';
|
||||
|
||||
|
||||
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
site: "https://fi.vojtechstruhar.com",
|
||||
markdown: {
|
||||
|
||||
remarkPlugins: [remarkGithubAlerts, remarkMath],
|
||||
rehypePlugins: [rehypeKatex, rehypeCustomization]
|
||||
rehypePlugins: [rehypeKatex, rehypeCustomFootnotes]
|
||||
},
|
||||
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-base.css",
|
||||
"remark-github-alerts/styles/github-colors-light.css",
|
||||
"remark-github-alerts/styles/github-colors-dark-class.css",
|
||||
"remark-github-alerts/styles/github-base.css",
|
||||
"katex/dist/katex.min.css",
|
||||
"./src/styles/theme.css",
|
||||
"./src/styles/footnotes-fix.css",
|
||||
"./src/styles/images-adjustment.css",
|
||||
"./src/styles/pixelated-logo.css",
|
||||
"./src/styles/scroll-fix.css",
|
||||
"./src/styles/print-improvements.css",
|
||||
],
|
||||
sidebar: [
|
||||
{
|
||||
@ -92,6 +85,8 @@ export default defineConfig({
|
||||
"szmgr/pgv09_minimalizace_energie",
|
||||
"szmgr/pgv10_zpracovani_obrazu_pomoci_pde",
|
||||
"szmgr/pgv_zpracovani_obrazu_intro",
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
|
||||
|
@ -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
@ -1 +0,0 @@
|
||||
Subproject commit e08e804aab28594fa2fc0dbd5d2ecf03efe60d8f
|
@ -19,4 +19,4 @@
|
||||
"sharp": "^0.32.5",
|
||||
"unist-util-visit": "^5.0.0"
|
||||
}
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 187 B |
1
public/favicon.svg
Normal file
@ -0,0 +1 @@
|
||||
<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>
|
After Width: | Height: | Size: 696 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 271 B |
Before Width: | Height: | Size: 300 B |
Before Width: | Height: | Size: 267 B |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 187 B |
@ -1,6 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 860 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 398 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 121 B |
Before Width: | Height: | Size: 1007 B |
@ -1 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 576 B |
@ -1 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 609 B |
@ -1 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 437 B |
@ -1 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 889 B |
@ -1 +0,0 @@
|
||||
<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>
|
Before Width: | Height: | Size: 493 B |
Before Width: | Height: | Size: 295 B |
Before Width: | Height: | Size: 1.0 KiB |
@ -1,8 +0,0 @@
|
||||
function loadAllImages() {
|
||||
document.querySelectorAll('img[loading="lazy"]').forEach(img => {
|
||||
img.setAttribute('loading', 'eager');
|
||||
});
|
||||
}
|
||||
|
||||
// Before printing (manually or via browser)
|
||||
window.addEventListener('beforeprint', loadAllImages);
|
@ -3,14 +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](https://github.com/cafour/fi). Contributions are welcome!
|
||||
|
||||
> [!NOTE]
|
||||
> 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.
|
||||
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
|
||||
|
||||
> [!NOTE]
|
||||
> Work in progress!
|
||||
|
||||
- [SZMGR Státní zkouška (magisterský studijní program)](/szmgr)
|
||||
|
||||
## Thesis Checklist
|
||||
|
@ -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
|
||||
|
||||
|
@ -17,10 +17,8 @@ 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
|
||||
\begin{aligned}
|
||||
f(x + h) \approx &\ f(x) + hf'(x)\\
|
||||
f'(x) \approx &\ \frac{f(x + h) - f(x)}{h}
|
||||
\end{aligned}
|
||||
f(x + h) \approx f(x) + hf'(x)\\
|
||||
f'(x) \approx \frac{f(x + h) - f(x)}{h}
|
||||
```
|
||||
|
||||
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):
|
||||
@ -28,11 +26,9 @@ 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) \\
|
||||
\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}
|
||||
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}
|
||||
```
|
||||
|
||||
Podobným stylem získáme i druhou derivaci
|
||||
|
@ -388,6 +388,249 @@ 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
|
||||
|
@ -77,25 +77,6 @@ description: "TODO"
|
||||
3. Opakujeme 2. dokud nedosáhneme požadované přesnosti odhadu.
|
||||
|
||||

|
||||
|
||||
|
||||
> [!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:
|
||||
@ -115,11 +96,6 @@ description: "TODO"
|
||||
|
||||
kde $s$ je největší index takový, že $f(x_k)f(x_s) < 0$.
|
||||
|
||||

|
||||
|
||||
- **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
|
||||
|
@ -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,18 +219,42 @@ 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 |
|
||||
| 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
|
||||
|
||||
2+|
|
||||
|
||||
| `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.
|
||||
@ -298,7 +322,7 @@ description: "TODO"
|
||||
### Změna struktury sítě
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 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/)
|
||||
> 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/)
|
||||
|
||||
- **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]
|
||||
|
@ -377,9 +377,6 @@ 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.
|
||||
|
||||

|
||||
|
||||
|
||||
Lze ji definovat pomocí **Cox-de Boorovy** rekurzivní formule:
|
||||
|
||||
> [!TIP]
|
||||
@ -684,4 +681,5 @@ 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/)
|
||||
|
||||
<div class="fortunate-brain"></div>
|
||||
<div class="fortunate-brain">
|
||||
</div>
|
||||
|
@ -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,7 +286,6 @@ 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**\
|
||||
@ -325,14 +324,13 @@ 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). ReLU je náchylná k explozi hodnoty neuronu. Třeba sigmoid je v tomto lepší. [V RNN se typicky používá tanh.](#LTSM)
|
||||
- Gradient může explodovat (exploding) nebo zaniknout (diminishing).
|
||||
|
||||

|
||||
|
||||
@ -383,11 +381,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'
|
||||
@ -400,7 +398,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}
|
||||
```
|
||||
|
||||
@ -410,7 +408,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'}}}
|
||||
@ -428,7 +426,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: <a id="LTSM"></a>
|
||||
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:
|
||||
|
||||

|
||||
|
||||
|
@ -135,9 +135,6 @@ 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) \
|
||||
@ -229,9 +226,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ě. Červená hrana znamená odebrání z finální kostry.
|
||||
Najdi cyklus bez červených hran, vyber v něm **neobarvenou** hranu s **nejvyšší** cenou a obarvi ji červeně.
|
||||
- **Blue rule**\
|
||||
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.
|
||||
Najdi řez bez modrých hran, vyber v něm **neobarvenou** hranu s **nejmenší** cenou a obarvi ji modře.
|
||||
- **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**\
|
||||
@ -308,7 +305,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 povolenou kapacitu_
|
||||
- _tok hranou je nezáporný a nepřevyšuje povolennou 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_
|
||||
|
||||
@ -335,7 +332,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$. Cesty hledáš buď BFS nebo DFS - každou iteraci si prostě nějakou vybereš.
|
||||
Jednoduchá $s \rightsquigarrow t$ cesta v residuální síti $G_f$.
|
||||
|
||||
> [!NOTE]
|
||||
> T.j. cesta která může jít i proti směru toku $f$.
|
||||
@ -521,11 +518,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 | preflow |
|
||||
| Ford-Fulkerson |
|
||||
| ----------------------- | ------------------------------------ |
|
||||
| Push-Relabel (Goldberg) | global character |
|
||||
| local character | update flow along an augmenting path |
|
||||
| update flow on edges | flow conservation |
|
||||
|
||||
## Maximální párování v bipartitních grafech
|
||||
|
||||
@ -559,6 +556,9 @@ Dijkstrův algoritmus lze optimalizovat, pokud nás zajímá jen nejkratší ces
|
||||
|
||||

|
||||
|
||||
[^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)
|
||||
|
||||
|
@ -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)
|
||||
[^sampling]: [Wikipedia: Sampling (signal processing)](<https://en.wikipedia.org/wiki/Sampling_(signal_processing)>)
|
||||
[^samping]: [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: Nyquist–Shannon 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)
|
||||
|
@ -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ů.
|
||||
|
@ -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.
|
||||
|
@ -72,10 +72,9 @@ 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, ...).
|
||||
|
||||
> [!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.
|
||||
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].
|
||||
@ -93,17 +92,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ě.
|
||||
@ -246,7 +245,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, stále ZZ
|
||||
|
||||
### Analytická činnost
|
||||
@ -271,7 +270,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 funguje a co ne ostatním. Musí umět obhájit své návrhy.
|
||||
Zjednodušit a předat informace o tom co fungeje a co ne ostatním. Musí umět obhájit své návrhy.
|
||||
|
||||
## The Core Game Ontology
|
||||
|
||||
|
@ -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
|
||||
- **Zvuk**\
|
||||
- **Zvkuk**\
|
||||
Speciální engine pro zvuk, často middleware jako FMOD nebo Wwise.
|
||||
- **Graphics**\
|
||||
Zařizuje vykreslování grafiky, osvětlení, stíny, postprocessing, atd.
|
||||
|
Before Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 173 KiB |
25
src/plugins/custom-footnote.ts
Normal file
@ -0,0 +1,25 @@
|
||||
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;
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1,34 +0,0 @@
|
||||
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 = ""
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1,58 +0,0 @@
|
||||
.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;
|
||||
}
|
3
src/styles/pixelated-logo.css
Normal file
@ -0,0 +1,3 @@
|
||||
.site-title img {
|
||||
image-rendering: pixelated;
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
@media print {
|
||||
h2,
|
||||
h3 {
|
||||
break-after: avoid-page;
|
||||
}
|
||||
|
||||
.markdown-alert, .markdown-alert * {
|
||||
break-inside: avoid-page;
|
||||
}
|
||||
}
|
@ -36,26 +36,4 @@
|
||||
|
||||
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: " ";
|
||||
}
|
@ -50,11 +50,6 @@ 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)
|