以前作ったScalaのMandelbrotを作り直してみた

a-san2010-06-11

前回はjavaのswingを使っていましたが、今回はscala2.8のswingにしてみました。
http://d.hatena.ne.jp/a-san/20100213#p1

import java.awt.image.BufferedImage
import java.awt.Color

/**
 * マンデルブロート集合を表示する。
 */
object Mandelbrot {
    /**
     * 画像を作成する。
     */
    def createImage(mx:Double, my:Double, zoom:Double, maxCount:Int):BufferedImage = {
        var image = new BufferedImage(500, 500, BufferedImage.TYPE_3BYTE_BGR)
        for (y <- 0 until image.getHeight) {
            for (x <- 0 until image.getWidth) {
                val cx = mx + (x-image.getWidth  / 2) / zoom
                val cy = my - (y-image.getHeight / 2) / zoom
                val count = calcMandelbrot(cx, cy, maxCount)
                if (count != -1) {
                    val color = Color.HSBtoRGB(count/100.0f, 1.0f, 1.0f)
                    image.setRGB(x, y, color)
                }
                else {
                    image.setRGB(x, y, 0)   // BLACK
                }
            }
        }
        image
    }
    /**
     * マンデルブロートの各点において、z^2 > 4 になるまでの回数を計算する。
     * maxCount回を超えると-1を返す。
     */
    def calcMandelbrot(cx:Double, cy:Double, maxCount:Int):Int = {
        var zx = 0.0
        var zy = 0.0
        for (i <- 0 until maxCount) {
            val sx = zx * zx
            val sy = zy * zy
            if ((sx + sy) >= 4.0)
                return i
            zy = 2.0 * zx * zy + cy
            zx = sx - sy + cx
        }
        -1
    }
}

import scala.swing.{SwingApplication,MainFrame,Label,Alignment}
import java.io.File
import javax.imageio.ImageIO
import javax.swing.ImageIcon

object MandelbrotTest extends SwingApplication {
    val image = Mandelbrot.createImage(-0.745428, 0.113009, 100, 100)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 1000, 100)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 10000, 500)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 100000, 1000)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 1000000, 1000)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 10000000, 1500)
//  val image = Mandelbrot.createImage(-0.745428, 0.113009, 100000000, 2000)
    ImageIO.write(image, "png", new File("MandelbrotSet0.png"))

    def startup(args: Array[String]) {
        val top = new MainFrame {
            title = "Mandelbrot Set"
            iconImage = ImageIO.read(new File("MandelbrotSet250x250.png"))
            contents = new Label("", new ImageIcon(image), Alignment.Center)
            pack()
            visible = true
        }
    }
}

/*
fsc Mandelbrot.scala
scala MandelbrotTest
*/