Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass[a4paper, 14pt]{extarticle}
- % Поля
- %--------------------------------------
- \usepackage{geometry}
- \geometry{a4paper,tmargin=2cm,bmargin=2cm,lmargin=3cm,rmargin=1cm}
- %--------------------------------------
- %Russian-specific packages
- %--------------------------------------
- \usepackage[T2A]{fontenc}
- \usepackage[utf8]{inputenc}
- \usepackage[english, main=russian]{babel}
- %--------------------------------------
- \usepackage{textcomp}
- % Красная строка
- %--------------------------------------
- \usepackage{indentfirst}
- %--------------------------------------
- %Graphics
- %--------------------------------------
- \usepackage{graphicx}
- \graphicspath{ {./images/} }
- \usepackage{wrapfig}
- %--------------------------------------
- % Полуторный интервал
- %--------------------------------------
- \linespread{1.3}
- %--------------------------------------
- %Выравнивание и переносы
- %--------------------------------------
- % Избавляемся от переполнений
- \sloppy
- % Запрещаем разрыв страницы после первой строки абзаца
- \clubpenalty=10000
- % Запрещаем разрыв страницы после последней строки абзаца
- \widowpenalty=10000
- %--------------------------------------
- %Списки
- \usepackage{enumitem}
- %Подписи
- \usepackage{caption}
- %Гиперссылки
- \usepackage{hyperref}
- \hypersetup {
- unicode=true
- }
- %Рисунки
- %--------------------------------------
- \DeclareCaptionLabelSeparator*{emdash}{~--- }
- \captionsetup[figure]{labelsep=emdash,font=onehalfspacing,position=bottom}
- %--------------------------------------
- \usepackage{tempora}
- \usepackage{amsmath}
- \usepackage{color}
- \usepackage{listings}
- \lstset{
- belowcaptionskip=1\baselineskip,
- breaklines=true,
- frame=L,
- xleftmargin=\parindent,
- language=Python,
- showstringspaces=false,
- basicstyle=\footnotesize\ttfamily,
- keywordstyle=\bfseries\color{blue},
- commentstyle=\itshape\color{purple},
- identifierstyle=\color{black},
- stringstyle=\color{red},
- }
- %--------------------------------------
- % НАЧАЛО ДОКУМЕНТА
- %--------------------------------------
- \begin{document}
- %--------------------------------------
- % ТИТУЛЬНЫЙ ЛИСТ
- %--------------------------------------
- \begin{titlepage}
- \thispagestyle{empty}
- \newpage
- %Шапка титульного листа
- %--------------------------------------
- \vspace*{-60pt}
- \hspace{-65pt}
- \begin{minipage}{0.3\textwidth}
- \hspace*{-20pt}\centering
- \includegraphics[width=\textwidth]{emblem.png}
- \end{minipage}
- \begin{minipage}{0.67\textwidth}\small \textbf{
- \vspace*{-0.7ex}
- \hspace*{-6pt}\centerline{Министерство науки и высшего образования
- Российской Федерации}
- \vspace*{-0.7ex}
- \centerline{Федеральное государственное бюджетное образовательное
- учреждение }
- \vspace*{-0.7ex}
- \centerline{высшего образования}
- \vspace*{-0.7ex}
- \centerline{<<Московский государственный технический университет}
- \vspace*{-0.7ex}
- \centerline{имени Н.Э. Баумана}
- \vspace*{-0.7ex}
- \centerline{(национальный исследовательский университет)>>}
- \vspace*{-0.7ex}
- \centerline{(МГТУ им. Н.Э. Баумана)}}
- \end{minipage}
- %--------------------------------------
- %Полосы
- %--------------------------------------
- \vspace{-25pt}
- \hspace{-35pt}\rule{\textwidth}{2.3pt}
- \vspace*{-20.3pt}
- \hspace{-35pt}\rule{\textwidth}{0.4pt}
- %--------------------------------------
- \vspace{1.5ex}
- \hspace{-35pt} \noindent \small ФАКУЛЬТЕТ\hspace{80pt} <<Информатика и
- системы управления>>
- \vspace*{-16pt}
- \hspace{47pt}\rule{0.83\textwidth}{0.4pt}
- \vspace{0.5ex}
- \hspace{-35pt} \noindent \small КАФЕДРА\hspace{50pt} <<Теоретическая
- информатика и компьютерные технологии>>
- \vspace*{-16pt}
- \hspace{30pt}\rule{0.866\textwidth}{0.4pt}
- \vspace{11em}
- \begin{center}
- \Large {\bf Лабораторная работа № 1} \\
- \large {\bf по курсу <<Разработка мобильных приложения>>} \\
- \large <<Графический пользовательский интерфейс в Dart>>
- \end{center}\normalsize
- \vspace{8em}
- \begin{flushright}
- {Студент группы ИУ9-72Б Суханов А.С.\hspace*{15pt} \\
- \vspace{2ex}
- Преподаватель Посевин Д. П.\hspace*{15pt}}
- \end{flushright}
- \bigskip
- \vfill
- \begin{center}
- \textsl{Москва 2023}
- \end{center}
- \end{titlepage}
- %--------------------------------------
- % КОНЕЦ ТИТУЛЬНОГО ЛИСТА
- %--------------------------------------
- \renewcommand{\ttdefault}{pcr}
- \setlength{\tabcolsep}{3pt}
- \newpage
- \setcounter{page}{2}
- \section{Цель работы}\label{Sect::task}
- \par
- Научиться создавать приложения с графическим пользовательским интерфейсом
- c
- использованием фреймворка Flutter на языке программирования Dart.
- \section{Задание}
- В течение лабораторной работы нужно разработать программу, рисующую на
- экране
- мобильного устройства одно из изображений, перечисленных в таблице ниже.
- Программа
- должна иметь графический пользовательский интерфейс, через который
- пользователь может
- задавать параметры изображения. Изображение должно перерисовываться
- автоматически при
- изменении любого параметра. Значения параметров, обозначенных в таблице
- латинскими
- буквами, представляют собой неотрицательные целые числа. Когда в описании
- изображения
- говорится о выборе цвета, подразумевается выбор из нескольких
- предопределённых
- альтернатив (например, красный, зелёный или синий).
- \section{Индивидуальный вариант}
- Окружность радиуса r, изображённая с помощью квадратов со стороной a,
- наклонённых на угол alfa.
- \pagebreak
- \section{Практическая реализация}
- Код представлен в Листинге 1.
- \begin{lstlisting}
- import 'dart:math';
- import 'package:flutter/material.dart';
- import 'package:vector_math/vector_math.dart' as vec;
- class CircleApproximation extends StatefulWidget {
- @override
- _CircleApproximationState createState() => _CircleApproximationState();
- }
- class _CircleApproximationState extends State<CircleApproximation> {
- double radius = 100.0;
- double squareSize = 10.0;
- double rotationAngle = 45.0;
- @override
- Widget build(BuildContext context) {
- int squaresCount = (2 * pi * radius / squareSize).ceil();
- return Scaffold(
- appBar: AppBar(
- title: Text('Approximation of a circle by squares'),
- ),
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- Container(
- width: radius * 2,
- height: radius * 2,
- child: CustomPaint(
- painter: CirclePainter(
- radius: radius,
- squareSize: squareSize,
- rotationAngle: rotationAngle,
- squaresCount: squaresCount,
- ),
- ),
- ),
- SizedBox(height: 20.0),
- Text('Radius: $radius'),
- Slider(
- value: radius,
- onChanged: (value) {
- setState(() {
- radius = value;
- });
- },
- min: 10.0,
- max: 200.0,
- ),
- Text('Square size: $squareSize'),
- Slider(
- value: squareSize,
- onChanged: (value) {
- setState(() {
- squareSize = value;
- });
- },
- min: 5.0,
- max: 20.0,
- ),
- Text('Angle of inclination: $rotationAngle'),
- Slider(
- value: rotationAngle,
- onChanged: (value) {
- setState(() {
- rotationAngle = value;
- });
- },
- min: 0.0,
- max: 90.0,
- ),
- ],
- ),
- ),
- );
- }
- }
- class CirclePainter extends CustomPainter {
- final double radius;
- final double squareSize;
- final double rotationAngle;
- final int squaresCount;
- CirclePainter({
- required this.radius,
- required this.squareSize,
- required this.rotationAngle,
- required this.squaresCount,
- });
- @override
- void paint(Canvas canvas, Size size) {
- final paint = Paint()
- ..color = Colors.blue
- ..style = PaintingStyle.stroke;
- for (int i = 0; i < squaresCount; i++) {
- final angle = 2 * pi * i / squaresCount;
- final x = radius * cos(angle);
- final y = radius * sin(angle);
- final matrix = vec.Matrix4.identity()
- ..translate(radius, radius)
- ..rotateZ(rotationAngle * pi / 180)
- ..translate(-squareSize / 2, -squareSize / 2);
- final points = [
- Offset(x, y),
- Offset(x + squareSize, y),
- Offset(x + squareSize, y + squareSize),
- Offset(x, y + squareSize),
- ];
- for (int j = 0; j < points.length; j++) {
- final vector3 = vec.Vector3(points[j].dx, points[j].dy, 0);
- matrix.transform3(vector3);
- points[j] = Offset(vector3.x, vector3.y);
- }
- final path = Path()
- ..moveTo(points[0].dx, points[0].dy)
- ..lineTo(points[1].dx, points[1].dy)
- ..lineTo(points[2].dx, points[2].dy)
- ..lineTo(points[3].dx, points[3].dy)
- ..close();
- canvas.drawPath(path, paint);
- }
- }
- @override
- bool shouldRepaint(covariant CustomPainter oldDelegate) {
- return true;
- }
- }
- void main() {
- runApp(MaterialApp(
- home: CircleApproximation(),
- ));
- }
- \end{lstlisting}
- \section{Результаты}
- \begin{center}
- \includegraphics[scale=0.3]{img1}\\
- \includegraphics[scale=0.3]{img2}\\
- \includegraphics[scale=0.3]{img3}\\
- \end{center}
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment