SHOEISHA iD

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

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

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

ジュリア集合の色付けを工夫して芸術的なフラクタル図形を描く

マンデルブロー図形の一部をクリックしてジュリア図形を描く


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

前稿で紹介したマンデルブロー集合と姉妹関係にあるジュリア集合を描く方法を解説します。今回は、特に着色方法に重点を置いて紹介します。

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

はじめに

 マンデルブロー集合と姉妹関係にあるジュリア集合を描く方法を、特に着色方法に重点を置いて紹介します。

対象読者

 フラクタル図形の一つであるジュリア集合で、より芸術的な図形を探索したい人。

必要な環境

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

ジュリア(Julia)集合とは

 フランスの数学者Gaston Maurice Juliaが、1918年に論文「Memoire sur l'iteration des fonctions rationnelles」で発表したものです。マンデルブロー集合のBenoit Mandelbrotは1924年生まれですから、マンデルブローが生まれる前からジュリア集合は知られていました。ジュリア集合とマンデルブロー集合の違いは、Z=Z2+Cの繰返し計算において、マンデルブロー集合がZの初期値Z0を常にZ0=0+0iとして、C平面上に図形を描画するのに対し、ジュリア集合では、Cを任意に与え、Z0平面上に図形を描画することです。

 両者の違いを簡単にまとめますと、下表のようになります。

マンデルブロー集合とジュリア集合の比較
マンデルブロー集合ジュリア集合
漸化式Z=Z2+Cが一般的Z=Z2+Cが一般的
Cの値複素平面上を変化させる固定(外部から設定)
Zの初期値Z00 + 0i に固定複素平面上を変化させる
集合の範囲発散しないCの値発散と収束の境界のZ0の値(本来のジュリア集合)、発散しないZ0の値(充填ジュリア集合)
集合の特徴フラクタル性、一個の塊フラクタル性、一個の塊の場合とバラバラの場合がある

ジュリア集合とジュリア図形

 ジュリア集合を図形として描く方法は、マンデルブロー集合の場合とほとんど同じで、Z0の値を画面上の座標に対応させ、発散に至るまでの漸化式の繰返し回数や、その時のZの値などで色付けします。ジュリア図形は芸術性が高く、「ジュリア図形ギャラリー」などとして、多くの作品が公開されています。念のために付け加えますと、美しいのはジュリア集合に属する領域ではなく、ジュリア集合を取り囲む周辺の発散領域です。

色付け(Coloring)

 マンデルブロー集合やジュリア集合の図形を美しく見せるには、色付けの工夫が重要です。公開資料では、具体的な方法は明らかになっていませんので、オリジナルのアイデアを発揮する余地が残っています。

色付けの対象

 何に対して色をつけるかは、大きく分けて、

  1. Zの絶対値が一定値を超えるまでに要した繰返し演算回数
  2. 繰返し回数の関数(二乗、平方根、対数など)
  3. Zの絶対値が一定値を超えたときの絶対値の値
  4. その偏角(Argument)

 などがあります。1.が基本ですが、2.も良く使われます。それ以外は、特殊な効果を狙う場合にのみ有用です。

色付けの方法

 離散的なカラーパレットや連続したカラーグラデーション(Gradation、推移)を使って、繰返し回数などのデータ値と色との関係を1対1に対応させるのが一般的ですが、複数のデータ値に対応させるために、HSV方式を使う場合もあります。例えば、繰返し回数をH(Hue、色相)に、Zの絶対値をS(Saturation、彩度)に、Zの偏角をV(Value、明度)に対応させると、複雑な色付けが可能になります。しかし、結果は、必ずしも効果的とはいえません。

 カラーグラデーションは、色相環や虹色を用いるものの他、「白」や「黒」を混ぜて美しく見せる手法もあります。本稿のプログラムでは、色相を用いたものを「Aタイプ」と呼び、「白」や「黒」を含めたものを「Bタイプ」として、2種類のカラーグラデーションを用意しました。

プログラム作成で留意した点

 繰返し回数を大きくしないと、興味ある図形に遭遇できませんので、一回の描画に要する時間が非常に長くなります。また、狭い範囲を拡大して探索するために、描画の回数も増加します。そこで、従来のrepaint()による全面的な描画を止め、ジュリア図形またはマンデルブロー図形を必要に応じて、個別に描画しました。これは、元の図形を上書きしますので、直前の図形と比較ができる長所があります。一方、ほとんど同一の図形の場合は、描画が行なわれているのか終わったのかが分かりにくくなりますので、「ジュリア図形描画中」の表示を付加しました。

次のページ
プログラム

修正履歴

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング