フラクタルエンジンライブラリ TFEngine フラクタルジェネレータ T-Fract
■ メインページ ■ サブボード修正
3Dフラクタル描画ソフト「T-Fract3D」のソースをアップしておきます。 私の最近の3Dフラクタル作品は、これによるものです。 毎度の事ながら、マニュアル、ソース解説等はありません。 ^^; 触れば何となく使い方は分かるでしょう。 ソースは、C++Builder 6用です。そのままコンパイルできると思います。 3Dフラクタルは、レイトレーシングの技法を知らないと作れないです。 というか、レイトレーシングソフトのPOV-Rayなどには、3Dフラクタルを 描画する機能が初めからあるようです。 ただ、3Dフラクタルの中には、私の未知のものもあります。 擬フックス フラクタル。こんなのも描いてみたいものです。 http://www.fractal3d.com/japanese/japanese.shtml tos. [ http://www.tnet.to/filer/124/TFract3D.lzh 401.53KBytes (411167Bytes) ]
from コンピュータ MainStream #499: リハビリ中 形になったのでアップしておきます。 計算器です。スクリーンショットを添付したので、見てみてください。 何をやるものか、誤解なく理解できると思います。(笑) 操作は説明を書くと長くなるので省略しますが、数値を入力するところ 以外はマウスで行います。 なんでこういうものを作ったかと言えば、もともと、T-Fract にこの ような画面を使いたかったのです。それは、フラクタルを描画する エフェクトのアルゴリズムを記述するために、ノードとパスを組み 合わせて表現したかったのです。分かりやすいでしょ? でも、これだけのものを作るのは、ちょっと前は無理でした。これを 作っていて、C++のクラスの作り方はこうすればいいのか、とちょっと 分かったような気がしました。 実行ファイルと、コメントのないソースも添付ファイルします。 tos. [ http://www.tnet.to/filer/121/cal.jpg 9.31KBytes (9536Bytes) ] [ http://www.tnet.to/filer/121/cal.lzh 285.63KBytes (292492Bytes) ]
中間結果というか、断念結果というか、再出発に向けてというか。 つまり、完成していませんが、できているものをアップしてみます。 私が最近作成しているフラクタル作品は、これによるものです。 マニュアルもないので実行ファイルがあっても使える人はいないでしょう。 ソースが入っていますがコメントが入っていないので解析できないでしょう。 でも、もし参考にしたければご利用ください。 次こそは正式公開のフリーソフトにしたいです。 ^^; tos. [ http://www.tnet.to/filer/119/TFEngine.lzh 478.77KBytes (490267Bytes) ]
TFEngine はマルチプロセッサマシンにも対応するように、マルチスレッドで 並列演算するように作ってあります。ところが、最近原因不明の動作不良に 頭を悩ませていました。 どういう訳か、演算が途中で止まって画像の半分くらいしか描かないところで 終わってしまいます。処理関数の最後でブレークポイントを仕掛けても、 そこで止まらずに実行全体が終了してしまうのです。まさに、神隠しです。 いろいろ悩んだ末、演算中に0割り算による例外発生でスレッドが死んでいる と言う予測が立ち、それを修正することで見事に直りました。 普通、0割り算を行うと、実行中にダイアログボックスが現れて警告して くれるのですが、プログラム中で TThreadクラスのスレッドを生成すると、 そのスレッドは例外を受け取って処理してくれないみたいです。 マルチスレッドプログラミング、いろいろと面倒なことが多いです。 tos.
> New FFFの完成に没頭している間にこんな場所が出来ていたのですね。感激。 会員さんなら、誰でも新しいサブボードを開くことができます。 私は、開発奮闘記でも書いてみようと思いました。 > TFEngineのソースコード、ダウンロードしました。参考に挿せていただきます。 まだまだ作りかけのものですが、よろしければどうぞ。 > 私は現在、オーヴァーフローその他のエラーに苦悩中です。 > そもそもフォミュラやトラップやパラメーターの異常な組み合わせを許容している > のだから、ある程度はしかたないかと、あきらめ気味。 私は複雑な演算を行っていないので、対策はまだやってはいませんが、 簡単にできると思います。 複雑になっても、やることは同じだと思いますので、どれだけ頑張れるか でしょう。 ^^; もしデバッグを効率よく行うなら、例外が起きたときにパラメータなどを 出力するようにすると再現も楽で直しやすいと思います。 // 言うのは簡単ですが、やるのは面倒そうですね。 ^^; tos.
今晩は やまいもです。 New FFFの完成に没頭している間にこんな場所が出来ていたのですね。感激。 TFEngineのソースコード、ダウンロードしました。参考に挿せていただきます。 私は現在、オーヴァーフローその他のエラーに苦悩中です。 そもそもフォミュラやトラップやパラメーターの異常な組み合わせを許容している のだから、ある程度はしかたないかと、あきらめ気味。 パソコンが固まるのだけ避けられればいいか、の心境です。 ではまた。
> でも、普通はこんな事気にしないで使ってしまうと思います。 > なかなか際どい仕様です。(笑) うーん、なんでこういう仕様にしたのか理由が分からないですね。 みんながみんな引っかかりそう。 GOO E-Mail: goo_n@hotmail.com
> 代入演算子に対して setter が関連づけられていたりするんでしょうかね? > それで += などの演算子には定義されていないとか。 > ML とか 2ch とかで一度聞いてみては? C++Builder のヘルプに書かれていました。 →Borland C++Builder言語ガイド「代入演算子とプロパティの使い方」 ケース 1 Edit1->Text = Edit1->Text + "foo"; ケース 2 Edit1->Text += "foo"; a = a + b 形式のケース 1 は,次のようなコードを生成します。 SetText(GetText() + "foo"); このコードは適切であり,期待どおりの結果を生成します。 a+=b 形式のケース 2 は,次のようなコードを生成します。 temp = GetText(); temp += "foo"; でも、普通はこんな事気にしないで使ってしまうと思います。 なかなか際どい仕様です。(笑) tos.
ケース 1 Edit1->Text = Edit1->Text + "foo"; ケース 2 Edit1->Text += "foo"; a = a + b 形式のケース 1 は,次のようなコードを生成します。 SetText(GetText() + "foo"); このコードは適切であり,期待どおりの結果を生成します。 a+=b 形式のケース 2 は,次のようなコードを生成します。 temp = GetText(); temp += "foo";
> これは、C++Builder の仕様なんでしょうか。バグなんでしょうか。ちょっと > アヤシい雰囲気があります。 怪しいですねぇ。 代入演算子に対して setter が関連づけられていたりするんでしょうかね? それで += などの演算子には定義されていないとか。 ML とか 2ch とかで一度聞いてみては? GOO E-Mail: goo_n@hotmail.com
C++Builder には他のコンパイラにはないユニークな言語仕様があります。 property もその一つです。 普通、private な変数をアクセスするには、setter, getter 関数を public で用意しないといけませんが、そうすると単に値を設定、取得 するために Parameter->setWidth(640); w = Parameter->getWidth(); なんて面倒な事をしないといけませんよね。これが、C++Builder だと Parameter->Width = 640 w = Parameter->Width; と書くだけで、setter, getter の関数を呼んでくれるという、優れものな 機能です。 ここで、setter や getter 関数を用意しないと、デフォルトでは関数を 呼ぶ代わりに private な変数へも値を代入参照するようになります。 ここで、大きな落とし穴がありました。 setter には関数を用意して、getter は定義せず値を参照するのみとした 場合に、 Parameter->Width += 10; などとすると、どうやら setter が呼ばれない模様なのです。どうやって いるかというと、おそらく 参照した変数に対して直接 10を足し込んで いる模様です。 私はちゃんと setter を通して値を代入してくれるものと期待していたので、 この動作にかなり悩みました。 ^^; 結局、 Parameter->Width = Parameter->Width + 10; とすることで、問題は解決するのですが、何となく間抜けです。 そして、知らない人が += と書き換えた瞬間に、おそらく永久に判明する ことのないバグに悩まされるのではないかと思いました。 これは、C++Builder の仕様なんでしょうか。バグなんでしょうか。ちょっと アヤシい雰囲気があります。 tos.
>> でも、よく見ていると、関数の戻り値の型が bool になっていました。 >> 勝手に(自動的に)int型を true/false に変換してくれているのですね。 > それはどちらかというと結構ありがたい自動キャストのような気もしますが。 > perl みたいに何でもかんでも自動キャストってのになれてるせいかな(^^; Cだと、bool型なんてなくて、単に int型だと思ったのですが、C++だと bool型なんてあったんでしょうか。 まずそれが信じられませんでした。 Cでも、数値なら自動キャストはありますよね。double型からint型へとか。 > ついでにお節介ですが(笑)、warning はウォーニングと発音するのでご注意を。 初めて知りましたが、日本語として "ウォーニング" と書かれた例を 見たことはありません。 > ちょっときちんとした発音に自信がなかったので goo で確認してみました。 これはまたおもしろい辞書ですね。 意味もなく、いろんな単語を 調べてしまったりして。(笑) tos.
> でも、よく見ていると、関数の戻り値の型が bool になっていました。 > 勝手に(自動的に)int型を true/false に変換してくれているのですね。 それはどちらかというと結構ありがたい自動キャストのような気もしますが。 perl みたいに何でもかんでも自動キャストってのになれてるせいかな(^^; > うれしいような、お節介のような。どうせなら、ワーニングを出して > 欲しいところです。 ついでにお節介ですが(笑)、warning はウォーニングと発音するのでご注意を。 work と walk とかと同じたぐいですね。 と言って思いましたが morning をマーニングとは言いませんね(笑) ちょっときちんとした発音に自信がなかったので goo で確認してみました。 GOO E-Mail: goo_n@hotmail.com
バグを発見し、デバッガで追っていると、信じられない現象に遭遇しました。 関数内では2を返しているのに、その関数の呼び出し元では、1が返って くるのでした。 bool Update (void) { int Modify; .... Modify = 2; .... return (Modify); } .... modify = Update(); でも、よく見ていると、関数の戻り値の型が bool になっていました。 勝手に(自動的に)int型を true/false に変換してくれているのですね。 うれしいような、お節介のような。どうせなら、ワーニングを出して 欲しいところです。 tos.
フラクタル画像はフォームに貼り付けたTImageに描画しています。それを 画像ファイルとして保存する処理を付けたところで問題が発生しました。 保存した画像ファイルが不正なファイルとされてしまうのです。 画像を保存するには、VCLリファレンスに以下のように書かれています。 Image1->Picture->SaveToFile(filename); ところが、これで保存した画像ファイル(BMP)を susie や PhotoshopLE で開こうとすると、不正なファイルだとしてはねつけられてしまいます。 一方、IE やペイントブラシだと読み込めて表示もできます。 昔は確かにこの方法で保存できたはずです。 調査した結果、どうも 32bit形式で BMPファイルが作成されている ようです。もちろん、32bit形式の BMPフォーマットなどありません。 TImage は、実行時の画面モードを検出しているようで、今のビデオカード だと True Color(32bit) が TImage に反映されているようです。 昔使っていたビデオカードでは、Full Color(24bit)だったので、 そのまま画像を保存しても 24bit形式の BMPファイルが作成でき、 偶然うまく行っていたみたいです。 と言うわけで、以下のように TBitmap にコピーした後にフォーマットを、 24bitにし、それを保存することで解決することができました。 Graphics::TBitmap *bitmap = new Graphics::TBitmap; bitmap->Assign(Image1->Picture); bitmap->PixelFormat = pf24bit; bitmap->SaveToFile (SavePictureDialog1->FileName); delete bitmap; 本来、このようにしないと任意の形式で BMPファイルを保存できない わけですね。 実行環境非依存なアプリケーションを作るには、気を付け ないといけないです。 // しかし、IE や ペイントブラシは、非公開のフォーマットまで // サポートしているとは...。 tos.
「もう一人の自分を探すために」というとキザでしょうか?(笑) 世界中、どこを探しても自分の満足いくフラクタル描画ツールがないので、 自分で作るしかないのでした。誰のためでもなく自分自身のために。 制作途中の フラクタルエンジンライブラリを添付しておきます。 何かの参考になれば。(for C++Builder Only) // バックアップも兼ねている。 ^^; tos. [ http://www.tnet.to/filer/50/TFEngine.h 55.04KBytes (56366Bytes) ] [ http://www.tnet.to/filer/50/TFLib.h 3.47KBytes (3560Bytes) ] [ http://www.tnet.to/filer/50/TFEngine.cpp 4.76KBytes (4876Bytes) ]