Напишем алгоритм для вывода графика функции или системы уравнений в консоль в виде текста. Будем
использовать средства Java. Для вычислений будем использовать класс Math, а для обхода диапазона
координат — два вложенных цикла for. Нарисуем в консоли график окружности и графики вписанных
в неё ромба и квадрата.
График функции с заполнением: Рисуем сердечко в консоли.
Каждую точку (x,y) из выводимого диапазона координат будем проверять на принадлежность графикам
функций и в соответствии с этим выводить. Параметры функций и выводимый диапазон определим заранее
перед началом обхода.
Ромб.
Квадрат.
Окружность.
Параметры.
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