[PR]今日のニュースは
「Infoseek モバイル」
条件判定と座標軸
画像を変形させるためには、座標系を少し見ていく必要が出てきます。少し“関数”も出てくるので難しくなるかもしれません。まずは条件判定の方法から書いていきます。最初は画像も出てこなくて退屈かも知れませんが、条件判定をプログラムに組み込むことで、座標の確認が出来、便利になるからです。
数学などでも式を書くとき、以下のように条件をつけることがあります。
y=2x (x>0の場合)
y=-x (その他の場合)
こんな感じです。ちなみにこれはVの字型のグラフが出来ます。これを以下のように定義しておきます。
y=2x【式1】 (x>0の場合【条件1】)
y=-x【式2】 (その他の場合【条件2】)
つまり、【条件1】のときに【式1】が実行され、【条件2】のときに【式2】が実行されることになります。
プログラムで書くと以下のようになります(ちなみに、このままではまだ画像の変形にはなりません)。
if(x>0){
y=2*x;
} else {
y=-x;
}
書き方としては、
if(x>0【条件1】){
y=2*x;【式1】
} else {
y=-x;【式2】
}
という順序になります。【条件2】は“その他の場合”固定です。(if は英語で“もし…なら”という意味で、else は“そうでないなら”という意味です)
もっと簡単に書くと、以下のようにも出来ます。
y=-x;
if(x>0){
y=2*x;
}
この例では、x>0 の場合は y=-x と y=2*x の両方が実行されるので、最後に実行された結果がyの値になります。だから結果的には前のプログラムと同じです。
【条件】に使うことの出来る式には以下のようなものがあります。
|
a<b | 意味:a が b より小さい |
|
|
a>=b | 意味:a が b と同じか大きい |
|
|
a==b | 意味:a が b が完全に等しい(注:a=b はaにbの値を代入する。条件ではない) |
|
|
a!=b | 意味:a と b が等しくない |
|
|
a>b && c+1>d | 意味:a>b かつ c+1 が d より大きい |
|
|
a>b || c>d | 意味:a>b あるいは c>d |
|
|
(a<=b || c>d) && e==f | 意味:(a<=b あるいは c>d)であってeとfは等しい |
|
括弧をつければどれだけでも複雑な条件をつけれます。
では、以下のプログラムを実行してみます。XかYが0なら、そのカラーを白にするというプログラムです。それ以外の条件のときは何もしません。
---Initialize---
coord=0;
---Transform---
if(x==0 || y==0){
R=G=B=255;
}

結果はもちろん、座標軸が白で描画されます。原点はこの結果から画像の中心にあることが分かります。(注:画像のサイズが奇数の場合はラインが描画されません。これはcx,cyを計算するときの画像のサイズ/2が整数になっていないためです。つまり、座標軸がきりのいいピクセルにならないということです。そのため0と比較しても一致しません)
今度はcxとcyを0にしてみます。原点は左上になると以前説明しましたが、これで結果が確かめられます。画像の縁が軸になるので、分かりやすいように色を赤色に変更します。
---Initialize---
coord=0;
cx=cy=0;
---Transform---
if(x==0 || y==0){
R=255;
G=B=0;
}

ちょっと分かりにくいのですが、画像の左と上に赤いラインが引かれています。
では、座標軸を移動できるようにします。入力できるようにする方法は前回説明しました。プログラムは以下のようになります。
---Initialize---
coord=0;
?ax,X axis,-100,100,0;
?ay,Y axis,-100,100,0;
cx=int((ax+100)/200*xs);
cy=int((ay+100)/200*ys);
---Transform---
if(x==0 || y==0){
R=G=B=255;
}
ax と ay を入力できるようにしています。範囲は-100から100までで、中心が0になるようにします。 cx が -100のときに左端、100のときに右端になるようにしたいので、計算式は
cx=(ax+100)/200*xs となっています。
axが -100のときにcx=0、axが 100のときにcx=xs(画像のサイズ)になります。
それから、この式ではcxは実数になってしまうので、きりのいい数にするために、小数点以下を切り捨てます。これが int()関数です。例えば int(23.4)は23になります。

このようにすれば、処理を行うときの画像の原点を変更することが出来るので、処理のかかる位置を変更できることになります。
初期状態では(cx,cy)は画像の中心にあり、またそれは画像のサイズの半分であることを考えれば、以下の計算式でも結果は同じになります。
---Initialize---
coord=0;
?ax,X axis,-100,100,0;
?ay,Y axis,-100,100,0;
cx=int(cx+cx*ax/100);
cy=int(cy+cy*ay/100);
分かりますか? ax が 0 なら、cx はそのままで、画像の中心、ax が -100 なら、cx は 0、ax が 100 なら、cx は cx+cx(つまりxsで画像のサイズ)になります。こうしておけば、選択できる範囲を変えても計算式を変えずに済みます。
---Initialize---
coord=0;
?ax,X axis,-500,500,0;
?ay,Y axis,-500,500,0;
cx=int(cx+cx*ax/100);
cy=int(cy+cy*ay/100);
という風にも出来ます。この例では座標軸は画面の外にも動いてしまいます…。
実はこの式は多くの強化計画の中の関数で使われています。花形変換、放射状ノイズ、渦巻き、水面模様などなど、処理のかかる位置を変えることの出来るほとんどの関数で使用している方法です。確かめてみてください。
渦巻きのプログラムをそのまま載せておきます。
---Initialize---
coord=1;
?val,Value,-300,300,50;
?sc,Scale,50,200,120;
?sx,Center Xpos(%),-200,200,0;
?sy,Center Ypos(%),-200,200,0;
rs=sqrt(cx*cx+cy*cy);
cx=cx+cx*sx/100; cy=cy+cy*sy/100;
val=val/10;
sc=sc/100;
---Transform---
a=(rs-r)/rs;
t=t+val*a*a;
r=r/sc;
入力された変数 sx,sy を使って cx,cy を計算しているのが分かりますか?
今回はプログラムと説明が多くなってしまいました。
戻る