<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />以下の JSL は、虹色の背景とマンデルブロ形状のマスクという 2 つのビットマップを作成します。2 つのビットマップがグラフに追加され、虹がマスクの下で移動します。ビットマップは一度だけ作成され、OS はマスクの透明な穴をサポートするため、非常に高速です。
マスクの透明な穴は、赤、緑、青のレイヤーと同様のアルファ レイヤーで作成されます。アルファは、以前に描画されたピクセルの上にレンダリングされたときのピクセルの透明度/不透明度を決定する 0 から 1 までの数値です。この例では、アルファは 0 (透明) または 1 (不透明) です。ビットマップと中間値をブレンドできます。
この JSL のインライン バージョンは、ビデオのビットマップを作成するために調整されました。添付ファイルは、タイマーを使用して次に表示するフレームを決定するため、実行すると多少改善される可能性があります。
クレイジ・ヘイルズ - YouTube
https://www.youtube.com/watch?v=NA-O0YbehpQ
// この例は、穴のある画像を作成する 1 つの方法を示しています。
// ほとんどの画像は、赤、緑、青だけを使用します (背景の虹のように)
// 以下の画像)。一部の画像では、説明する 4 番目のチャネルとしてアルファが追加されます。
// 不透明か透明か。JMP は不透明を表す 1 を使用します。
//
スケール = 35; // 全体のサイズ
nr = 20 * スケール; // アスペクト比
nc = 25 * スケール; // アスペクト比
// ピクセルは最初に行列に組み込まれ、J 関数で割り当てられます
transp = J( nr, nc, 0 );
// マンデルブロ関数を使用してピクセルを設定します。並列割り当てを使用する
// 速度を上げるため、ネストされたループではなく。
並列割り当て(
{nr = N 行( transp )、nr2 = N 行( transp ) / 2、
nc = N Cols( transp )、nc3 = N Cols( transp ) / 1.3333、limit = 1000}、
transp[r, c] = Mandelbrot( limit, 4, // 1..limit からの整数の答えを返します
2 * (c - nc3) / Sqrt( nr * nc ), // 行列の行、列を対象となる空間にスケールします
2 * (r - nr2) / Sqrt( nr * nc ) ) / limit // リミットスケール 0..1 で除算
);
// 次の行が重要です。この画像は 4 チャンネルのデータで作成されています。
// 赤、緑、青、アルファ。同じ「transp」値がr、g、bに使用されるため、
// 画像はグレースケールですが、Mandelbrot() からのデータのため、あまり見えません
// マスク内のグレー...黒のみ。2 番目のトランスプを 1-トランスプに変更すると、次のようになります。
// 緑色のマスク。しかし、重要なパラメータは、アルファを作成する transp<.5 です。
// チャンネル。transp は 0 から 1 までの値の長方形行列です。高い値
// はマンデルブロ集合の内側の平らな領域であり、低い値は外側です。トランスップ<.5
// 外側は true、つまり 1、内側は false、つまり 0 です。これにより、長方形の配列が作成されます
// 0 または 1 のアルファ: 1 はマスク、0 は透明です。(アルファは小数にすることもできます)
// これによりビットマップがブレンドされます。ここではそれを使用しません。)
transpImage = 新しい画像( "rgba", {transp, transp, transp, transp < .5} );
// この例では保存された画像を使用しませんが、次のように png を使用することもできます。
// つまり、保存したファイルを Gimp で開くと透明になります。
// テスト: transpimage << saveimage( "\\VBOXSVR\windowsShare\transparent\test.png", "png" );
// アニメーションを保持するウィンドウとビットマップを保持するグラフボックスを作成します。
// JMP で透明なビットマップを目立たせるための最善の方法は、グラフを作成することです
// ビットマップを持つ他のディスプレイボックスは実際には互いに重なりたくないからです。
新しいウィンドウ( "透明度",
gb = Graph Box( Framesize( nc + 20, nr + 20 ), // 周囲に 10 ピクセルの虹の境界線
<
// 最初の画像をフレームに挿入し、画像セグメントへのハンドルを取得します
gb[framebox( 1 )] << addimage( image( transpimage ) );
transpSeg = gb[framebox( 1 )] << childseg;
// 配置します。この「マスク」はここに一度だけ配置されます
transpSeg << move( 50, 50 );
//
//
// 透明度なしで 2 番目の虹画像を作成します
背景 = J( nr * 2, nc * 2, 0 ); // スクロール用に追加。虹のピクセルをいくつか作ってください...
並列割り当て(
{nr = N 行(背景)、nc = N 列(背景)}、
背景[r, c] = RGB カラー( (Sin( r / 70 ) + 1) / 2, (Sin( c / 50 ) + 1) / 2, Sin( (r + c) / 60 ) )
);
// ピクセルをビットマップ画像に変換し、フレームに追加し、ハンドルを取得します
背景画像 = 新しい画像(背景);
gb[framebox( 1 )] << addimage( image( 背景画像 ) );
背景セグメント = gb[フレームボックス( 1 )] << 子セグメント;
//
wait(.1);// ループが始まる前にウィンドウが開くようにする
//
開始 = 0; // 時間をかけてよりスムーズなアニメーションを作成します
フレーム=0;
while( start < 30, // 30 秒間実行します
位置 = 開始; // sin と cos のラジアン arg として使用されます...
開始 = 開始 + 1/30;
x = 50 + 50 * Sin(位置 * .39 ); // を使用した任意のスケーリング
y = 50 + 50 * Cos(位置 * .27 ); // 芸術的ライセンス
// OK、これは不格好です。 moveメソッドの評価に助けが必要なようです...
// EvalExpr は引数を調べ、評価する Expr を検索します。
// EvalExpr はまだ評価する必要がある式を返します
Eval( Eval Expr(backgroundseg << move( Expr( x ), Expr( y ) ) ) );
// gb<<無効;待機(0);アニメーションが待機状態で不規則になる(インタラクションが可能になる)
gb << 更新ウィンドウ; // これは非常にスムーズなアニメーションですが、インタラクティブではありません
//画像の作成: gb << savepicture("\\VBOXSVR\windowsShare\transparent\v\v"||right(char(frame++,9),9,"0")||".png", "png" );
);
//
// さらなるアイデア (テストされていません。何が起こるかお知らせください):
// グラフボックスの xscale と yscale をフレーム サイズに一致するように設定します
// 正確なピクセルで作業したい場合。
// 画像をブレンドするために 0.5 程度のアルファ値を試してください。
// グラフ内の他のセグメントがマスク セグメントの前に描画されるように配置します。
// マーカー セグメントはマスクの穴を通して現れる可能性があります。映画用双眼鏡。
// データの代わりにマスクを移動します。
// 透明度のある複数のレイヤー。視差を利用した横スクロールゲーム。
// MouseTrap を使用してマスクをドラッグします。
// クリックの距離に応じて、おそらく MouseTrap を使用してマスクを回転してみてください
// はマスクの中心からです。