Now loading...

4 月 01

定義を誤解しやすい

Adobe - ActionScript 3.0 コンポーネントリファレンスガイドの説明によると、フィルター処理に使われる式は以下のとおり。


dstPixel[x, y] = srcPixel[x + ((componentX(x, y) - 128) * scaleX) / 256,
y + ((componentY(x, y) - 128) * scaleY) / 256)]

ごちゃごちゃしている部分をdx, dy(dx, dyの中身については後ほど説明するとしてここでは何らかの変位量と思ってもらえればok)に書き換えて見やすくするとこんな感じ。


dstPixel[x, y] = srcPixel[x + dx, y + dy]

ここでdstPixelとsrcPixelを一般的な形で説明すると

  • dstPixel[x, y]はx-y座標(x, y)におけるフィルター処理後の表示画像のピクセル値
  • srcPixel[x, y]はx-y座標(x, y)におけるフィルター処理前の表示画像のピクセル値

したがって上式を翻訳すると「位置(x, y)におけるフィルター処理後の画像のピクセル値は、位置(x+dx, y+dy)におけるフィルター処理前の画像のピクセル値を採用している」となる。座標系がフィルター処理後の画像を元にしているところがポイント。「位置(x, y)におけるフィルター処理前の画像のピクセルを(x+dx, y+dy)に移動させてその結果を処理後の画像として採用する」演算ではない。まとめておくとDisplacementMapFilterは

  • (正) 位置(x, y)におけるフィルター処理後の画像のピクセル値に、位置(x+dx, y+dy)におけるフィルター処理前の画像のピクセル値を採用するフィルター
  • (誤) 位置(x, y)におけるフィルター処理前の画像のピクセルを(x+dx, y+dy)に移動させてその結果を処理後の画像として採用するフィルター

となる。ここの仕組みが直感的ではないのでわかりにくい。他にも元画像の位置(x+dx, y+dy)にピクセル情報がないことにはフィルター処理不可能なことがわかる。つまり、元画像のサイズ以上に引き延ばしたりする変形を表現することはできない。

変位(dx, dy)の求め方

フィルター処理前・後のピクセルの変位量の分布さえわかれば意図したフィルター効果を表現できる。具体的な関係式の求め方はpsyark.jp - DMFチュートリアル1がわかりやすい。

置き換えマップイメージ

さて画像は2Dなので各ピクセルごとにx, y方向の2成分の変位量(dx, dy)がわからないといけない。各ピクセルごとの変位情報を(手軽に)2成分もたせるためにはどうすればよいか。そこで登場するのが置き換えマップイメージ。各ピクセルにアルファ、R、G、Bの情報を独立して持たせることができるという画像の性質を利用して、(dx, dy)の変位分布を画像情報として押し込めてしまうわけ。独立して格納したい情報は(dx, dy)の2成分なので、置き換えマップイメージのアルファ、R、G、Bチャンネルの4チャンネルのうちお好みの2チャンネルに格納すればよい(例えばdx情報をR、dy情報をBなど。dx, dyに同じチャンネルを使う場合も含めれば選択肢は4×4=16通りもある)。この中途半端に選択肢の自由度があるところがわかりにくい。([dx, dy]分布情報を格納できれば原理的には二次元配列などでもよいが、配列に格納するのが面倒くさいし、そもそもこのフィルターの演算に採用されていないので意味がない)

Adobeが定義している式に戻ってみると、(dx, dy)は次のような式であることがわかる。


dx = (componentX(x, y) - 128) * scaleX / 256
dy = (componentY(x, y) - 128) * scaleY / 256

ここでcomponentX(x, y)は位置(x,y)におけるマップイメージのdxを格納したチャンネル(つまりアルファ、R、G、Bのどれか)のピクセル値(0-255)、componentY(x, y)は位置(x,y)におけるマップイメージのdyを格納したチャンネルのピクセル値(0-255)が入る。scaleX, scaleYはフィルター使用時に後から好きな値が入れられる(0以上の数値)のでわかりやすくするため1を代入しよう。そうすると、上式は以下のようになる。


dx = (componentX(x, y) - 128) / 256
dy = (componentY(x, y) - 128) / 256

画像の各チャンネルは0-255の数値しかとれないので、この場合変位量は-1/2から1/2の値をとることがわかる。変位幅を大きくしたいならscaleXとscaleYをフィルター利用時に調整すればよい(これは例えば、-10から10までの乱数を得るのに(Math.random()-0.5)*20と書くのに似ているかな)。置き換えマップイメージと変位の関係はmiscellaneous [ActionScript 3.0] DisplacementMapFilterがわかりやすい。

Tags: ,

3 月 24

CircleParticle


CircleParticle(	x:Number, y:Number, radius:Number,
fixed:Boolean = false, mass:Number = 1,
elasticity:Number = 0.3, friction:Number = 0)

x:Number: 初期x座標
y:Number: 初期y座標
radius:Number: 円の半径。ゼロok。
fixed:Boolean: オプショナル。初期位置に固定するかどうか(true=固定、false=非固定)。デフォルトはfalse。
mass:Number: オプショナル。質量。デフォルトは1。
elasticity:Number: オプショナル。弾性率。デフォルトは0.3。
friction:Number: オプショナル。表面摩擦係数。デフォルトは0(減衰無し)。

Tags: ,

2 月 03

メモ。

シングル・ダブルクオーテーションに関する動作を示すオプションの第2の引数をとり、無指定でデフォルトはENT_COMPAT(ダブルクオーテーションを変換、シングルクオーテーションを無変換)。ENT_QUOTESでダブルおよびシングルクオーテーションをそれぞれ”、’に変換。


<?php
$text = htmlspecialchars($_POST['text'], ENT_QUOTES);
?>

[Reference]
htmlentities - PHPマニュアル
htmlspecialchars - PHPマニュアル

Tags: ,

1 月 22

ブログでレベルアップが時々画面真っ白になって何も表示されないことがあったんだけど、理由はこれかもしれない。一応.htaccessに書いてみたけど、どうなんだろ。確認しにくいな。

可能性として、運用されているPHPスクリプトと、サーバー側でのPHP高速化・キャッシュモジュールとの相性の問題が発生していることがあります。その場合は、下記コマンドを「.htaccess」に記載してください。


php_flag apc.cache_by_default off

(PHPでのエラー対策について - CORESERVER.JP:コアサーバーより)

それと、これはどういう意味だ?外部からうちのドメインのファイルはリモートで読めないようになってるってことなんかな。なるほどね。

標準で、include()/require()によるURLの取得ができなくなっております。おすすめいたしませんが、ご利用いただくには、下記コマンドを「.htaccess」に記載してください。


php_flag allow_url_fopen on
php_flag allow_url_include on

Tags: ,

12 月 17

FLASHのload関数で直接読み込めないファイル(異なるドメインのXMLファイル等)は、PHP等のサーバー側スクリプト言語を利用することでFLASHに読み込ませることができる。PHPを使う場合の手順は以下の通り(具体的なソース等はこちらを参照)。

  1. FLASHからPHPへ。SendAndLoad関数等を用いてPHPへ読み込みたいファイルのURLを送信する。
  2. PHP内部処理。PHPのreadfile関数等で指定されたファイルを読み込む。
  3. PHPからFLASHへ。読み込んだファイル内容(標準出力)をFLASHのSendAndLoad関数の返り値に送り返す。
  4. FLASH内部。SendAndLoad関数の返り値を受け取って続きの処理へ。

しかし、FLASHの日本語文字コードはShift-JISとUTF-8にしか対応していないので(FLASH ActionScript辞典より。ちなみにクソ本)、EUC-JPで記述されたブログ(FC2等)のXMLファイルをPHPでそのまま読み込んでFLASHに送り返すと文字化けしてしまう。そこでPHPで読み込んだファイル内容を文字コードを変換してからFLASHに送り返す必要がある。以下はPHPからFLASHへUTF-8にエンコーディングしてから送るためのPHP内部の処理。


<?php

//readfile関数の内容を標準出力せずに内部バッファに保存させる
ob_start();

//FLASHから送信されたURL先のファイル内容を読み込む(標準出力されない)
readfile($_POST['url_from_flash']);

//内部バッファに保存された内容を変数に格納する
$str = ob_get_contents();

//内部バッファの開放
ob_end_clean();

//上記で変数に格納された内容がEUC-JP, Shift-JIS, UTF-8の場合、UTF-8に再エンコーディング
echo mb_convert_encoding($str,'UTF-8', 'EUC-JP,Shift_JIS,UTF-8');

//UTF-8にエンコーディングされた内容を標準出力(出力内容がFLASHへ送信される)
echo $str;
?>

追記(2007/12/17): なんかコードがダメ出しされてる。ただ肝心な部分のフィードバックがないので何がダメなのかわからず終い。

追記(2007/12/19): 先方で詳細コメント・解説をもらえた。単独では知り得なかった現在の状況が把握できたので有益なTB。

Tags: , ,


Now loading...