ГЛАВНАЯ RU typewriter

older-tomato

График функции в консоли

Геометрические фигуры • Текстовое изображение 05.02.2023

Напишем алгоритм для вывода графика функции или системы уравнений в консоль в виде текста. Будем использовать средства Java. Для вычислений будем использовать класс Math, а для обхода диапазона координат — два вложенных цикла for. Нарисуем в консоли график окружности и графики вписанных в неё ромба и квадрата.

График функции с заполнением: Рисуем сердечко в консоли.

Уравнения функций #

Каждую точку (x,y) из выводимого диапазона координат будем проверять на принадлежность графикам функций и в соответствии с этим выводить. Параметры функций и выводимый диапазон определим заранее перед началом обхода.

Ромб.

|x-a|+|y-b|=r.

Квадрат.

\begin{cases}|x-a|=c\land|y-b|\leqslant c,\\|y-b|=c\land|x-a|\leqslant c,\\c=r\times1/\sqrt2.\end{cases}

Окружность.

\sqrt{(x-a)^2+(y-b)^2}=r.

Параметры.

r — радиус окружности;

(a,b) — центр фигуры;

c — половина стороны квадрата.

Математические операции #

Для выполнения базовых математических операций в Java используется библиотека FdLibmСвободно распространяемая математическая библиотека. Большинство методов реализовано на уровне платформы для увеличения производительности. Обращаться к ним будем через класс Math.

Для вычислений с плавающей точкой и округлений результатов будем использовать методы класса Math.

abs(a) — абсолютное значение аргумента a;

pow(a,b) — возведение аргумента a в степень b;

sqrt(a) — квадратный корень из аргумента a;

ceil(a) — округление аргумента a в бо́льшую сторону;

floor(a) — округление аргумента a в ме́ньшую сторону.

Описание алгоритма #

Берём диапазон координат на плоскости таким образом, чтобы выводимая фигура полностью помещалась в печатаемой области. Обходим выбранный диапазон двумя вложенными циклами for: сначала по оси y и затем по оси x. Каждую точку проверяем на принадлежность графикам функций и выводим. Для наглядности также выводим координатные оси, начало координат и центр фигуры.

// радиус, центр фигуры, отступ
int r=12, a=5, b=-1, gap=2;
// границы текстового изображения
int xMin=a-r-gap, xMax=a+r+gap;
int yMin=b-r-gap, yMax=b+r+gap;
// половина стороны вписанного квадрата
double c = Math.ceil(r/Math.sqrt(2));
// выводим заголовок
System.out.println("Радиус: "+r+"; центр: 0("+a+","+b+").");
// вывод в консоль построчно слева направо сверху вниз
for (int y = yMax; y >= yMin; y--) {
    for (int x = xMin; x <= xMax; x++) {
        // каждую точку проверяем на принадлежность графикам и выводим
        if (Math.abs(x-a) + Math.abs(y-b) == r)
            System.out.print("z "); // ромб
        else if (Math.abs(x-a) == c && Math.abs(y-b) <= c
                || Math.abs(y-b) == c && Math.abs(x-a) <= c)
            System.out.print("* "); // квадрат
        else if (Math.floor(Math.sqrt(Math.pow(x-a,2)+Math.pow(y-b,2))) == r)
            System.out.print("o "); // окружность
        else if (y == b && x == a)
            System.out.print("0 "); // центр фигуры
        else if (y == 0 && x == 0)
            System.out.print("+-"); // центр координат
        else if (y == 0) // ось абсцисс (x)
            System.out.print(x == xMax ? ">x" : "--");
        else if (x == 0) // ось ординат (y)
            System.out.print(y == yMax ? "↑y" : "¦ ");
        else // пустое место
            System.out.print("  ");
    } // переход на новую строку
    System.out.println();
}

Текстовое изображение в консоли.

Радиус: 12; центр: 0(5,-1).
                  ↑y                                      
                  ¦                                       
                  ¦ o o o o z o o o o                     
                o o       z   z       o o                 
            o o   ¦     z       z         o o             
          * * * * * * z * * * * * z * * * * * *           
        o *       ¦ z               z         * o         
        o *       z                   z       * o         
      o   *     z ¦                     z     *   o       
      o   *   z   ¦                       z   *   o       
    o     * z     ¦                         z *     o     
    o     z       ¦                           z     o     
    o   z *       ¦                           * z   o     
----o z --* ------+---------------------------* --z o -->x
    z     *       ¦         0                 *     z     
    o z   *       ¦                           *   z o     
    o   z *       ¦                           * z   o     
    o     z       ¦                           z     o     
    o     * z     ¦                         z *     o     
      o   *   z   ¦                       z   *   o       
      o   *     z ¦                     z     *   o       
        o *       z                   z       * o         
        o *       ¦ z               z         * o         
          * * * * * * z * * * * * z * * * * * *           
            o o   ¦     z       z         o o             
                o o       z   z       o o                 
                  ¦ o o o o z o o o o                     
                  ¦                                       
                  ¦                                       

© Головин Г.Г., Код с комментариями, 2023