Что будет, если взять функцию вида:
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] гораздо надежнее (при построении, на этом интервале не возникает лишних точек да и расчетов меньше).