以前作ったScalaのMandelbrotを作り直してみた
前回は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 */