牛顿分形图案中只绘制了四分之一的部分

5
我正在使用F#绘制f(x) = x^3 - 1的牛顿分形图时遇到了问题。我的程序似乎只绘制了分形图的右下角1/4,什么都没有。由于实际绘制的区域是正确的,我认为问题可能出在表单上位图的表示方式上。
这是我得到的图片链接: 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个回答

5
实际上,你看到的是右上角而不是右下角,但它被颠倒了。由于分形的右半部分关于x轴对称,所以你看不出来。
问题在于你按照标准笛卡尔坐标系绘制,其中(+, +)位于原点的右上方,并且形式朝向以左上角为原点,坐标向右和向下增加。
要纠正它,你需要将数学坐标转换为表单上的坐标,如下所示:
new Rectangle(x,y,1,1)

成为

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

其中xminymin是您正在绘制的区域的最小范围。请注意x坐标和y坐标之间的计算差异,因为y维度也需要翻转。


我理解这个表单在左上角有(0,0),是这样吗?我需要自己计算坐标转换还是有函数可以帮我完成? - ComicSans
1
你说得对。坐标(0,0)位于左上角。你还需要自己进行计算来移动坐标,但我已经更新了我的答案,展示了可能需要的示例。 - Jaquez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接