diff --git a/Report/zivro-open-project-report.md b/Report/zivro-open-project-report.md index 8d7e97e..6e11be1 100644 --- a/Report/zivro-open-project-report.md +++ b/Report/zivro-open-project-report.md @@ -124,6 +124,14 @@ y_w &= t_y + (x_l \cdot s_x)\sin a + (y_l \cdot s_y)\cos a. \end{aligned} $$ +Обозначения: + +- `x_l, y_l` - локальные координаты точки объекта; +- `x_w, y_w` - мировые координаты точки в документе; +- `t_x, t_y` - перенос (`position`) текущего transform; +- `s_x, s_y` - масштаб по осям (`scale_x`, `scale_y`); +- `a` - угол поворота объекта (в радианах). + При композиции `parent * local` (в `Transform.compose`) выполняются шаги: 1. локальная позиция сначала масштабируется масштабом родителя; @@ -164,6 +172,15 @@ y_l &= \frac{dx\sin(-a)+dy\cos(-a)}{s_y}. \end{aligned} $$ +Обозначения: + +- `x_w, y_w` - мировые координаты точки; +- `x_l, y_l` - локальные координаты точки после обратного преобразования; +- `t_x, t_y` - перенос transform; +- `a` - угол поворота transform; +- `s_x, s_y` - масштаб transform; +- `dx, dy` - координаты точки после вычитания переноса. + Практический смысл: shape можно тестировать аналитически (по формулам) в "своей" удобной локальной системе, независимо от того, как он повернут и где расположен в документе. ### 6.3. Рисование линии: отсечение + дискретизация + толщина @@ -179,6 +196,13 @@ $$ P(t)=P_0+t(P_1-P_0),\quad t\in[0,1]. $$ +Обозначения: + +- `P_0, P_1` - начальная и конечная точки исходного отрезка; +- `P(t)` - точка на отрезке при параметре `t`; +- `t` - параметр интерполяции (`0` - начало, `1` - конец); +- `[t0, t1]` - допустимый интервал параметра после отсечения. + Для каждого ограничения (`x >= left`, `x <= right`, `y >= top`, `y <= bottom`) обновляется допустимый интервал `[t0, t1]`. Если после обработки ограничений `t0 > t1`, отрезок полностью вне экрана и пропускается. @@ -229,6 +253,13 @@ $$ n_x = \frac{x_l}{r_x},\quad n_y = \frac{y_l}{r_y},\quad d=n_x^2+n_y^2. $$ +Обозначения: + +- `x_l, y_l` - локальные координаты текущего пикселя (центра пикселя после обратного преобразования); +- `r_x, r_y` - полуоси эллипса по `x` и `y`; +- `n_x, n_y` - нормализованные координаты в системе эллипса; +- `d` - значение функции эллипса в нормализованной форме. + - `d = 1` соответствует идеальному контуру эллипса; - `d < 1` внутри; - `d > 1` снаружи. @@ -247,6 +278,12 @@ $$ inner^2 \le d \le outer^2. $$ +Обозначения: + +- `d` - нормализованная квадратичная дистанция из предыдущей формулы; +- `inner` - внутренний радиус полосы обводки в нормализованном пространстве; +- `outer` - внешний радиус полосы обводки в нормализованном пространстве. + Это даёт геометрически корректную полосу вокруг эллипса при произвольном повороте/масштабе объекта. #### 6.4.3. Дуга через угловой фильтр @@ -303,6 +340,15 @@ C_{out} = C_{src} + (1-\alpha_{src})C_{dst}, \alpha_{out} = \alpha_{src} + (1-\alpha_{src})\alpha_{dst}. $$ +Обозначения: + +- `C_src` - цвет источника в PMA (`r,g,b` уже домножены на альфу); +- `C_dst` - текущий цвет пикселя в буфере до смешивания; +- `C_out` - результат смешивания; +- `\alpha_src` - альфа источника (с учётом `transform.opacity`); +- `\alpha_dst` - альфа пикселя назначения; +- `\alpha_out` - итоговая альфа после композиции. + В коде `C_src` уже premultiplied (или домножается на opacity трансформа в момент смешивания). Пошагово: