Интересно, а можно ли, используя какое-нибудь уравнение, получить график, отображающий лист клена? Оказывается, это вполне реально, и к нашим услугам несколько уравнений, дающих красивый рисунок кленового листа.
Вот одно из таких уравнений в полярных координатах:
Где a — константа, определяющая размер листа, а θ изменяется от 0 до 2π.
Переведём это в декартову систему координат:
Теперь приведем код на языке программирования D, который рисует лист клена.
import std.stdio;
import std.math;
import std.conv;
import std.array;
import std.range;
import std.file;
void main()
{
// Параметры для отрисовки
int width = 800;
int height = 800;
double scale = 200.0;
int centerX = width / 2;
int centerY = height / 2;
// Создание изображения в формате PPM (Portable Pixmap)
auto image = new char[width * height * 3];
image[] = 255; // Заполняем белым цветом
// Функция для вычисления r(φ)
double r(double phi)
{
return 1.5 + 0.9 * cos(6 * phi) + 0.1 * cos(12 * phi);
}
// Генерация координат и отрисовка листа клена
foreach (phi; iota(0.0, 2 * PI, 0.001))
{
double radius = r(phi);
double x = radius * cos(phi);
double y = radius * sin(phi);
// Преобразование координат в пиксельные значения
int px = cast(int)(centerX + x * scale);
int py = cast(int)(centerY - y * scale);
// Проверка границ изображения
if (px >= 0 && px < width && py >= 0 && py < height)
{
int index = (py * width + px) * 3;
image[index] = 0; // Красный канал
image[index + 1] = 128; // Зеленый канал
image[index + 2] = 0; // Синий канал
}
}
// Сохранение изображения в файл
string filename = "maple_leaf.ppm";
auto file = File(filename, "wb");
file.write("P6\n", to!string(width), " ", to!string(height), "\n255\n");
file.rawWrite(image);
file.close();
writeln("Изображение листа клена сохранено в ", filename);
}
Автор статьи:
Обновлено:
01.06.2024
Добавить комментарий