1/4 фрактала Ньютона нарисована только - PullRequest
0 голосов
/ 06 мая 2018

У меня проблема с рисованием фрактала Ньютона для f (x) = x ^ 3 - 1 с использованием F # Проблема в том, что моя программа, кажется, рисует только правую нижнюю часть фрактала и ничего больше. Так как фактическая нарисованная область является правильной, я понимаю, что проблема может быть связана с растровым представлением в форме

Вот ссылка на изображение, которое я получаю https://imgur.com/a/YPSYIk9

Код, который я до сих пор придумал:

open System
open System.Drawing
open System.Windows.Forms
open System.Numerics

let pi = 3.14159265359
let MaxCount = 50
let multCol = 15
let Tol = 0.5
let r1 = Complex(1.0, 0.0)
let r2 = Complex(-0.5, sin(0.66*pi))
let r3 = Complex(-0.5, -sin(0.66 * pi))

let createImage () =
    let image = new Bitmap (800, 800,System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    let graphics = Graphics.FromImage(image)
    let mutable maxMod = 0.0
    for x = 0 to image.Width - 1 do
        for y = 0 to image.Height - 1 do
            let mutable z = Complex(float x , float y)
            let mutable count = 0
            while (count < MaxCount && Complex.Abs(z - r1) >= Tol && Complex.Abs(z - r2) >= Tol && Complex.Abs(z - r3) >= Tol) do
                if(Complex.Abs(z) > 0.0) then
                    z <- z - (z*z*z - Complex(1.0,0.0))/(Complex(3.0,0.0) * z * z)
                if(Complex.Abs(z) > maxMod) then
                    maxMod <- Complex.Abs(z)
                count <- count + 1
            let temp1 = Complex.Abs(z - r1)
            let temp2 = Complex.Abs(z - r2)
            let temp3 = Complex.Abs(z - r3)
            if(Complex.Abs(z - r1) <= Tol) then
                let Brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red)
                graphics.FillRectangle(Brush, new Rectangle(x,y,1,1))
            if(Complex.Abs(z - r2) <= Tol) then
                let Brush = new System.Drawing.SolidBrush(System.Drawing.Color.Blue)
                graphics.FillRectangle(Brush, new Rectangle(x,y,1,1))
            if(Complex.Abs(z - r3) <= Tol) then
                let Brush = new System.Drawing.SolidBrush(System.Drawing.Color.Green)
                graphics.FillRectangle(Brush, new Rectangle(x,y,1,1))
    image.Save("redacted.png")

createImage()

Может ли кто-нибудь дать мне подсказку о том, какая проблема может на самом деле возникнуть?

1 Ответ

0 голосов
/ 06 мая 2018

На самом деле это выглядит так, как будто вы видите top справа, а не справа внизу, но оно переворачивается вверх ногами. Вы не можете сказать, потому что правая половина фрактала симметрична относительно оси X.

Проблема в том, что вы рисуете в соответствии со стандартным декартовым планом с (+, +) в правом верхнем углу от начала координат, а формы ориентированы с началом координат вверху слева с координатами, увеличивающимися вправо и вниз.

Чтобы исправить это, вам нужно преобразовать математические координаты в координаты в форме, как показано ниже:

new Rectangle(x,y,1,1)

становится

new Rectangle(x - xmin,ymin - y,1,1)

, где xmin и ymin - минимальные размеры области, которую вы строите. И обратите внимание на разницу между вычислениями для x- и y-координат, поскольку размер y также необходимо перевернуть.

...