aclib #11 - mandel.c の紹介ページ

  • (by K, 2020.09.17)

(1) 基本情報

  • mandelは、Kがaclライブラリのテストのために用意したプログラムです。
  • もともとは、rynaさんが WikiPedia.ja:コルモゴロフ複雑性 のページを見つけて、この絵を何バイトで書けるか実験しようとやりだしたのがきっかけです。
  • その後、この絵が非常に美しかったこともあり、Kがグラフィックスのテストとして頻繁に利用するようになりました。
  • またオリジナルのバージョンは浮動小数点演算を使ったシンプルなものでしたが、浮動小数点演算ができない環境でも動かしたいと考えて、固定小数点で計算して描画するバージョンも作りました。
  • このmandelはその「整数演算のみ版」をベースにしています。

(2) 実行画面

  • http://k.osask.jp/files/pic20200917b.png

(3) ソースコード

#include <acl.c>

void aMain()
{
    AWindow *w = aOpenWin(512, 384, "mandel", 1);
    AInt16 x, y;
    for (y = 0; y < 384; y++) {
        for (x = 0; x < 512; x++) {
            AInt16 sn = 0, sx, sy, n;
            AInt32 c, cx, cy, zx, zy, xx, yy;
            for (sx = 0; sx < 4; sx++) {
                cx = (x * 4 + sx) * 56 + 4673536;
                for (sy = 0; sy < 4; sy++) {
                    cy = (y * 4 + sy) * (-56) - 124928;
                    zx = cx; zy = cy;
                    for (n = 1; n < 447; n++) {
                        AInt64 zzx = zx, zzy = zy;
                        xx = (zzx * zzx) >> 24;
                        yy = (zzy * zzy) >> 24;
                        if (xx + yy > 0x4000000) break;
                        zy = (zzy * zzx) >> 23;
                        zx = xx + cx - yy;
                        zy += cy;
                    }
                    sn += n;
                }
            }
            n = sn >> 4;
            c = aRgb8(n, 0, 0);
            if (n >= 256) {
                c = aRgb8(0, 0, 0);
                if (n < 447)
                    c = aRgb8(255, n - 255, 0);
            }
            aSetPix0(w, x, y, c);
        }
        aLeapFlushAll(w, 128);
    }
    aWait(-1);
}

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-24 (木) 16:51:29 (35d)