Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2cc439e

Browse files
Merge branch 'fix/chapter-12'
2 parents e1721f9 + 643920c commit 2cc439e

File tree

13 files changed

+30
-78
lines changed

13 files changed

+30
-78
lines changed

‎ch11/display_model.tex‎ renamed to ‎ch12/display_model.tex‎

Lines changed: 18 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ \section{Графические примитивы}
2929
\noindent Исходные файлы и проект программы размещены в~\href{\courserepourl}{репозитории}.
3030

3131
\begin{center}
32-
\code{projects/11/shape\_primitives}
32+
\code{projects/ch12/shape\_primitives}
3333
\end{center}
3434

3535

@@ -41,12 +41,12 @@ \section{Графические примитивы}
4141

4242
Тем не~менее, поскольку все наши типы и функции размещены в~отдельном пространстве имён, следует просто уточнить, что мы имеем в~виду класс \code{Graph\_lib::Rectangle}.
4343

44-
\cppfile[firstline=1, lastline=10]{projects/11/shape_primitives/main.cpp}
45-
\cppfile[firstline=12, lastline=21]{projects/11/shape_primitives/main.cpp}
44+
\cppfile[firstline=1, lastline=10]{projects/ch12/shape_primitives/main.cpp}
45+
\cppfile[firstline=12, lastline=21]{projects/ch12/shape_primitives/main.cpp}
4646
\cpp`// ...`
47-
\cppfile[firstline=48, lastline=51]{projects/11/shape_primitives/main.cpp}
47+
\cppfile[firstline=48, lastline=51]{projects/ch12/shape_primitives/main.cpp}
4848
\cpp`// ...`
49-
\cppfile[firstline=113, lastline=113]{projects/11/shape_primitives/main.cpp}
49+
\cppfile[firstline=113, lastline=113]{projects/ch12/shape_primitives/main.cpp}
5050

5151

5252

@@ -57,52 +57,20 @@ \section{Включение библиотеки \name{FLTK} в~проект}
5757

5858
В~проект необходимо добавить файлы из~библиотеки \code{Graph\_lib}:
5959

60-
\cmakefile[firstline=22, lastline=23]{projects/11/shape_primitives/CMakeLists.txt}
60+
\cmakefile[firstline=22, lastline=23]{projects/ch12/shape_primitives/CMakeLists.txt}
6161
\cmake' # ...'
62-
\cmakefile[firstline=25, lastline=28]{projects/11/shape_primitives/CMakeLists.txt}
62+
\cmakefile[firstline=25, lastline=28]{projects/ch12/shape_primitives/CMakeLists.txt}
6363

6464
\noindent которые будут подробно рассмотрены в~последующих \textbookref{главах} учебника. Классы этой библиотеки предоставляют нам сравнительно небольшой набор графических возможностей, реализованных на~основе библиотеки \name{FLTK}.
6565

6666
Система сборки \name{CMake} имеет механизмы поиска <<внешних>> библиотек в~системе. Это позволяет уменьшить зависимость описания проекта от~платформы, оставляя при~этом возможность вручную задать конкретные пути к~ним в~процессе конфигурации. Для поиска библиотеки \name{FLTK}, а также её зависимости "--- библиотеки более низкого уровня \name{OpenGL}, нужно добавить следующие строки:
6767

68-
\cmakefile[firstline=10, lastline=11]{projects/11/shape_primitives/CMakeLists.txt}
68+
\cmakefile[firstline=10, lastline=11]{projects/ch12/shape_primitives/CMakeLists.txt}
6969

7070
\noindent Флаг \code{REQUIRED} указывает, что без~данного компонента невозможна успешная сборка проекта. Таким образом, мы получаем более раннюю диагностику в~виде ошибки на~этапе конфигурирования.
7171

7272
\todo{\ldots добавить дальнейшее описание\ldots}
7373

74-
%Пути, дополнительные библиотеки и флаги компилятора зависят от платформы. Чтобы компилятор <<увидел>> заголовки (как правило, в угловых скобках), например:
75-
%
76-
%\begin{cppcode*}{linenos=false}
77-
%#include <FL/Fl.H>
78-
%#include <Graph_lib/Graph.h>
79-
%\end{cppcode*}
80-
%
81-
%\noindent необходимо добавить пути (абсолютные или относительно проектного файла) к ним в стандартные пути поиска компилятора:
82-
%
83-
%%\jsfile[firstline=20, lastline=20]{projects/11/shape_primitives/shape_primitives.qbs}
84-
%%\js'// ...'
85-
%%\jsfile[firstline=24, lastline=24]{projects/11/shape_primitives/shape_primitives.qbs}
86-
%
87-
%Заметим, что путь к заголовкам \name{FLTK} добавлен в системные пути. Дело в том, что иногда <<вылезают>> предупреждения компилятора, которые относятся к файлам сторонних библиотек, например, о неиспользуемых параметрах в функциях. Изменение внешнего кода является зачастую плохим решением (почему?). Если есть такое желание, следует внести вклад в разработку данной библиотеки. Современная система глобальной коммуникации легко позволяет оказать помощь разработчикам. Примером, могут служить проекты в \name{GitLab} или \name{GitHub}. Альтернатива "--- просто сообщить компилятору, что код подключается из внешней (системной) библиотеки. Тогда он не станет выдавать нам предупреждения, которые относятся к этим файлам.
88-
%
89-
%Аналогично, чтобы компоновщик смог найти дополнительные библиотеки, которые мы перечислили, необходимо добавить пути к ним, если они располагаются вне стандартных каталогов, как в нашем случае:
90-
%
91-
%\todo{добавить фрагмент проектного файла}
92-
%%\jsfile[firstline=25, lastline=25]{projects/11/shape_primitives/shape_primitives.qbs}
93-
%
94-
%\noindent Также в \name{Windows} необходимо дать компоновщику опцию:
95-
%
96-
%\todo{добавить фрагмент проектного файла}
97-
%%\jsfile[firstline=26, lastline=26]{projects/11/shape_primitives/shape_primitives.qbs}
98-
%
99-
%\noindent которая сообщает, что мы собираемся использовать оконный интерфейс.
100-
%
101-
%Ниже перечислены сторонние библиотеки (\textenglish{third-party libraries}), от которых, в свою очередь, зависит \name{FLTK} под \name{Windows}:
102-
%
103-
%\todo{добавить фрагмент проектного файла}
104-
%%\jsfile[firstline=30, lastline=35]{projects/11/shape_primitives/shape_primitives.qbs}
105-
10674

10775

10876
%%================
@@ -120,22 +88,6 @@ \section{Включение библиотеки \name{FLTK} в~проект}
12088

12189

12290

123-
%%%=========================================
124-
%\paragraph{Проектный файл для \name{Linux}}
125-
%%%=========================================
126-
%тот же самый. Платформенно-зависимые свойства указаны в отдельном блоке:
127-
%
128-
%\jsfile[firstline=38, lastline=39]{projects/11/shape_primitives/shape_primitives.qbs}
129-
%\js'// ...'
130-
%\jsfile[firstline=59, lastline=59]{projects/11/shape_primitives/shape_primitives.qbs}
131-
%
132-
%\noindent
133-
%Инструкции читаются при условии, что целевая платформа "--- это \name{Linux}.
134-
%
135-
%Поправьте пути и имена библиотек в соответствии с версией \name{FLTK} на вашем компьютере. Ниже показано, как посмотреть флаги компилятора (\code{cxxflags}, \code{ldflags}), которые использует \name{FLTK}.
136-
137-
138-
13991
%%========================================================
14092
\paragraph{Сборка в \name{Unix}-подобной командной среде.}
14193
%%========================================================
@@ -154,7 +106,7 @@ \section{Включение библиотеки \name{FLTK} в~проект}
154106

155107
\begin{consolecode}
156108
$ g++ -o bin/shapes -std=c++14 -pedantic $(fltk-config --cxxflags) \
157-
projects/11/shape_primitives/main.cpp lib/Graph_lib/*.cpp \
109+
projects/ch12/shape_primitives/main.cpp lib/Graph_lib/*.cpp \
158110
$(fltk-config --use-images --ldflags)
159111
\end{consolecode}
160112
@@ -177,16 +129,17 @@ \section{Элементы геометрии}\label{sect:geomelems}
177129
178130
\cppfile[firstline=17, lastline=32]{projects/lib/poly/poly.cpp}
179131
180-
\noindent
181-
\parbox[c]{0.65\textwidth}{\parindent=1.25cm%
182132
Изменение координат точки при вращении можно выразить через поворот самой системы координат:
133+
134+
\noindent
135+
\parbox[c]{0.65\textwidth}{%
183136
\[
184137
\left\{ \begin{array}{l}
185-
x\prime = \phantom{-}x\cos\alpha + y\sin\alpha, \\
186-
y\prime = -x\sin\alpha + y\cos\alpha.
138+
x = x\prime\cos\alpha - y\prime\sin\alpha, \\
139+
y = x\prime\sin\alpha + y\prime\cos\alpha.
187140
\end{array}\right.
188141
\]
189-
Используя эти соотношения, функция \code{rotated()} выполняет поворот точки \code{point} на угол \code{angle} относительно центра вращения \code{center} и возвращает новую точку. По умолчанию центр вращения расположен в начале координат.
142+
Используя эти соотношения, функция \code{rotated()} выполняет поворот точки \code{point} на угол \code{angle} относительно центра вращения \code{center} (положительный угол отмеряется против часовой стрелки) и возвращает новую точку. По умолчанию центр вращения расположен в начале координат.
190143
}\hfill\parbox[c]{0.35\textwidth}{%
191144
\begin{center}\begin{tikzpicture}[>=Stealth, very thick]
192145
\draw[help lines, step=.5cm] (-2, -1) grid (2.5, 2.5);
@@ -255,21 +208,21 @@ \section{Фракталы}
255208
256209
Шаг этого алгоритма можно выразить следующим образом, используя ранее приведённые вспомогательные функции:
257210
258-
\cppfile[firstline=24, lastline=38]{projects/11/koch_snowflake/main.cpp}
211+
\cppfile[firstline=24, lastline=37]{projects/ch12/koch_snowflake/main.cpp}
259212
260213
Контейнер \code{std::list} представляет собой двусвязный список. Обойти его элементы можно используя итераторы "--- обобщённый аналог указателей. Они будут рассмотрены в \textbookref{главе~20} учебника. Список передаётся по rvalue-ссылке, которая позволяет избежать ненужного копирования объекта. Подробнее об этих ссылках и перемещении (\code{std::move}) мы узнаем в \textbookref{главе~18} учебника.
261214
262215
Вариант рисования снежинки Коха на базе правильного \code{n}-угольника в окне шириной~\code{w} средствами нашей библиотеки \code{Graph\_lib} можно записать так:
263216
264-
\cppfile[firstline=52, lastline=81]{projects/11/koch_snowflake/main.cpp}
217+
\cppfile[firstline=51, lastline=80]{projects/ch12/koch_snowflake/main.cpp}
265218
266219
Мы добавили текстовую метку в центре фигуры, показывающую номер шага алгоритма. И также учли, что дальнейшее измельчение кривой бессмысленно, если длина ребра становится менее~\(1\) пикселя. Функцию \code{max\_edge\_length()} предлагаем реализовать самостоятельно.
267220
268221
\textbf{NB!} Обратите особое внимание, что замкнутая ломаная создаётся в теле цикла каждый раз заново. Дело в том, что \code{Graph\_lib} не предоставляет удобного способа добавления новых точек в середину кривой. Мы вынуждены откреплять нашу кривую от окна в конце итерации, чтобы избежать отрисовки несуществующего объекта.
269222
270223
271224
%=================
272-
\input{ch11/extra}
225+
\input{ch12/extra}
273226
%=================
274227
275228

‎ch11/extra.tex‎ renamed to ‎ch12/extra.tex‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ \section{Правильные многоугольники}
1818

1919
Покажем лишь ключевой фрагмент кода. Напомним, что функция \code{regular\_polygon()} вычисляет вершины правильного многоугольника и была представлена ранее в~разделе~\ref{sect:geomelems}.
2020

21-
\cppfile[firstline=19, lastline=45]{projects/11/regular_polygons.cpp}
21+
\cppfile[firstline=19, lastline=45]{projects/ch12/regular_polygons.cpp}
2222

2323
Класс \code{Vector\_ref} рассматривается в~\textbookref{главе~13} и удобен для~хранения множества неименованных объектов. Многоугольники рисуются с~использованием вращательной симметрии и раскрашиваются в~оттенки пурпурного (см. диаграмму цветов из~\textbookref{главы~13}). Результат работы программы показан на~рисунке~\ref{fig:regpoly}.
2424

@@ -55,14 +55,14 @@ \section{Суперэллипсы}
5555

5656
Функция, добавляющая точки, лежащие на~суперэллипсе, по~формуле~(\ref{eq:superellipse}), приведена ниже:
5757

58-
\cppfile[firstline=20, lastline=35]{projects/11/superellipse.cpp}
58+
\cppfile[firstline=20, lastline=35]{projects/ch12/superellipse.cpp}
5959

6060
Функцию, определяющую знак числа, можно написать таким образом:
6161

62-
\cppfile[firstline=18, lastline=18]{projects/11/superellipse.cpp}
62+
\cppfile[firstline=18, lastline=18]{projects/ch12/superellipse.cpp}
6363

6464
Ключевой фрагмент функции \code{main()} для~рисования нескольких вложенных суперэллипсов из~упражнения~12 \textbookref{главы~12}:
6565

66-
\cppfile[firstline=40, lastline=54]{projects/11/superellipse.cpp}
66+
\cppfile[firstline=40, lastline=54]{projects/ch12/superellipse.cpp}
6767

6868
Мы уверены, что вы сможете самостоятельно добавить текстовые метки (подписи) к~кривым и раскрасить их, например, как на~рисунке~\ref{fig:superellipse}.

‎projects/CMakeLists.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ include_directories(
1313
add_subdirectory(07/calculator)
1414
add_subdirectory(08/vec)
1515
add_subdirectory(08/logic_elements)
16-
add_subdirectory(11/shape_primitives)
17-
add_subdirectory(11/koch_snowflake)
16+
add_subdirectory(ch12/shape_primitives)
17+
add_subdirectory(ch12/koch_snowflake)

‎projects/11/koch_snowflake/main.cpp‎ renamed to ‎projects/ch12/koch_snowflake/main.cpp‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,19 @@ using namespace Graph_lib;
2121
* @param curve - closed polyline as points list
2222
* @return modified points list back
2323
*/
24-
auto koch_fractal_step (std::list<Vec2d>&& curve)
24+
void koch_fractal_step (std::list<Vec2d>& curve)
2525
{
2626
auto prev = --curve.end();
2727
for (auto curr = curve.begin(); curr != curve.end(); ++curr)
2828
{
2929
auto p = lerp(*prev, *curr, 1. / 3);
3030
auto q = lerp(*prev, *curr, 2. / 3);
31-
auto m = rotated(-pi / 3, p, q);
31+
auto m = rotated(pi / 3, q, p);
3232
curve.insert(curr, p);
3333
curve.insert(curr, m);
3434
curve.insert(curr, q);
3535
prev = curr;
3636
}
37-
return curve;
3837
}
3938

4039
auto max_edge_length (const std::list<Vec2d>& curve)
@@ -55,7 +54,7 @@ void draw_koch_snowflake (int w, int n)
5554

5655
Vec2d c{w / 2., w / 2.}; // window center
5756
double r{0.85 * w / 2.}; // polygon radius
58-
auto ngon = regular_polygon(n, c, r, -pi / 2.);
57+
auto ngon = regular_polygon(n, c, r, pi / 2);
5958

6059
Text n_steps{as_point(c), "0"};
6160
n_steps.set_color(Color::blue);
@@ -67,7 +66,7 @@ void draw_koch_snowflake (int w, int n)
6766
append(curve, ngon);
6867
curve.set_color(Color::blue);
6968

70-
ngon = koch_fractal_step(std::move(ngon));
69+
koch_fractal_step(ngon);
7170
is_fine = max_edge_length(ngon) < 1.0;
7271
if (is_fine)
7372
n_steps.set_color(Color::red);
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /