プログラミング工房
TOP
Flex基本
開発環境 JavaScript連携 PHP連携1 PHP連携2(AMFPHP) ウィンドウ ボタンスキン 矩形スキン ローカルファイル(テキスト) F5等の対策 ローカルファイル(イメージ) ダウンロード、アップロード 1枚の画像のカラーを変更 時間のかかる計算処理 外部SWFの読込み
Flexで3D
Flexだけで3D Papervision3Dを使ってみる 3Dオブジェクト カメラ、前後判定の工夫しました 自由な形状を作成
Flexでクラス
Class1(白黒ゲームの盤) Class2(白黒ゲームのプレイヤー) Class3(プレイヤーを外部SWF)
PHP
共通関数1
Flexの作品
お問合せの説明 サンプルのソース表示の説明 分子構造の表示(PDBファイル) マンデルブロ集合の画像作成 swf参加型白黒ゲーム(Reversi) ストップウォッチ WEB素材
AIR
AIRを使ってみる ソースファイルのHTML変換を作る
etc.
マンデルブロ集合のギャラリー ジュリア集合のギャラリー wonderflを使ってみました お問合せ

Flexの作品-マンデルブロ集合の画像作成

■2011.04.07:作成
■2011.05.17:改定 マンデルブロ集合プログラム改定、ジュリア集合プログラム追加
マンデルブロ集合の画像作成プログラム マンデルブロ集合の画像作成プログラムのソース
ジュリア集合の画像作成プログラム ジュリア集合の画像作成プログラムのソース

マンデルブロ集合の画像作成プログラムに関して

Flex4基本-時間のかかる計算処理 でマンデルブロ集合の画像作成プログラムを作ったとき、マンデルブロ集合についてインターネットで調べていると きれいな画像があったので、すこしプログラムを改良してきれいな画像が出来るようにしました。
作成した画像は マンデルブロ集合のギャラリーにあります。

Ver2出の変更点
 ・グラデーションのカラーを256階調から32階調(変更可能)にしました。
  少なくしたほうが画像がハッキリするようです。
 ・表示位置の選択方法の変更、シングルクリック・ダブルクリックで操作性の向上?
 ・現在の表示位置の数値表示、表示位置の数値指定を可能にしました。
  気に入った場所を記録を残せます。
  MandelbrotSSスライドショーのarrItiData変数用のデータも作成出来ます。

マンデルブロ集合の画像作成プログラムの使用方法

マンデルブロ集合の画像作成 1)最大繰返数:多分いじらなくてよい値
 一応変更出来るようにしておきました。
2)カラー指定
 16色を繰り返す
 グラデーション:V2より色数指定可能に
3)範囲指定:画像作成する位置を指定
 黒と色のついている境界を指定して下さい
 シングルクリックで中心を移動します。
 ダブルクリックで拡大します。
 初期化・縮小用はボタンで行えます。
4)現在の3)範囲指定の状態で、8)描画領域に描画
5)サイズ:8)描画領域のサイズの指定
 最大3000x3000まで指定可能
6)保存:8)描画領域のイメージを保存
 PNG、JPG形式でローカルPCに保存します。
7)現在の3)範囲指定の中心とサイズを数値表示
 数値入力による3)範囲指定
 スライドショー用の位置データも出力できます。

マンデルブロ集合の画像作成プログラムの作者お勧めの使い方

マンデルブロ集合のギャラリー を作成したときの操作について
・まず5)描画領域のサイズを「250x250」位に変更
・1)最大繰返数、2)カラー指定は初期値のまま
・3)範囲指定で倍率を10位にし、黒と色のついている境界をダブルクリック
  それなりの絵が出るまでダブルクリックと縮小を繰り替えす。
・4)「本領域に描画」ボタンで8)描画領域に描画
・作成画像が気に入ったら5)描画領域のサイズを「3000x3000」に変更
・4)「本領域に描画」ボタンで8)描画領域に再描画
・6)保存:8)描画領域のイメージを保存

ジュリア集合画像作成プログラムの使用方法

ジュリア集合の画像作成 基本的にはマンデルブロ集合と同じです。
A)パラメータのa,bが増えています
 絶対値で計算は
 ・マンデルブロ集合にBurningShipと言う
  派生した考えがあります。
  これと同じように計算の途中で絶対値を
  取ったら面白い画像ができたので変更可能に
  しました。
 標準のジュリア集合はOFF、OFFです。
 個人的にはOFF,ON(初期値)が好みです
B)パラメータのa,bが増えたので項目が増えています。







一応プログラムの説明(私的メモ?)

マンデルブロ集合を作成する中心部分
位置a,b(これが虚数の実数部と虚数部?)でのカラーの決定する関数
//マンデルブロ集合の1点でのカラー
private function fncGetColor(a:Number, b:Number):uint {
    var uiCol:uint = uintHassan;    //発散しないときのカラー
    var x:Number=0;
    var y:Number=0;
    var i:int = 0;
    for(i=0;i<=intKurikaesi;i++){   //最大繰り返し数繰り返し
        var x2:Number=x*x;
        var y2:Number=y*y;
        var zx:Number=x2-y2-a;
        var zy:Number=2*x*y-b;
        x=zx;
        y=zy;
        if (x2 + y2 >= 4) {
            var id:int = i % arrColor.length;
            uiCol= arrColor[id];
            break;
        }
    }
    return uiCol;
}

ジュリア集合の1点でのカラーを求める部分
引数のa,bはA)パラメータのa,bではなく位置x,yです。
A)パラメータのa,bはnumA,numBです。
 (わかりにくいがマンデルブロ集合から変更のためこうなっています)
bolAAbs、bolBAbsがA)パラメータの絶対値で計算です。
//ジュリア集合の1点でのカラー
private function fncGetColor(a:Number, b:Number):uint {
    var uiCol:uint = uintHassan;    //発散しないときのカラー
    var x:Number=a;
    var y:Number=b;
    var i:int = 0;
    for(i=0;i<=intKurikaesi;i++){   //最大繰り返し数繰り返し
        var x2:Number=x*x;
        var y2:Number=y*y;
        var zx:Number = x2 - y2 + numA;
        var zy:Number = 2 * x * y +numB;
        x=zx;
        y=zy;
        if(bolAAbs==true) {x=Math.abs(zx);}
        if(bolBAbs==true) {y=Math.abs(zy);}
        if (x2 + y2 >= 4) {
            var id:int = i % arrColor.length;
            uiCol= arrColor[id];
            break;
        }
    }
    return uiCol;
}

範囲指定のシングルクリック・ダブルクリックの処理
 クリックした時の0.3秒後に実際の処理(fncHniClick)を行います。
 0.3秒以内にダブルクリックされていたら(bolDDclic = true;)
 実際の処理に拡大処理を追加します。
private function onHniClick():void {
    bolDDclic = false;
    setTimeout(fncHniClick, 300);
}
private function onHniDoClick():void {
    bolDDclic = true;
}
private function fncHniClick():void {
    var x0:Number = numDD*((uiHni1.mouseX-100)/100);
    var y0:Number = numDD*((uiHni1.mouseY-100)/100);
    numX0 += x0;
    numY0 += y0;

    if(bolDDclic == true) {numDD = numDD/sdScale.value;}
    fncDispHani();
}

上の関数のカラー配列「arrColor」にグラデーションのカラーをセットしている関数
指定した2色をRGB値で分解して「カラー数」分の途中のカラーをセットしている。
カラー1→カラー2→カラー1で配列にセット。
//グラデーションカラー取得
private function fncSerColor():void {
    arrColor = new Array();
    //最大繰返数
    intKurikaesi=nsKuri.value;
    uintHassan = cpHassan.selectedColor;
    //カラーのセット
    if(rbColor16.selected==true) {
        arrColor = new Array(
            cp0.selectedColor, cp1.selectedColor, 
            cp2.selectedColor, cp3.selectedColor,
            cp4.selectedColor, cp5.selectedColor,
             cp6.selectedColor, cp7.selectedColor,
            cp8.selectedColor, cp9.selectedColor,
             cp10.selectedColor, cp11.selectedColor,
            cp12.selectedColor, cp13.selectedColor,
             cp14.selectedColor, cp15.selectedColor);
    } else {
        var icol0:uint = cpG0.selectedColor;
        var ir0:uint = icol0 / (256 * 256); //カラーをRGBに分解
        var ig0:uint = (icol0 / (256))-ir0*256;
        var ib0:uint = icol0 % 256;
        var icol1:uint = cpG1.selectedColor;
        var ir1:uint = icol1 / (256 * 256); //カラーをRGBに分解
        var ig1:uint = (icol1 / (256))-ir1*256;
        var ib1:uint = icol1 % 256;
        var icoln:int = nsColN.value;   //intKurikaesi;
        var i:int;
        var ir:uint;
        var ig:uint;
        var ib:uint;
        for(i = 0; i < icoln; i++) {    //グラデーションカラー作成
            ir = ir0 + (ir1 - ir0) * i / icoln;
            ig = ig0 + (ig1 - ig0) * i / icoln;
            ib = ib0 + (ib1 - ib0) * i / icoln;
            arrColor.push(ir * 256 * 256 + ig * 256 + ib);
        }
        for(i = 1; i < icoln-1; i++) {  //グラデーションカラー作成
            ir = ir0 + (ir1 - ir0) * (icoln-i) / icoln;
            ig = ig0 + (ig1 - ig0) * (icoln-i) / icoln;
            ib = ib0 + (ib1 - ib0) * (icoln-i) / icoln;
            arrColor.push(ir * 256 * 256 + ig * 256 + ib);
        }
    }
}

範囲指定で範囲の赤いBOXが領域をはみ出したら表示しないようにマスクをかけている部分
    //範囲指定の領域指定用
    spHani1 = new Sprite();
    uiHni1.addChild(spHani1);
    //範囲指定表示がはみ出さないようにマスクをかける
    maskForSp1= new Sprite();
    maskForSp1.graphics.lineStyle(0, 0, 0);
    maskForSp1.graphics.beginFill(0xFF);
    maskForSp1.graphics.drawRect(0,0,200,200);
    maskForSp1.graphics.endFill();
    uiHni1.addChild(maskForSp1);
    spHani1.mask = maskForSp1;

Flex4基本-時間のかかる計算処理
Flex4基本-ローカルファイル(イメージ)
このあたりも参考にして下さい。

プログラミング工房