Сердце

Что будет, если взять функцию вида:

sqrt(cos(x)) * cos(200.0 * x) + sqrt(abs(x)) - (3.1415926 / 4.0) * ((4 - x * x) ^^ 0.01)

забить на полярные координаты и построить эту функцию на промежутке от [-1.57; 1.57], используя достаточно небольшой шаг ?

А вот проверим!

Создаем пустой проект dub, вносим необходимые изменения в конфигурацию и помещаем в app.d довольно простой код, задействующий уже знакомую нам DGui:

import dgui.all, std.math, std.stdio;

void drawPoint(Canvas c, int x, int y) {
  Pen p = new Pen(SystemColors.red, 10, PenStyle.solid);
  c.drawLine(p, x, y, x + 1, y + 1);
};

float heartf(float x)
{
  return sqrt(cos(x)) * cos(200.0 * x) + sqrt(abs(x)) - (3.1415926 / 4.0) * ((4 - x * x) ^^ 0.01);
}

void drawHeart(Canvas c)
{
  for (float i = -1.57; i < 1.57; i += 0.0005)
  {
      auto x = cast(int) (250 - 100*i);
      auto y = cast(int) (250 - 100*heartf(i));
      drawPoint(c, x, y);
  }
}

class MainForm : Form
{
    public this()
    {
        this.text = "Сердце";
        this.size = Size(500, 550);
        this.startPosition = FormStartPosition.centerScreen;
    };

    protected override void onPaint(PaintEventArgs e)
    {

        Canvas c = e.canvas;
        drawHeart(c);

        super.onPaint(e);
    }
};


int main(string[] args)
{
    return Application.run(new MainForm());
}

После небольшого ожидания результатов компиляции увидим интересную картинку:

Неожиданно, не правда ли?!

P.S : Эту функцию нетрудно найти в Интернете, однако, во всех источниках интервал построения — [-2.0; 2.0], однако, наши эксперименты показали, что интервал [-1.57; 1.57] гораздо надежнее (при построении, на этом интервале не возникает лишних точек да и расчетов меньше).

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