Домашнее задание#
Требования к оформлению отчета
Все отчеты оформляются шрифтом Times New Roman, размер шрифта для основного тектса 14,
для названия глав и пунктов - 16. Межстрочный интервал у текста - 1.5пт.
Все рисунки подписываются по центру снизу в формате Рис. Номер рисунка. Название Рисунка
Все таблицы подписываются сверху справа в формате Таблица. Номер таблицы. Название таблицы.
Все вставки с кодом подписываются сверху справа  в формате Листинг. Номер листинга. Название листинга.
- Согласно вашему номеру по списку реализуйте графическое приложение со следующими функциями: (см. Методические указания по реализации кода)
 - Приложение отрисовывает график и выводит его на экран
 - Пользователь может поставить точку в любом месте окна
 - 
В левом верхнем углу пользователь может увидеть координаты точки и номер "Зоны", в которую попала точка
Полученное приложение скомпелируйте в exe файл. - 
Отчет оформите в Word файле формата *.doc или *.docx
 
Стурктура отчета:
- Титульный лист, офрмленный согласно шаблону. Лабораторная работа №2 "Разработка графического приложения с использованием условных операторов"
- Номер задания. Добавляете рисунок по вашему варианту из таблицы ниже. 
- Описываете функционал приложения. Даете ссылку на Гитхаб. Прикладываете скрин реализации (работающего интерфейса).
- Описываете логику разбиения на зоны. Добавляете рисунок блок-схема "Опредление зоны". 
- Приведите таблицу тестирования (Входные данные Х, Y. Результат: )
Подготовьтесь к защите проекта.
Ход выполнения#
Методические указания по определению положения точки на плоскости, заданной двумя функциями#
- Введение
 
В данной работе рассматриваются две функции, например:
-  y_1 = 0.5 \cdot x  — прямая линия.
-  y_2 = -x^2 + 5  — парабола

Эти функции делят плоскость на пять областей. Цель задания — определить, в какую область попала случайно заданная точка, и вывести соответствующий результат.
- Определение областей
 
Области, образованные пересечением двух функций, могут быть охарактеризованы следующим образом:
- Область 1: Точки, находящиеся выше обеих функций.
 - Область 2: Точки, находящиеся между двумя графиками (внутренняя область).
 - Область 3: Точки, находящиеся ниже прямой y_1 и выше параболы y_2 , при x < 0 .
 - Область 4: Точки, находящиеся ниже прямой y_1 и выше параболы y_2 , при x > 0 .
 - Область 5: Точки, находящиеся ниже обеих функций.
 
Если точка попадает на одну из границ (линий y_1 или y_2 ), выводится сообщение «Граница».
- Условия для определения положения точки
 
3.1. Для функции y_1 = 0.5 \cdot x
- 
Находится на прямой:
 - 
Находится ниже прямой:
 - 
Находится выше прямой:
 
3.2. Для функции y_2 = -x^2 + 5
- 
Находится на кривой:
 - 
Находится во внутренней области:
 - 
Находится во внешней области:
 - 
Специфика областей 3 и 4
 
Условия для областей 3 и 4 совпадают по отношению к графикам, однако они различаются по знаку x :
- 
Область 3:
 - 
Область 4:
 - 
Если условие неочевидно, то необходимо найти точки пересечения графиков
 
Для нахождения точек пересечения функций необходимо приравнять их:
Решая это уравнение, получаем корни:
-  x_1 = -2.5 
-  x_2 = 1 
Соответствующие точки на графиках:
- Точка (-2.5, -1.25)
- Точка (2, 1)
Итоговый алгоритм#
После нахождения точек пересечения выполните следующие шаги:
- Определите границы:
 - 
Используйте найденные точки пересечения, чтобы обозначить границы областей на графике.
 - 
Проверка введенной точки:
 - 
После ввода пользователем координат точки (x, y):
- Проверьте, попадает ли точка на границу:
 - Если y = 0.5 \cdot x или y = -x^2 + 5, выведите «Граница».
 - Если точка не на границе, проверьте её положение относительно функций.
 
 - 
Определите конкретную область:
 - В зависимости от положения точки:
- Если точка выше обеих функций, выводите «Область 1».
 - Если между графиками, выводите «Область 2».
 - Если ниже прямой и выше параболы при x < -2.5, выводите «Область 3».
 - Если ниже прямой и выше параболы при x > 1, выводите «Область 4».
 - Если ниже обеих функций, выводите «Область 5».
 
 
Методические указания по реализации кода#
Для упрощения создания вашего первого графического приложения воспользуйтесь следюущим кодом для отрисовки графиков:
// Функция для отрисовки графика
void drawGraph(sf::RenderWindow& window, std::function<float(float)> func, float xMin, float xMax, float scaleX, float scaleY, sf::Color color) {
    sf::VertexArray graph(sf::LinesStrip);
    for (float x = xMin; x <= xMax; x += 0.1f) {
        float y = func(x); // Вычисление значения функции
        // Преобразование координат в экранные
        float screenX = 400 + x * scaleX;
        float screenY = 300 - y * scaleY;
        // Добавление точки в массив вершин
        graph.append(sf::Vertex(sf::Vector2f(screenX, screenY), color));
    }
    window.draw(graph);
}
Параметры:
sf::RenderWindow& window: ссылка на окно, в котором будет отрисован график.
std::function<float(float)> func: функция, которую необходимо отобразить на графике.
float xMin: минимальное значение по оси X.
float xMax: максимальное значение по оси X.
float scaleX: масштаб по оси X для преобразования координат.
float scaleY: масштаб по оси Y для преобразования координат.
sf::Color color: цвет графика. 
Используйте нижеописанный код для составления программы. Обратите внимание, на комментарии.
Участки с номерами 1-5 требуют модификации программы или простого написания команд.
- Загрузка шрифта: Добавьте код для загрузки шрифта, который будет использоваться для отображения текста координат пользовательской точки.
 - Отображение текста: Создайте текст для отображения координат точки. Установите размер текста равным 20, положение текста - (10,10), цвет - белый. Храните текст в переменной coordinatesText.
 - Логика проверки точки: Реализуйте логику проверки пользовательской точки по переменным mathX и mathY.
 - Очистка экрана: Добавьте код для очистки экрана перед отрисовкой новых кадров.
 - Изменение функции для отрисовки графика
 
#include <SFML/Graphics.hpp>
#include <functional> 
#include <cmath> 
// Функция для отрисовки графика
void drawGraph(sf::RenderWindow& window, std::function<float(float)> func, float xMin, float xMax, float scaleX, float scaleY, sf::Color color) {
    sf::VertexArray graph(sf::LinesStrip);
    for (float x = xMin; x <= xMax; x += 0.1f) {
        float y = func(x); // Вычисление значения функции
        // Преобразование координат в экранные
        float screenX = 400 + x * scaleX;
        float screenY = 300 - y * scaleY;
        // Добавление точки в массив вершин
        graph.append(sf::Vertex(sf::Vector2f(screenX, screenY), color));
    }
    window.draw(graph);
} 
int main() {
    // Создание окна
    sf::RenderWindow window(sf::VideoMode(800, 600), "Приложение для вывода графиков");
    // Переменная для хранения пользовательской точки
    sf::CircleShape userPoint(5); // Радиус 5 пикселей
    userPoint.setFillColor(sf::Color::Red);
    bool userPointExists = false; // Переменная для проверки существования пользовательской точки
    // 1 _ Загрузка шрифта (допишите код)
    // ...
    // ...
    // 
    // 2 _ Текст для отображения координат точки (допишите код)
    // Размер текста 20, положение текста (10,10), цвет белый. Текст храните в переменной coordinatesText
    // ...
    // ...
    //  
    // Оси X и Y
    sf::VertexArray xAxis(sf::Lines, 2);
    xAxis[0].position = sf::Vector2f(50, 300); // Начало оси X
    xAxis[0].color = sf::Color::White; // Цвет оси
    xAxis[1].position = sf::Vector2f(750, 300); // Конец оси X
    xAxis[1].color = sf::Color::White;
    sf::VertexArray yAxis(sf::Lines, 2);
    yAxis[0].position = sf::Vector2f(400, 50); // Начало оси Y
    yAxis[0].color = sf::Color::White; // Цвет оси
    yAxis[1].position = sf::Vector2f(400, 550); // Конец оси Y
    yAxis[1].color = sf::Color::White;
    while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
            window.close();
        // Проверка клика мышью
        if (event.type == sf::Event::MouseButtonPressed) {
            if (event.mouseButton.button == sf::Mouse::Left) {
                // Получение позиции клика
                sf::Vector2i mousePos = sf::Mouse::getPosition(window);
                // Преобразование экранных координат в "математические"
                float mathX = (mousePos.x - 400) / 30.0f; // Масштаб 30 по X
                float mathY = -(mousePos.y - 300) / 100.0f; // Масштаб 100 по Y
                // Установка новой пользовательской точки
                userPoint.setPosition(mousePos.x - userPoint.getRadius(), mousePos.y - userPoint.getRadius());
                userPointExists = true; // Помечаем, что точка существует
                // 3 _ Допишите логику проверки точки по переменным mathX и mathY !
                // ...
                // ...
                //  
                // Обновление текста с координатами точки 
                coordinatesText.setString("Coordinates: (" + std::to_string(mathX) + ", " + std::to_string(mathY) + ")");
            }
        }
    }
        // 4 _ Очистка экрана (допишите код)
        // ...
        // 
        // Отрисовка осей
        window.draw(xAxis);
        window.draw(yAxis);
        // 5 _  Отрисовка графика y1 = 0.5*x (Замените на ваш график)
        drawGraph(window, [](float x) { return 0.5*x; }, -10, 10, 30, 100, sf::Color::Blue);
        // 5 _   Отрисовка графика y2 = x * x - 5 (Замените на ваш график)
        drawGraph(window, [](float x) { return - x * x + 5 / 10.0f; }, -10, 10, 30, 10, sf::Color::Red);
        // Отрисовка пользовательской точки, если она существует
        if (userPointExists) {
            window.draw(userPoint);
            window.draw(coordinatesText);
        }
        // Отображение нового кадра
        window.display();
    }
    return 0;
}
Варианты#
| Вариант | Графики | 
|---|---|
| 1 | ![]()  | 
| 2 | ![]()  | 
| 3 | ![]()  | 
| 4 | ![]()  | 
| 5 | ![]()  | 
| 6 | ![]()  | 
| 7 | ![]()  | 
| 8 | ![]()  | 
| 9 | ![]()  | 
| 10 | ![]()  | 
| 11 | ![]()  | 
| 12 | ![]()  | 
| 13 | ![]()  | 
| 14 | ![]()  | 
| 15 | ![]()  | 
| 16 | ![]()  | 
| 17 | ![]()  | 
| 18 | ![]()  | 
| 19 | ![]()  | 
| 20 | ![]()  | 
| 21 | ![]()  | 
| 22 | ![]()  | 
| 23 | ![]()  | 
| 24 | ![]()  | 
| 25 | ![]()  | 
| 26 | ![]()  | 
| 27 | ![]()  | 
| 28 | ![]()  | 
| 29 | ![]()  | 
| 30 | ![]()  | 





























