From 403f7f05957600db3e966372216e315b5a6cc79c Mon Sep 17 00:00:00 2001 From: Pomax Date: Sun, 10 Jan 2021 13:17:36 -0800 Subject: [PATCH] some fixes --- .github/workflows/ci.yml | 2 +- .github/workflows/post-merge.yml | 2 +- docs/chapters/explanation/content.ru-RU.md | 14 +- docs/chapters/weightcontrol/content.ru-RU.md | 7 +- .../501494295f07ba5049286489206d98f0.svg | 1 + .../501494295f07ba5049286489206d98f0.svg | 1 + .../8324bf1885267fe157bf316e261d1b30.svg | 1 + .../bec017d11e19b45df562c5a223761a69.svg | 1 + .../d575699ab7d13c62f47d3071c0b00da3.svg | 1 + .../05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg | 1 + .../6d58ec36bfb3fcff24248dc46889428a.svg | 1 + .../dc48cdf8f492b44c7602eb64ce2b9986.svg | 1 + .../fa3ed9a4ab61d80ec175d29533b5728e.svg | 1 + .../e0600b3be5b95f105a1cf2a2c0378b98.svg | 2 +- .../501494295f07ba5049286489206d98f0.ascii | 7 + .../501494295f07ba5049286489206d98f0.ascii | 7 + .../8324bf1885267fe157bf316e261d1b30.ascii | 7 + .../bec017d11e19b45df562c5a223761a69.ascii | 7 + .../d575699ab7d13c62f47d3071c0b00da3.ascii | 5 + .../05c2d5954eb9dec5ce9f6eb7e89f1e0c.ascii | 8 + .../6d58ec36bfb3fcff24248dc46889428a.ascii | 6 + .../dc48cdf8f492b44c7602eb64ce2b9986.ascii | 7 + .../fa3ed9a4ab61d80ec175d29533b5728e.ascii | 5 + docs/index.html | 4 +- docs/ja-JP/index.html | 4 +- docs/news/2020-09-18.html | 4 +- docs/news/2020-11-22.html | 4 +- docs/news/index.html | 2 +- docs/news/rss.xml | 6 +- docs/ru-RU/index.html | 540 +++++++++--------- docs/uk-UA/index.html | 4 +- docs/zh-CN/index.html | 4 +- .../markdown/processors/latex/latex-to-svg.js | 9 + 33 files changed, 382 insertions(+), 294 deletions(-) create mode 100644 docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg create mode 100644 docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg create mode 100644 docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg create mode 100644 docs/images/chapters/derivatives/bec017d11e19b45df562c5a223761a69.svg create mode 100644 docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg create mode 100644 docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg create mode 100644 docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg create mode 100644 docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg create mode 100644 docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg create mode 100644 docs/images/snippets/control/501494295f07ba5049286489206d98f0.ascii create mode 100644 docs/images/snippets/derivatives/501494295f07ba5049286489206d98f0.ascii create mode 100644 docs/images/snippets/derivatives/8324bf1885267fe157bf316e261d1b30.ascii create mode 100644 docs/images/snippets/derivatives/bec017d11e19b45df562c5a223761a69.ascii create mode 100644 docs/images/snippets/derivatives/d575699ab7d13c62f47d3071c0b00da3.ascii create mode 100644 docs/images/snippets/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.ascii create mode 100644 docs/images/snippets/explanation/6d58ec36bfb3fcff24248dc46889428a.ascii create mode 100644 docs/images/snippets/explanation/dc48cdf8f492b44c7602eb64ce2b9986.ascii create mode 100644 docs/images/snippets/explanation/fa3ed9a4ab61d80ec175d29533b5728e.ascii diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d606ddb..145dac94 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Installing TeX Live run: | sudo apt-get update - sudo apt-get install xzdec libpoppler-glib-dev texlive texlive-xetex texlive-extra-utils -y + sudo apt-get install xzdec libpoppler-glib-dev texlive texlive-xetex texlive-fonts-extra texlive-math-extra texlive-extra-utils -y - name: Installing pdf2svg run: | diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml index 6e0d85c1..abcfd888 100644 --- a/.github/workflows/post-merge.yml +++ b/.github/workflows/post-merge.yml @@ -25,7 +25,7 @@ jobs: - name: Installing TeX Live run: | sudo apt-get update - sudo apt-get install xzdec libpoppler-glib-dev texlive texlive-xetex texlive-extra-utils -y + sudo apt-get install xzdec libpoppler-glib-dev texlive texlive-xetex texlive-fonts-extra texlive-math-extra texlive-extra-utils -y - name: Installing pdf2svg run: | diff --git a/docs/chapters/explanation/content.ru-RU.md b/docs/chapters/explanation/content.ru-RU.md index 0fc1060a..b371f979 100644 --- a/docs/chapters/explanation/content.ru-RU.md +++ b/docs/chapters/explanation/content.ru-RU.md @@ -19,7 +19,7 @@ \end{matrix} \] -Итак, нам представлены две функции. Ничего особо выдающегося: просто функции синуса и косинуса. Отметим, что, как вы можете видеть, вводные переменные разные. Затем, меняя значение a, мы не влияем на вывод f(b), поскольку a никак не задействована в этой функции. Параметрические функции хитрят именно с этим: весь набор функций вывода делит между собой одну или более переменную вводную. Как здесь: +Итак, нам представлены две функции. Ничего особо выдающегося: просто функции синуса и косинуса. Отметим, что, как вы можете видеть, вводные переменные разные. Затем, меняя значение a, мы не влияем на вывод f(b), поскольку a никак не задействована в этой функции. Параметрические функции хитрят именно с этим: весь набор функций вывода делит между собой одну или более переменную вводную. Как здесь: \[ \left \{ \begin{matrix} @@ -28,7 +28,7 @@ \end{matrix} \right. \] -Что же, несколько функций, и всего одна вводная. Меняя значение t — меняем вывод обеих ф-ций, fa(t) и fb(t). Возможно вы спросите: "в чем же польза?". Ответ прост и очевиден, если уточнить, что мы имеем ввиду под записью наших функций: +Что же, несколько функций, и всего одна вводная. Меняя значение t — меняем вывод обеих ф-ций, fa(t) и fb(t). Возможно вы спросите: "в чем же польза?". Ответ прост и очевиден, если уточнить, что мы имеем ввиду под записью наших функций: \[ \left \{ \begin{matrix} @@ -45,7 +45,7 @@ -Кривые Безье — всего один из многих классов параметрических функций. Их главной характеристикой есть использование одной и той же базовой функции для генерации всех выводов. До сих пор, в использованном нами примере, мы производили значения x и y с помощью разных функций (ф-цией синуса и ф-цией косинуса); Безье же использует единый "биноминальный полином" для вывода обоих значений. Но что же такое "биноминальный полином"? +Кривые Безье — всего один из многих классов параметрических функций. Их главной характеристикой есть использование одной и той же базовой функции для генерации всех выводов. До сих пор, в использованном нами примере, мы производили значения x и y с помощью разных функций (ф-цией синуса и ф-цией косинуса); Безье же использует единый "биноминальный полином" для вывода обоих значений. Но что же такое "биноминальный полином"? Возможно, вы помните полиномы из школьной программы. Они выглядят следующим образом: @@ -138,8 +138,7 @@ function binomial(n,k): return lut[n][k] ``` -Итак, что же здесь происходит? Сначала мы декларируем таблицу достаточного размера для удовлетворения большинства запросов. Далее мы заявляем функцию вывода необходимого значения, вытаскивая его из таблицы, предварительно убедившись, что значения для запрашиваемых n/k присутствуют в наборе и расширяя набор по необходимости (если не присутствуют). Наша базовая функция теперь выглядит типа этого: - +Итак, что же здесь происходит? Сначала мы декларируем таблицу достаточного размера для удовлетворения большинства запросов. Далее мы заявляем функцию вывода необходимого значения, вытаскивая его из таблицы, предварительно убедившись, что значения для запрашиваемых n/k присутствуют в наборе и расширяя набор по необходимости (если не присутствуют). Наша базовая функция теперь выглядит типа этого: ``` function Bezier(n,t): @@ -147,11 +146,10 @@ function Bezier(n,t): for(k=0; k<=n; k++): sum += binomial(n,k) * (1-t)^(n-k) * t^(k) return sum -``` +``` Отлично. Конечно, мы можем оптимизировать ее и далее. Для большинства задач компьютерной графики нам не потребуются кривые произвольного порядка (хотя мы приводим код для произвольных кривых в этом пособии); зачастую нам нужны квадратные и кубические кривые, а это значит, мы можем значительно упростить весь наш код: - ``` function Bezier(2,t): t2 = t * t @@ -172,4 +170,4 @@ function Bezier(3,t): -Итак, зная как выглядят базовые функции, время добавить магию делающую кривые Безье такими особенными: контрольные точки. \ No newline at end of file +Итак, зная как выглядят базовые функции, время добавить магию делающую кривые Безье такими особенными: контрольные точки. diff --git a/docs/chapters/weightcontrol/content.ru-RU.md b/docs/chapters/weightcontrol/content.ru-RU.md index 54cb4d21..35a02c89 100644 --- a/docs/chapters/weightcontrol/content.ru-RU.md +++ b/docs/chapters/weightcontrol/content.ru-RU.md @@ -6,7 +6,7 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i -\] +\] Функция для соотносительных кривых Безье имеет два дополнительных термина: @@ -29,15 +29,14 @@ -Вы можете думать о значениях соотношений, как о показателе силы притяжения соответствующей точки. Чем выше сила притяжения, тем больше наша кривая будет стремится к этой точке. Вы также можете наблюдать, что одинаковое увеличение или уменьшение всех показателей не оказывает никакого эффекта на результат... схоже с гравитацией: если значения остаются одинаковыми относительно друг-друга, на выводе ничего не меняется. Значения соотношений определяют влияние каждой координаты _относительно всех остальных координат_. +Вы можете думать о значениях соотношений, как о показателе силы притяжения соответствующей точки. Чем выше сила притяжения, тем больше наша кривая будет стремится к этой точке. Вы также можете наблюдать, что одинаковое увеличение или уменьшение всех показателей не оказывает никакого эффекта на результат... схоже с гравитацией: если значения остаются одинаковыми относительно друг-друга, на выводе ничего не меняется. Значения соотношений определяют влияние каждой координаты _относительно всех остальных координат_.
-### Имплементация соотносительных кривых +### Имплементация соотносительных кривых Дополнение кода из предыдущей секции для учета этой функциональности фактически тривиально: - ``` function RationalBezier(2,t,w[],r[]): t2 = t * t diff --git a/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg new file mode 100644 index 00000000..7b88284c --- /dev/null +++ b/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg new file mode 100644 index 00000000..7b88284c --- /dev/null +++ b/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg b/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg new file mode 100644 index 00000000..f14eff34 --- /dev/null +++ b/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/bec017d11e19b45df562c5a223761a69.svg b/docs/images/chapters/derivatives/bec017d11e19b45df562c5a223761a69.svg new file mode 100644 index 00000000..4013e2f2 --- /dev/null +++ b/docs/images/chapters/derivatives/bec017d11e19b45df562c5a223761a69.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg b/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg new file mode 100644 index 00000000..ce4840f5 --- /dev/null +++ b/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg b/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg new file mode 100644 index 00000000..f82f95bc --- /dev/null +++ b/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg b/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg new file mode 100644 index 00000000..ed6c08d3 --- /dev/null +++ b/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg b/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg new file mode 100644 index 00000000..4c2c8df8 --- /dev/null +++ b/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg b/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg new file mode 100644 index 00000000..769caa5b --- /dev/null +++ b/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg b/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg index 3cbe841a..785f4fb5 100644 --- a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg +++ b/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/snippets/control/501494295f07ba5049286489206d98f0.ascii b/docs/images/snippets/control/501494295f07ba5049286489206d98f0.ascii new file mode 100644 index 00000000..b3ba22fe --- /dev/null +++ b/docs/images/snippets/control/501494295f07ba5049286489206d98f0.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomni · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/derivatives/501494295f07ba5049286489206d98f0.ascii b/docs/images/snippets/derivatives/501494295f07ba5049286489206d98f0.ascii new file mode 100644 index 00000000..b3ba22fe --- /dev/null +++ b/docs/images/snippets/derivatives/501494295f07ba5049286489206d98f0.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomni · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/derivatives/8324bf1885267fe157bf316e261d1b30.ascii b/docs/images/snippets/derivatives/8324bf1885267fe157bf316e261d1b30.ascii new file mode 100644 index 00000000..2df56415 --- /dev/null +++ b/docs/images/snippets/derivatives/8324bf1885267fe157bf316e261d1b30.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ k k-i i +Bézier'(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomki · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес производной\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/bec017d11e19b45df562c5a223761a69.ascii b/docs/images/snippets/derivatives/bec017d11e19b45df562c5a223761a69.ascii new file mode 100644 index 00000000..fe90410a --- /dev/null +++ b/docs/images/snippets/derivatives/bec017d11e19b45df562c5a223761a69.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ x! y x-y x! k x-k ╮ + ... = n │ ──────── t (1-t) - ──────── t (1-t) │ , где x=n-1, y=k-1 + ╰ y!(x-y)! k!(x-k)! ╯ + ... = n (B (t) - B (t)) + (n-1),(k-1) (n-1),k diff --git a/docs/images/snippets/derivatives/d575699ab7d13c62f47d3071c0b00da3.ascii b/docs/images/snippets/derivatives/d575699ab7d13c62f47d3071c0b00da3.ascii new file mode 100644 index 00000000..49ef779a --- /dev/null +++ b/docs/images/snippets/derivatives/d575699ab7d13c62f47d3071c0b00da3.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + d __ n-1 __ n-1 + Bézier (t) ── = ❯ n · B (t) · (w - w ) = ❯ B (t) · \undersetвес производной \underbracen · (w - w ) + n,k dt ‾‾ k=0 n-1,k k+1 k ‾‾ k=0 n-1,k k+1 k diff --git a/docs/images/snippets/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.ascii b/docs/images/snippets/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.ascii new file mode 100644 index 00000000..73a8e836 --- /dev/null +++ b/docs/images/snippets/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.ascii @@ -0,0 +1,8 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + линийный= \colorbluea + \colorredb + квадратый= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb +кубический= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorred + + + b · \colorredb · \colorredb diff --git a/docs/images/snippets/explanation/6d58ec36bfb3fcff24248dc46889428a.ascii b/docs/images/snippets/explanation/6d58ec36bfb3fcff24248dc46889428a.ascii new file mode 100644 index 00000000..93178bfc --- /dev/null +++ b/docs/images/snippets/explanation/6d58ec36bfb3fcff24248dc46889428a.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + линийный= 1 + 1 + квадратый= 1 + 2 + 1 + кубический= 1 + 3 + 3 + 1 + квартический= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/explanation/dc48cdf8f492b44c7602eb64ce2b9986.ascii b/docs/images/snippets/explanation/dc48cdf8f492b44c7602eb64ce2b9986.ascii new file mode 100644 index 00000000..c54bc68a --- /dev/null +++ b/docs/images/snippets/explanation/dc48cdf8f492b44c7602eb64ce2b9986.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + линейный= (1-t) + t + 2 2 + квадратный= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + кубический= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/fa3ed9a4ab61d80ec175d29533b5728e.ascii b/docs/images/snippets/explanation/fa3ed9a4ab61d80ec175d29533b5728e.ascii new file mode 100644 index 00000000..2427f1f1 --- /dev/null +++ b/docs/images/snippets/explanation/fa3ed9a4ab61d80ec175d29533b5728e.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + Bézier(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomni · \ \undersetполиноминальный термин\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/index.html b/docs/index.html index 6a242690..49e2ec9c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@ - + @@ -134,7 +134,7 @@
  • English  
  • 日本語 (24%)
  • 中文 (22%)
  • -
  • Русский (4%)
  • +
  • Русский (15%)
  • Українська (2%)
  • diff --git a/docs/ja-JP/index.html b/docs/ja-JP/index.html index b2726207..d8ff35ee 100644 --- a/docs/ja-JP/index.html +++ b/docs/ja-JP/index.html @@ -41,7 +41,7 @@ - + @@ -137,7 +137,7 @@

  • English  
  • 日本語 (24%)
  • 中文 (22%)
  • -
  • Русский (4%)
  • +
  • Русский (15%)
  • Українська (2%)
  • diff --git a/docs/news/2020-09-18.html b/docs/news/2020-09-18.html index 3e47723e..7bffadaf 100644 --- a/docs/news/2020-09-18.html +++ b/docs/news/2020-09-18.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/2020-11-22.html b/docs/news/2020-11-22.html index e55f2da5..3ea026e8 100644 --- a/docs/news/2020-11-22.html +++ b/docs/news/2020-11-22.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/index.html b/docs/news/index.html index 5f504e70..bad1684b 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -33,7 +33,7 @@ - + diff --git a/docs/news/rss.xml b/docs/news/rss.xml index 4d8659c9..79c6eeb2 100644 --- a/docs/news/rss.xml +++ b/docs/news/rss.xml @@ -6,7 +6,7 @@ News updates for the primer on Bézier Curves by Pomax en-GB - Fri Dec 25 2020 20:05:37 +00:00 + Sun Jan 10 2021 13:12:37 +00:00 https://pomax.github.io/bezierinfo/images/og-image.png A Primer on Bézier Curves @@ -23,7 +23,7 @@ <p>— <a href="https://twitter.com/TheRealPomax">Pomax</a></p> - Sun Nov 22 2020 00:00:00 +00:00 + Sat Nov 21 2020 16:00:00 +00:00 2020-11-22.html Rewriting the tech stack @@ -119,7 +119,7 @@ draw() { <p>— <a href="https://twitter.com/TheRealPomax">Pomax</a></p> - Fri Sep 18 2020 00:00:00 +00:00 + Thu Sep 17 2020 17:00:00 +00:00 2020-09-18.html diff --git a/docs/ru-RU/index.html b/docs/ru-RU/index.html index c838556c..5b4fe8ba 100644 --- a/docs/ru-RU/index.html +++ b/docs/ru-RU/index.html @@ -34,7 +34,7 @@ - + @@ -127,7 +127,7 @@

  • English  
  • 日本語 (24%)
  • 中文 (22%)
  • -
  • Русский (4%)
  • +
  • Русский (15%)
  • Українська (2%)
  • @@ -187,17 +187,17 @@

    1. Быстрое введение
    2. Итак, из чего сделаны кривые Безье?
    3. -
    4. The mathematics of Bézier curves
    5. -
    6. Controlling Bézier curvatures
    7. -
    8. Controlling Bézier curvatures, part 2: Rational Béziers
    9. -
    10. The Bézier interval [0,1]
    11. +
    12. Математика под кривыми Безье
    13. +
    14. Контроль кривых Безье
    15. +
    16. Контроль над кривыми Безье, часть 2: Соотносительные Безье
    17. +
    18. Интервал Безье [0,1]
    19. Bézier curvatures as matrix operations
    20. de Casteljau's algorithm
    21. Simplified drawing
    22. Splitting curves
    23. Splitting curves using matrices
    24. Lowering and elevating curve order
    25. -
    26. Derivatives
    27. +
    28. Производные кривых Безье
    29. Tangents and normals
    30. Working with 3D normals
    31. Component functions
    32. @@ -558,7 +558,7 @@ │ соотношение= ───────── │ ╰ 100 ╯ --> - +

      Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, @@ -597,17 +597,17 @@

      - The mathematics of Bézier curves + Математика под кривыми Безье

      - Bézier curves are a form of "parametric" function. Mathematically speaking, parametric functions are cheats: a "function" is actually a - well defined term representing a mapping from any number of inputs to a single output. Numbers go in, a single number - comes out. Change the numbers that go in, and the number that comes out is still a single number. + Кривые Безье по своей форме представляют собой параметрические функции. С точки зрения математики, эти функции хитрят, поскольку разнятся + с каноническим определением функции. Последнее есть преобразованием любого количества вводных в единый результат. Как бы + мы не меняли вводные значения переменных, на выходе всегда получим одно значение.

      - Parametric functions cheat. They basically say "alright, well, we want multiple values coming out, so we'll just use more than one - function". An illustration: Let's say we have a function that maps some value, let's call it x, to some other value, using some - kind of number manipulation: + Параметрические функции хитрят, потому как говоря: "что ж, ладно, нам нужно произвести более одного вывода", заключают, попросту: "давайте + использовать более одной функции". Проиллюстрируем: представьте что есть функция, которая преобразует вводную, назовем ее x, в + другое значение следуя определенной логике

      - The notation f(x) is the standard way to show that it's a function (by convention called f if we're only listing one) and - its output changes based on one variable (in this case, x). Change x, and the output for f(x) changes. + Нотация f(x) есть стандартным способом записи функции (по конвенции, f, когда представлена всего одна) и ее вывод меняется в + зависимости от значения одной переменной (в данном случае, x). Так, изменив x и получим другой результат f(x). +

      +

      + Пока все логично. Теперь, давайте рассмотрим параметрические функции в действии и разберемся в чем их фокус. И, для начала, примите ко + внимаю следующий пример:

      -

      So far, so good. Now, let's look at parametric functions, and how they cheat. Let's take the following two functions:

      - There's nothing really remarkable about them, they're just a sine and cosine function, but you'll notice the inputs have different names. - If we change the value for a, we're not going to change the output value for f(b), since a isn't used in that - function. Parametric functions cheat by changing that. In a parametric function all the different functions share a variable, like this: + Итак, нам представлены две функции. Ничего особо выдающегося: просто функции синуса и косинуса. Отметим, что, как вы можете видеть, + вводные переменные разные. Затем, меняя значение a, мы не влияем на вывод f(b), поскольку a никак не задействована в + этой функции. Параметрические функции хитрят именно с этим: весь набор функций вывода делит между собой одну или более переменную вводную. + Как здесь:

      -

      There we go. x/y coordinates, linked through some mystery value t.

      +

      Так-то. Координаты x/y. Связанные мистическим значением t.

      - So, parametric curves don't define a y coordinate in terms of an x coordinate, like normal functions do, but they instead - link the values to a "control" variable. If we vary the value of t, then with every change we get two values, - which we can use as (x,y) coordinates in a graph. The above set of functions, for instance, generates points on a circle: We - can range t from negative to positive infinity, and the resulting (x,y) coordinates will always lie on a circle with - radius 1 around the origin (0,0). If we plot it for t from 0 to 5, we get this: + Таким образом, мы видим, что параметрические функции не определяют значение y через значение x, как обычные ф-ции, вместо + этого они выводят и x и y из мистического значения t. Значит, для каждого значения t, существуют два + соответствующих значения x и y, которые мы можем использовать для зарисовки кривой на графике. К примеру, приведенная выше + параметрическая функция выводит координаты точки на круге: можно подставить любое значение t (от негативной до позитивной + бесконечности), и на выводе мы всегда получим координаты точки на круге с центром в (0,0) и радиусом в 1. Зарисовав точки для t от + 0 до 5, получаем следующее:

      Scripts are disabled. Showing fallback image. - +

      - Bézier curves are just one out of the many classes of parametric functions, and are characterised by using the same base function for all - of the output values. In the example we saw above, the x and y values were generated by different functions (one uses a - sine, the other a cosine); but Bézier curves use the "binomial polynomial" for both the x and y outputs. So what are - binomial polynomials? + Кривые Безье — всего один из многих классов параметрических функций. Их главной характеристикой есть использование одной и той же базовой + функции для генерации всех выводов. До сих пор, в использованном нами примере, мы производили значения x и y с помощью + разных функций (ф-цией синуса и ф-цией косинуса); Безье же использует единый "биноминальный полином" для вывода обоих значений. Но что же + такое "биноминальный полином"?

      -

      You may remember polynomials from high school. They're those sums that look like this:

      +

      Возможно, вы помните полиномы из школьной программы. Они выглядят следующим образом:

      - I know what you're thinking: that doesn't look too simple! But if we remove t and add in "times one", things suddenly look pretty - easy. Check out these binomial terms: + Я знаю что вы думаете: это не выглядит таким уж простым. Но если мы уберем t и вместо этого поставим *1, внезапно, все становится + ясно. Примите ко внимаю такие биномиальные термины:

      - Notice that 2 is the same as 1+1, and 3 is 2+1 and 1+2, and 6 is 3+3... As you can see, each time we go up a dimension, we simply start - and end with 1, and everything in between is just "the two numbers above it, added together", giving us a simple number sequence known as - Pascal's triangle. Now that's easy to remember. + Обратите внимание, что 2 это то же, что 1+1, и 3 это 2+1 и 1+2 и 6 это 3+3... Как вы можете видеть, каждый раз поднимаясь на одно + разрешение выше, мы начинаем и заканчиваем с единицы, а все промежуточные значения равны суме двух значений над ними в предыдущей строке. + Так получаем последовательность цифр, называемой + треугольником Паскаля + (*в оригинале другая ссылка ).

      - There's an equally simple way to figure out how the polynomial terms work: if we rename (1-t) to a and t to b, - and remove the weights for a moment, we get this: + Так-же существует простой способ для выяснения подоплотной работы полиноминальных терминов: если мы переименуем (1-t) в a и + t в b, убрав "веса", получим следующее:

      - It's basically just a sum of "every combination of a and b", progressively replacing a's with b's after every - + sign. So that's actually pretty simple too. So now you know binomial polynomials, and just for completeness I'm going to show you the - generic function for this: + В целом это просто сума "каждого сочетания a и b", получаемая прогрессивной заменой a на b по ходу уравнения. + Потому, это так-же довольно просто. Итак теперь вы знаете что такое биноминальные полиномы. Для полноты картины, ниже привожу их общую + функцию:

      - And that's the full description for Bézier curves. Σ in this function indicates that this is a series of additions (using the variable - listed below the Σ, starting at ...=<value> and ending at the value listed on top of the Σ). + И теперь, это полное объяснение. Σ в этой функции означает, что это серия сум (с использованием переменной приведенной под Σ, со стартовым + значением в ...=<value> и максимальным значением представленным над Σ)

      -

      How to implement the basis function

      -

      We could naively implement the basis function as a mathematical construct, using the function as our guide, like this:

      +

      Имплементация базовых функций

      +

      Наивно, мы могли бы воплотить базис этой функции как математическую конструкцию, используя функцию как путеводитель:

      @@ -828,14 +836,14 @@ function Bezier(n,t):

      - I say we could, because we're not going to: the factorial function is incredibly expensive. And, as we can see from the above - explanation, we can actually create Pascal's triangle quite easily without it: just start at [1], then [1,1], then [1,2,1], then - [1,3,3,1], and so on, with each next row fitting 1 more number than the previous row, starting and ending with "1", with all the numbers - in between being the sum of the previous row's elements on either side "above" the one we're computing. + Я говорю "мы могли бы", поскольку это не входит в наши планы: факторные функции невероятно дорого стоят. И, как мы можем понять + из выше приведенного текста, треугольник Паскаля можно получить и без таких ухищрений: попросту начнем с [1], далее [1,1], затем + [1,2,1], потом [1,3,3,1] и т.д., с каждым новым рядком, записывая на 1 цифру больше, чем в предыдущем, начиная и заканчивая с единицы, а + промежуточные цифры определяя суммируя две над ними в предыдущем рядке.

      - We can generate this as a list of lists lightning fast, and then never have to compute the binomial terms because we have a lookup - table: + Такой ряд можно сгенерировать предельно быстро, и с этим нам не придется компилировать биноминальные термины, поскольку можно + пользоваться значениями из таблицы:

      @@ -918,9 +926,10 @@ function binomial(n,k):

      - So what's going on here? First, we declare a lookup table with a size that's reasonably large enough to accommodate most lookups. Then, - we declare a function to get us the values we need, and we make sure that if an n/k pair is requested that isn't in the LUT yet, - we expand it first. Our basis function now looks like this: + Итак, что же здесь происходит? Сначала мы декларируем таблицу достаточного размера для удовлетворения большинства запросов. Далее мы + заявляем функцию вывода необходимого значения, вытаскивая его из таблицы, предварительно убедившись, что значения для запрашиваемых + n/k присутствуют в наборе и расширяя набор по необходимости (если не присутствуют). Наша базовая функция теперь выглядит типа + этого:

      @@ -951,9 +960,9 @@ function Bezier(n,t):

      - Perfect. Of course, we can optimize further. For most computer graphics purposes, we don't need arbitrary curves (although we will also - provide code for arbitrary curves in this primer); we need quadratic and cubic curves, and that means we can drastically simplify the - code: + Отлично. Конечно, мы можем оптимизировать ее и далее. Для большинства задач компьютерной графики нам не потребуются кривые произвольного + порядка (хотя мы приводим код для произвольных кривых в этом пособии); зачастую нам нужны квадратные и кубические кривые, а это значит, + мы можем значительно упростить весь наш код:

      @@ -1015,30 +1024,30 @@ function Bezier(3,t):
      -

      And now we know how to program the basis function. Excellent.

      +

      И вот теперь мы знаем как программировать базовую функцию. Превосходно.

      -

      So, now we know what the basis function looks like, time to add in the magic that makes Bézier curves so special: control points.

      +

      Итак, зная как выглядят базовые функции, время добавить магию делающую кривые Безье такими особенными: контрольные точки.

      - Controlling Bézier curvatures + Контроль кривых Безье

      - Bézier curves are, like all "splines", interpolation functions. This means that they take a set of points, and generate values somewhere - "between" those points. (One of the consequences of this is that you'll never be able to generate a point that lies outside the outline - for the control points, commonly called the "hull" for the curve. Useful information!). In fact, we can visualize how each point - contributes to the value generated by the function, so we can see which points are important, where, in the curve. + Кривые Безье, как и все отрезки кривых, являются интерполярными функциями. Это значит, что они имеют заданный набор контрольных точек и + генерируют значения где-то "между" ними. (Одним следствием этого есть то, что невозможно сгенерировать точки вне этого "каркаса". Полезная + информация!). На практике мы можем проиллюстрировать влияние каждой контрольной точки на течение кривой по отдельности и проследить какие + из точек имеют наибольший эффект в тех и иных частях кривой.

      - The following graphs show the interpolation functions for quadratic and cubic curves, with "S" being the strength of a point's - contribution to the total sum of the Bézier function. Click-and-drag to see the interpolation percentages for each curve-defining point at - a specific t value. + Следующие зарисовки демонстрируют интерполяции функций для квадратной и кубической кривых, где "S" представляет степень влияния + контрольной точки на положение участка кривой по ходу развития t. Потяните ползунки, чтобы отследить проценты интерполяций каждой + контрольной точки на конкретном t.

      Scripts are disabled. Showing fallback image. - + Scripts are disabled. Showing fallback image. - + Scripts are disabled. Showing fallback image. - +

      - Also shown is the interpolation function for a 15th order Bézier function. As you can see, the start and end point contribute - considerably more to the curve's shape than any other point in the control point set. + Также представлена интерполяция кривой Безье 15го порядка. Как вы можете видеть, начальная и конечная точки влияют на положение + кривой значительно больше, чем любая другая контрольная точка.

      - If we want to change the curve, we need to change the weights of each point, effectively changing the interpolations. The way to do this - is about as straightforward as possible: just multiply each point with a value that changes its strength. These values are conventionally - called "weights", and we can add them to our original Bézier function: + Желая изменить кривую, нам нужно изменить "вес"-а (* коофициенты) для каждой точки, по сути меняя интерполяцию. Имплементация оного + предельно логична: нужно просто перемножить каждую точку на значение, меняющее ее 'силу'. Эти значения, по конвенции называют "весом" и мы + можем учесть их запись в нашей оригинальной функции Безье:

      - +

      - That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an - nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between - is a controlling coordinate. Say we want a cubic curve that starts at (110,150), is controlled by (25,190) and (210,250) and ends at - (210,30), we use this Bézier curve: + Хоть и выглядит заморочено, но, так уж получается, в реальности "веса" просто значения координат на графике, к которым мы бы хотели, чтобы + наша функция стремилась. Так, для кривой n-го порядка, w0 есть начальной координатой, wn конечной + координатой, а все между ними — контрольными координатами. Например, чтобы кубическая кривая начиналась в (110,150), стремилась к точкам + (25,190) и (210,250) заканчиваясь на (210,30), мы запишем это следующим образом:

      -

      Which gives us the curve we saw at the top of the article:

      +

      Это производит кривую, график которой мы видели в первой главе этой статьи.

      Scripts are disabled. Showing fallback image. - +

      - What else can we do with Bézier curves? Quite a lot, actually. The rest of this article covers a multitude of possible operations and - algorithms that we can apply, and the tasks they achieve. + Что еще можно сделать с кривой Безье? На самом деле — вполне не мало. Остальная часть статьи описывает множества доступных операций и + задач, которые они решают.

      -

      How to implement the weighted basis function

      -

      Given that we already know how to implement basis function, adding in the control points is remarkably easy:

      +

      Имплементация весовых функций.

      +

      + Отталкиваясь от того, что мы уже знаем как воплотить базис функции, добавление контрольных точек представляет собой удивительно легкую + задачу: +

      @@ -1171,7 +1183,7 @@ function Bezier(n,t,w[]):
      -

      And now for the optimized versions:

      +

      И оптимизированная версия:

      @@ -1232,19 +1244,19 @@ function Bezier(3,t,w[]):
      -

      And now we know how to program the weighted basis function.

      +

      И вот, мы знаем как программировать базис функции с весами.

      - Controlling Bézier curvatures, part 2: Rational Béziers + Контроль над кривыми Безье, часть 2: Соотносительные Безье

      - We can further control Bézier curves by "rationalising" them: that is, adding a "ratio" value in addition to the weight value discussed in - the previous section, thereby gaining control over "how strongly" each coordinate influences the curve. + Мы можем расширить степень влияния на кривые Безье, "соотнеся" их составляющие: подразумевается добавление в формулу коэффициента + соотношений (* в оригинале "ratio" — соотношение) в довесок к уже используемым весам.

      -

      Adding these ratio values to the regular Bézier curve function is fairly easy. Where the regular function is the following:

      +

      Как и прочее, воплощение этого коэффициента не должно составить нам особого труда. Тогда как обычная функция:

      - The obvious start and end values here need to be a=1, b=0, so that the mixed value is 100% value 1, and 0% value 2, and - a=0, b=1, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: - if they are, then we could just pick whatever values we like, and end up with a mixed value that is, for example, 100% value 1 - and 100% value 2. In principle that's fine, but for Bézier curves we always want mixed values between the start - and end point, so we need to make sure we can never set "a" and "b" to some values that lead to a mix value that sums to more than 100%. - And that's easy: + Очевидно, что начальное и конечное значения a и b должны быть a=1, b=0, чтобы в начале получать + вывод 100% первого показателя и 0% второго; и a=0, b=1, чтобы в конце получать 0% value 1 и 100% value 2. В дополнение, мы не + хотим чтобы "a" и "b" были независимыми, в коем случае можно было бы присвоить им любые значения и на выводе получить, например, 100% + первого показателя и 100% второго. В принципе, с последним все ок, но в случае кривых Безье, мы всегда должны получать + значение между двух крайностей, потому нельзя присвоить a и b значения, которые бы вместе составляли + суму более 100% на выводе, что можно записать как:

      - With this we can guarantee that we never sum above 100%. By restricting a to values in the interval [0,1], we will always be - somewhere between our two values (inclusively), and we will always sum to a 100% mix. + С этим у нас есть гарантия, что мы не получим суму значений пропорций более 100%. Мы ограничиваем значение a интервалом + [0,1], потому всегда получаем вывод из пропорционального смешения двух показателей, с сумой смесителей не превышающей 100%.

      - But... what if we use this form, which is based on the assumption that we will only ever use values between 0 and 1, and instead use - values outside of that interval? Do things go horribly wrong? Well... not really, but we get to "see more". + Но... что если мы воспользуемся этой формой, предполагающей что мы всегда будем использовать значения а между 0 и 1, для подсчета точек + лежащих вне стандартного интервала? Наши вычисления пойдут по откосной? Что ж... не то чтобы, мы попросту увидим больше.

      - In the case of Bézier curves, extending the interval simply makes our curve "keep going". Bézier curves are simply segments of some - polynomial curve, so if we pick a wider interval we simply get to see more of the curve. So what do they look like? + В случае кривой Безье, продление интервала просто продляет развитие кривой. Кривые Безье всего лишь сегменты полиноминальных кривых. + Выбирая более широкий отрезок — мы можем проследить дальнейшее развитие кривой. И как же это выглядит?

      - The following two graphics show you Bézier curves rendered "the usual way", as well as the curves they "lie on" if we were to extend the - t values much further. As you can see, there's a lot more "shape" hidden in the rest of the curve, and we can model those - parts by moving the curve points around. + Ниже представлены графики кривых Безье, зарисованных "обычным путем", по верх зарисовки кривых на которых они лежат, полученных путем + расширения интервала значений t. Как мы можем наблюдать, кривая Безье есть частью большей формы, скрытой за границами нашего + интервала, которую мы так-же можем регулировать путем перемещения контрольных точек.

      Scripts are disabled. Showing fallback image. - + Scripts are disabled. Showing fallback image. - +

      - In fact, there are curves used in graphics design and computer modelling that do the opposite of Bézier curves; rather than fixing the - interval, and giving you freedom to choose the coordinates, they fix the coordinates, but give you freedom over the interval. A great - example of this is the "Spiro" curve, which is a curve based on part of a - Cornu Spiral, also known as Euler's Spiral. It's a very aesthetically pleasing - curve and you'll find it in quite a few graphics packages like FontForge and - Inkscape. It has even been used in font design, for example for the Inconsolata typeface. + В области компьютерной графики, существуют множество кривых, которые действуют по противоположному кривым Безье принципу: вместо + фиксированного интервала и свободного выбора контрольных точек формирующих развитие искривлений, они фиксируют форму кривой, предоставляя + возможность выбора интервала. Отличным примером последней есть кривая "Spiro", которая + частично базируется на спирали Корню, также + известной как спираль Эйлера (* в оригинале другая + ссылка на Корню и Эйлера ). Эту эстетически приятную кривую можно встретить в + нескольких графических пакетах: FontForge и Inkscape. Ее + даже используют в дизайне шрифтов, например в начертания шрифта Inconsolata.

      @@ -2876,14 +2889,14 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse

      - Derivatives + Производные кривых Безье

      - There's a number of useful things that you can do with Bézier curves based on their derivative, and one of the more amusing observations - about Bézier curves is that their derivatives are, in fact, also Bézier curves. In fact, the differentiation of a Bézier curve is - relatively straightforward, although we do need a bit of math. + Есть целый ряд вещей, которые мы можем сотворить с кривыми Безье базируясь на их производных, и одним восхитительным наблюдением на счет + первых, является то, что их производные по сути тоже являются кривыми Безье. На практике, дифференциация кривых Безье относительно + логична, хотя нам и потребуется немного математики.

      -

      First, let's look at the derivative rule for Bézier curves, which is:

      +

      Для начала рассмотрим правило производных для кривых Безье:

      - Now to apply this to our weighted Bézier curves. We'll write out the plain curve formula that we saw earlier, and then work our way - through to its derivative: + Теперь применим это к записям наших формул с "весами". Начнем с формулы кривой Безье приведенной выше и пройдемся по ее производным.

    - Let's rewrite that in a form similar to our original formula, so we can see the difference. We will first list our original formula for - Bézier curves, and then the derivative: + Давайте перепишем это по форме схожей с нашей исходной формулой, чтобы легче было разглядеть разницу. Сначала оригинальная формула, за ней + производная:

    - What are the differences? In terms of the actual Bézier curve, virtually nothing! We lowered the order (rather than n, it's now - n-1), but it's still the same Bézier function. The only real difference is in how the weights change when we derive the curve's - function. If we have four points A, B, C, and D, then the derivative will have three points, the second derivative two, and the third - derivative one: + И в чем же разница? В терминах формулы кривой Безье, по сути, никакой! Мы уменьшили порядок (вместо порядка n, он теперь + n-1), но это все та же функция Безье. Единственное отличие в подсчете изменений в "весах" при нахождении производной. К примеру, + исходя из 4-х контрольных точек A, B, C и D, первая производная получит 3 точки, вторая — 2, третья — 1: