SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで学ぶグラフィックス処理

マンデルブロー集合による新しいフラクタル図形を探索する

パラメータ設定可能なフラクタルCG描画アプレットの作成


  • X ポスト
  • このエントリーをはてなブックマークに追加

マンデルブロー集合はフラクタル図形の一種として有名で、これを描画する方法は広く知られています。本稿では、単なる描画ではなく、マンデルブロー集合から面白いパターンを容易に探索できるように実装します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 マンデルブロー集合はフラクタル図形の一種として有名で、これを描画する方法は広く知られています。ここでは、単なる描画ではなく、マンデルブロー集合から面白いパターンを容易に探索できるようにしました。

対象読者

 複素数演算に興味を持ち、複素数が作り出す不思議な世界を旅したい人。

必要な環境

 J2SE 5.0を使っていますが、それより古いバージョンでも大丈夫です。繰り返し回数を増やすとCPUパワーが必要になります。

マンデルブロー集合とは

 ポーランド生まれの数学者Benoit B. Mandelbrotが、1982年に出版した『The Fractal Geometry of Nature』で紹介してから、急に有名になりました。

 マンデルブロー集合とは、ZおよびCを複素数とし、Zの初期値を実数部0、虚数部0として、Z=Z2+Cの演算を多数回繰り返しても、Zの絶対値が一定の値(例えば2.0)を超えず、発散しないCの値の集まりをいいます。Z=Z2+Cが最も一般的ですが、Z=Z3+Cやその他の式を用いる場合もあります。以後は、複素数を表すのにZCなどの太字を用いることを省略します。

 実際には、繰り返し回数に上限を設けて(そうしないと、計算時間が無限になる)、その回数でもZの絶対値が一定の値を超えない場合は、発散しないものと定義し、マンデルブロー集合のメンバーに加えます。

 マンデルブロー集合を、Cの実数部と虚数部を用いて二次元複素平面に表示したのがマンデルブロー図形で、細部も同じような形をしており、代表的なフラクタル図形です。マンデルブロー集合の領域を黒などで表し、それ以外の領域では、Zの絶対値が一定の値(例えば2.0)を超えるまでの繰り返し回数をカラーで置き換えて、美しい独特のパターンを表現します。

マンデルブロー集合の面白さ

 マンデルブロー集合の描画は、そのフラクタル性と興味ある形状から、盛んに行なわれてきました。しかし、多くは、基本図形の描画に留まっていました。それは、マンデルブロー集合の周辺部には、繰り返し回数を数万回に大きくして、ようやく発散する個所が多数あり、それらの探索にはCPUパワーがないと時間がかかったからです。しかし、そこは前人未踏の領域で、面白い図形が隠されている可能性があり、最近のCPUの進歩のお陰で、多くのホビイストが探索を始めています。

マンデルブロー集合のいろいろ

 マンデルブロー集合は、Z=Z2+Cが最も一般的ですが、広義のマンデルブロー集合として下図のものなどが知られています。図で左上は基本形で、右下は、Zの共役複素数(Z’で表す)の二乗を用いたものです。これらは、いずれも本記事で紹介するプログラムの一部を変更して描画しました。条件は、それぞれの図形の下に記してあります。

図1 広義のマンデルブロー図形の例
図1 広義のマンデルブロー図形の例

プログラムの概要

 このプログラムは、複素数の演算を繰り返して実行します。特にComplex(複素数)クラスを設けるまでもなく、実数部と虚数部とに分けて演算すれば可能ですが、将来の利用も考えてComplexクラスを作成しました。

 マンデルブロー集合の図形を部分的に拡大し、興味ある個所を探索するには、マウスクリックによる場所の指定と、クリックごとの拡大を必要とします。ここでは、マウスクリックにより、その場所が新しい画面の中央に移動し、[クリック倍率]で指定された倍率で画面が広がるようにしました。

 自分がかつて探索した場所を再び訪れたい場合や、他の資料に示されている場所を追試してみたい場合のために、座標を外部から入力する機能を付加しました。

 [繰返し回数の上限]は、十分大きくとらないと、新しい興味ある図形を探索できません。しかし、その場合は一回の実行に時間がかかります。そこで、すべての設定値を確認してから、慎重に実行に移れるように、[外部設定]や[実行]のボタンを設けました。

 図2のフローチャートに示すように、このプログラムの主要部(paint())は次の内容からなっています。

  1. 描画する点の位置に応じて、Cの実数部crealと虚数部cimagを計算する。
  2. Zを0+0iに初期化し、繰り返し回数countをクリヤする。
  3. 本プログラムの中心であるZ=Z2+Cと、Zの絶対値の二乗であるvalueを計算する。
  4. 繰り返し回数countをインクリメントする。
  5. 繰り返し回数countが繰り返し回数の上限count_maxを超えた場合には、count=-1に設定して、ループを抜ける。
  6. Zの絶対値の二乗であるvalueが4.0を超えると、発散したとみなし、ループを抜ける。
  7. 発散に必要とした繰り返し回数count、または繰り返し回数の上限であるcount_maxを超えても発散しなかったことを表すcount=-1を使って、描画すべき色を設定する。
  8. 上記の色で、描画する。
図2 図形描画のためのpaint()のフローチャート
図2 図形描画のためのpaint()のフローチャート

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
プログラム

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで学ぶグラフィックス処理連載記事一覧

もっと読む

この記事の著者

石立 喬(イシダテ タカシ)

1955年東京工大卒。同年、NECへ入社し、NEC初のコンピュータの開発に参画。磁気メモリ、半導体メモリの開発、LSI設計などを経て、1989年帝京大学理工学部教授。情報、通信、電子関係の教育を担当。2002年定年により退職し現在に至る。2000年より、Webサイト「Visual C++の勉強部屋」を公開。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/256 2008/03/16 10:46

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング