Лист клена

Лист клена

Интересно, а можно ли, используя какое-нибудь уравнение, получить график, отображающий лист клена? Оказывается, это вполне реально, и к нашим услугам несколько уравнений, дающих красивый рисунок кленового листа.

Вот одно из таких уравнений в полярных координатах:

r(θ)=a(1cos(32θ))(1+sin(θ))r(\theta) = a \cdot \left(1 — \left|\cos\left(\frac{3}{2}\theta\right)\right|\right) \cdot (1 + \sin(\theta))

Где a — константа, определяющая размер листа, а θ изменяется от 0 до 2π.

Переведём это в декартову систему координат:

x=r(θ)cos(θ)x = r(\theta) \cdot \cos(\theta)
y=r(θ)sin(θ)y = r(\theta) \cdot \sin(\theta)

Теперь приведем код на языке программирования 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


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *