Помогите перевести небольшой код из C в C#

324
16 января 2017, 18:46

Данный код рисует некий фрактал.

int main() {
    double a = 0.85, b = 0.9, k = 0.5, p = 7.7; // константы. При изменении их будет модифицироваться изображение
    complex z;
    int gd = DETECT, gm;
    int i;
    initgraph(&gd, &gm, "G:\\programs\\BC31\\BGI"); // инициализируем графику
    z = 0;
    for (i = 0; i <= 30000; i++) {
        z = a + b * z * exp(complex(0, (k - p / (1 + abs(z * z))))); // формула, по которой рисуем
        putpixel(real(z) * 180 + 240, imag(z) * 180 + 280, 14); // ставим точку на экране
    }
    getch(); // пауза для задержки изображения на экране
    closegraph();
    return 0;
}

Необходимо перевести в C#. Вот мои потуги. На данный момент есть ошибки. Никак не разберусь с этими комплексными числами.

private void MilkyMay()
{
    double a = 0.85, b = 0.9, k = 0.5, p = 7.7; // константы. При изменении их будет модифицироваться изображение         
    int i;
    milc = new Bitmap(pictureBox1.Width, pictureBox1.Height); // инициализируем графику
    Complex z = 0;
    Complex c;
    for (i = 0; i <= 30000; i++)
    {
        z = a + b * z * Math.Exp(c = new Complex (0, (k - p / (1 + Math.Abs(z * z))))); // формула, по которой рисуем
        milc.SetPixel(Convert.ToInt32(z.Real * 180 + 240), Convert.ToInt32(z.Imaginary * 180 + 280), Color.LawnGreen); // ставим точку на экране
    }
    pictureBox1.BackgroundImage = milc;
}

Сейчас ошибка только в Math.Abs(z * z),

Argument 1: cannot convert from 'System.Numerics.Complex' to 'sbyte'

но и во всем остальном я не сильно уверен.

Answer 1

Перевод верен, за исключением того, что для комплексных чисел нужно применять специальные методы находящиеся в структуре Complex, а именно:

  1. Complex.Abs - для получения модуля комплексной переменной
  2. Complex.Exp - для возведения экспоненты в комплексную степень.

Кроме этого, нет нужды в переменной c, которая нигде не используется.

В итоге все может выглядеть так:

z = a + b * z * Complex.Exp(new Complex(0, (k - p / (1 + Complex.Abs(z * z))))); // формула, по которой рисуем
READ ALSO
C# ArgumentOutOfRangeException stream.Read

C# ArgumentOutOfRangeException stream.Read

как исправить ошибку ArgumentOutOfRangeException в строке

280
Вопрос по Autocomplete textbox с#

Вопрос по Autocomplete textbox с#

Есть таблица "kontr" с полями id,name,typeНа форме есть textbox на нем стоит автозаполнение из таблицы "kontr"

357
Ошибка outofmemory при декомпрессии ab (Android Backup) файла

Ошибка outofmemory при декомпрессии ab (Android Backup) файла

На англоязычной версии сайта нашел метод, который мне очень подходит:

390
Действия формы авторизации без сохранения данных

Действия формы авторизации без сохранения данных

Знатоки, может у Вас есть идеи, как реализовать это?

314