Pug_coder

lab1

Jan 9th, 2024
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.03 KB | None | 0 0
  1. \documentclass[a4paper, 14pt]{extarticle}
  2.  
  3. % Поля
  4. %--------------------------------------
  5. \usepackage{geometry}
  6. \geometry{a4paper,tmargin=2cm,bmargin=2cm,lmargin=3cm,rmargin=1cm}
  7. %--------------------------------------
  8.  
  9.  
  10. %Russian-specific packages
  11. %--------------------------------------
  12. \usepackage[T2A]{fontenc}
  13. \usepackage[utf8]{inputenc}
  14. \usepackage[english, main=russian]{babel}
  15. %--------------------------------------
  16.  
  17. \usepackage{textcomp}
  18.  
  19. % Красная строка
  20. %--------------------------------------
  21. \usepackage{indentfirst}
  22. %--------------------------------------
  23.  
  24.  
  25. %Graphics
  26. %--------------------------------------
  27. \usepackage{graphicx}
  28. \graphicspath{ {./images/} }
  29. \usepackage{wrapfig}
  30. %--------------------------------------
  31.  
  32. % Полуторный интервал
  33. %--------------------------------------
  34. \linespread{1.3}
  35. %--------------------------------------
  36.  
  37. %Выравнивание и переносы
  38. %--------------------------------------
  39. % Избавляемся от переполнений
  40. \sloppy
  41. % Запрещаем разрыв страницы после первой строки абзаца
  42. \clubpenalty=10000
  43. % Запрещаем разрыв страницы после последней строки абзаца
  44. \widowpenalty=10000
  45. %--------------------------------------
  46.  
  47. %Списки
  48. \usepackage{enumitem}
  49.  
  50. %Подписи
  51. \usepackage{caption}
  52.  
  53. %Гиперссылки
  54. \usepackage{hyperref}
  55.  
  56. \hypersetup {
  57. unicode=true
  58. }
  59.  
  60. %Рисунки
  61. %--------------------------------------
  62. \DeclareCaptionLabelSeparator*{emdash}{~--- }
  63. \captionsetup[figure]{labelsep=emdash,font=onehalfspacing,position=bottom}
  64. %--------------------------------------
  65.  
  66. \usepackage{tempora}
  67. \usepackage{amsmath}
  68. \usepackage{color}
  69. \usepackage{listings}
  70. \lstset{
  71. belowcaptionskip=1\baselineskip,
  72. breaklines=true,
  73. frame=L,
  74. xleftmargin=\parindent,
  75. language=Python,
  76. showstringspaces=false,
  77. basicstyle=\footnotesize\ttfamily,
  78. keywordstyle=\bfseries\color{blue},
  79. commentstyle=\itshape\color{purple},
  80. identifierstyle=\color{black},
  81. stringstyle=\color{red},
  82. }
  83.  
  84. %--------------------------------------
  85. % НАЧАЛО ДОКУМЕНТА
  86. %--------------------------------------
  87.  
  88. \begin{document}
  89.  
  90. %--------------------------------------
  91. % ТИТУЛЬНЫЙ ЛИСТ
  92. %--------------------------------------
  93. \begin{titlepage}
  94. \thispagestyle{empty}
  95. \newpage
  96.  
  97.  
  98. %Шапка титульного листа
  99. %--------------------------------------
  100. \vspace*{-60pt}
  101. \hspace{-65pt}
  102. \begin{minipage}{0.3\textwidth}
  103. \hspace*{-20pt}\centering
  104. \includegraphics[width=\textwidth]{emblem.png}
  105. \end{minipage}
  106. \begin{minipage}{0.67\textwidth}\small \textbf{
  107. \vspace*{-0.7ex}
  108. \hspace*{-6pt}\centerline{Министерство науки и высшего образования
  109. Российской Федерации}
  110. \vspace*{-0.7ex}
  111. \centerline{Федеральное государственное бюджетное образовательное
  112. учреждение }
  113. \vspace*{-0.7ex}
  114. \centerline{высшего образования}
  115. \vspace*{-0.7ex}
  116. \centerline{<<Московский государственный технический университет}
  117. \vspace*{-0.7ex}
  118. \centerline{имени Н.Э. Баумана}
  119. \vspace*{-0.7ex}
  120. \centerline{(национальный исследовательский университет)>>}
  121. \vspace*{-0.7ex}
  122. \centerline{(МГТУ им. Н.Э. Баумана)}}
  123. \end{minipage}
  124. %--------------------------------------
  125.  
  126. %Полосы
  127. %--------------------------------------
  128. \vspace{-25pt}
  129. \hspace{-35pt}\rule{\textwidth}{2.3pt}
  130.  
  131. \vspace*{-20.3pt}
  132. \hspace{-35pt}\rule{\textwidth}{0.4pt}
  133. %--------------------------------------
  134.  
  135. \vspace{1.5ex}
  136. \hspace{-35pt} \noindent \small ФАКУЛЬТЕТ\hspace{80pt} <<Информатика и
  137. системы управления>>
  138.  
  139. \vspace*{-16pt}
  140. \hspace{47pt}\rule{0.83\textwidth}{0.4pt}
  141.  
  142. \vspace{0.5ex}
  143. \hspace{-35pt} \noindent \small КАФЕДРА\hspace{50pt} <<Теоретическая
  144. информатика и компьютерные технологии>>
  145.  
  146. \vspace*{-16pt}
  147. \hspace{30pt}\rule{0.866\textwidth}{0.4pt}
  148.  
  149. \vspace{11em}
  150.  
  151. \begin{center}
  152. \Large {\bf Лабораторная работа № 1} \\
  153. \large {\bf по курсу <<Разработка мобильных приложения>>} \\
  154. \large <<Графический пользовательский интерфейс в Dart>>
  155. \end{center}\normalsize
  156.  
  157. \vspace{8em}
  158.  
  159.  
  160. \begin{flushright}
  161. {Студент группы ИУ9-72Б Суханов А.С.\hspace*{15pt} \\
  162. \vspace{2ex}
  163. Преподаватель Посевин Д. П.\hspace*{15pt}}
  164. \end{flushright}
  165.  
  166. \bigskip
  167.  
  168. \vfill
  169.  
  170.  
  171. \begin{center}
  172. \textsl{Москва 2023}
  173. \end{center}
  174. \end{titlepage}
  175. %--------------------------------------
  176. % КОНЕЦ ТИТУЛЬНОГО ЛИСТА
  177. %--------------------------------------
  178.  
  179. \renewcommand{\ttdefault}{pcr}
  180.  
  181. \setlength{\tabcolsep}{3pt}
  182. \newpage
  183. \setcounter{page}{2}
  184.  
  185. \section{Цель работы}\label{Sect::task}
  186. \par
  187. Научиться создавать приложения с графическим пользовательским интерфейсом
  188. c
  189. использованием фреймворка Flutter на языке программирования Dart.
  190. \section{Задание}
  191. В течение лабораторной работы нужно разработать программу, рисующую на
  192. экране
  193. мобильного устройства одно из изображений, перечисленных в таблице ниже.
  194. Программа
  195. должна иметь графический пользовательский интерфейс, через который
  196. пользователь может
  197. задавать параметры изображения. Изображение должно перерисовываться
  198. автоматически при
  199. изменении любого параметра. Значения параметров, обозначенных в таблице
  200. латинскими
  201. буквами, представляют собой неотрицательные целые числа. Когда в описании
  202. изображения
  203. говорится о выборе цвета, подразумевается выбор из нескольких
  204. предопределённых
  205. альтернатив (например, красный, зелёный или синий).
  206. \section{Индивидуальный вариант}
  207. Окружность радиуса r, изображённая с помощью квадратов со стороной a,
  208. наклонённых на угол alfa.
  209. \pagebreak
  210. \section{Практическая реализация}
  211. Код представлен в Листинге 1.
  212. \begin{lstlisting}
  213. import 'dart:math';
  214. import 'package:flutter/material.dart';
  215. import 'package:vector_math/vector_math.dart' as vec;
  216.  
  217.  
  218.  
  219. class CircleApproximation extends StatefulWidget {
  220. @override
  221. _CircleApproximationState createState() => _CircleApproximationState();
  222. }
  223.  
  224. class _CircleApproximationState extends State<CircleApproximation> {
  225. double radius = 100.0;
  226. double squareSize = 10.0;
  227. double rotationAngle = 45.0;
  228.  
  229. @override
  230. Widget build(BuildContext context) {
  231. int squaresCount = (2 * pi * radius / squareSize).ceil();
  232.  
  233. return Scaffold(
  234. appBar: AppBar(
  235. title: Text('Approximation of a circle by squares'),
  236. ),
  237. body: Center(
  238. child: Column(
  239. mainAxisAlignment: MainAxisAlignment.center,
  240. children: <Widget>[
  241. Container(
  242. width: radius * 2,
  243. height: radius * 2,
  244. child: CustomPaint(
  245. painter: CirclePainter(
  246. radius: radius,
  247. squareSize: squareSize,
  248. rotationAngle: rotationAngle,
  249. squaresCount: squaresCount,
  250. ),
  251. ),
  252. ),
  253. SizedBox(height: 20.0),
  254. Text('Radius: $radius'),
  255. Slider(
  256. value: radius,
  257. onChanged: (value) {
  258. setState(() {
  259. radius = value;
  260. });
  261. },
  262. min: 10.0,
  263. max: 200.0,
  264. ),
  265. Text('Square size: $squareSize'),
  266. Slider(
  267. value: squareSize,
  268. onChanged: (value) {
  269. setState(() {
  270. squareSize = value;
  271. });
  272. },
  273. min: 5.0,
  274. max: 20.0,
  275. ),
  276. Text('Angle of inclination: $rotationAngle'),
  277. Slider(
  278. value: rotationAngle,
  279. onChanged: (value) {
  280. setState(() {
  281. rotationAngle = value;
  282. });
  283. },
  284. min: 0.0,
  285. max: 90.0,
  286. ),
  287. ],
  288. ),
  289. ),
  290. );
  291. }
  292. }
  293.  
  294. class CirclePainter extends CustomPainter {
  295. final double radius;
  296. final double squareSize;
  297. final double rotationAngle;
  298. final int squaresCount;
  299.  
  300. CirclePainter({
  301. required this.radius,
  302. required this.squareSize,
  303. required this.rotationAngle,
  304. required this.squaresCount,
  305. });
  306.  
  307. @override
  308. void paint(Canvas canvas, Size size) {
  309. final paint = Paint()
  310. ..color = Colors.blue
  311. ..style = PaintingStyle.stroke;
  312.  
  313. for (int i = 0; i < squaresCount; i++) {
  314. final angle = 2 * pi * i / squaresCount;
  315. final x = radius * cos(angle);
  316. final y = radius * sin(angle);
  317. final matrix = vec.Matrix4.identity()
  318. ..translate(radius, radius)
  319. ..rotateZ(rotationAngle * pi / 180)
  320. ..translate(-squareSize / 2, -squareSize / 2);
  321.  
  322. final points = [
  323. Offset(x, y),
  324. Offset(x + squareSize, y),
  325. Offset(x + squareSize, y + squareSize),
  326. Offset(x, y + squareSize),
  327. ];
  328.  
  329. for (int j = 0; j < points.length; j++) {
  330. final vector3 = vec.Vector3(points[j].dx, points[j].dy, 0);
  331. matrix.transform3(vector3);
  332. points[j] = Offset(vector3.x, vector3.y);
  333. }
  334.  
  335.  
  336. final path = Path()
  337. ..moveTo(points[0].dx, points[0].dy)
  338. ..lineTo(points[1].dx, points[1].dy)
  339. ..lineTo(points[2].dx, points[2].dy)
  340. ..lineTo(points[3].dx, points[3].dy)
  341. ..close();
  342.  
  343. canvas.drawPath(path, paint);
  344. }
  345. }
  346.  
  347. @override
  348. bool shouldRepaint(covariant CustomPainter oldDelegate) {
  349. return true;
  350. }
  351. }
  352.  
  353. void main() {
  354. runApp(MaterialApp(
  355. home: CircleApproximation(),
  356. ));
  357. }
  358.  
  359. \end{lstlisting}
  360.  
  361. \section{Результаты}
  362.  
  363. \begin{center}
  364. \includegraphics[scale=0.3]{img1}\\
  365. \includegraphics[scale=0.3]{img2}\\
  366. \includegraphics[scale=0.3]{img3}\\
  367. \end{center}
  368.  
  369. \end{document}
  370.  
Advertisement
Add Comment
Please, Sign In to add comment