AviSynthのぺーじ/演算子を使ったスクリプト 2

これは、かつて「にーやんのAviSynthのぺーじ」として公開されていたものを転載したものです。内容は古く、間違いも含まれている可能性があります。より正確で新しい情報を知りたい場合は、AviSynth 付属のヘルプや AviSynth 公式サイトを参考にすることをおすすめします。AviSynth WikiAviSynth入門なども活用してください。

前回のスクリプトの問題点

 前回作成した演算子を使ったスクリプトには、ある問題点がありました。それは何か。

height = (width*3)/4

 /4、÷4、4で割る・・・んっ!?

 widthが4で割り切れない場合は、どうなるんだ?

 ためしにやってみましょう。

operand3.png

 width = 250にしてみました。

 4で割ると62.5(62 余り2)です。割り切れません。

operand3_colorbar.png

 スクリプトを実行してみました。

 とりあえず、カラーバーが表示されています。エラーが出て終了、ということはありませんでした。

 では何も問題はなかったということなのでしょうか?

operand3_fileinfo.png

 VirtualDubModの[File Information...]で確認してみると、250x187になっています。

 187÷250 = 0.748  3÷4 = 0.75

 すいません。電卓使いました(笑)それはさておき・・・

 4:3じゃない!

 250*3/4 = 187.5ですから、どうやら187.5の小数点以下(0.5)が切り捨てられてしまったようです。

 ん〜まいったな。本当は前回で演算子の話は終わるはずだったのに面倒くs・・・

 ハッ( ̄□ ̄;)!!つい本音が(笑)

 そうだ、widthが4の倍数じゃないときには、無理矢理、4の倍数にしてしまえばいいのではないだろうか?

 「widthが4の倍数でないならwidthを4の倍数にしたものをwidthとし、もともと4の倍数ならwidthそのまま」

 こんな感じにできれば、width:heightを常に4:3に保てそうです。

 そこで登場するのが三項演算子です。

三項演算子

 「〜なときは…」「〜なら…」

 英語のif文みたいですね。C言語などにもif文があります。

 AviSynthでは三項演算子(? :)を使って、if文のようなことができます。

 三項演算子の使い方は、次のような感じです。

x = A ? B : C (Aならばx = B、さもなければx = C)

 「? :」はABCという3つのオペランドを取るので三項演算子と呼ばれます。

 三項演算子三項はオペランドの数を表しているんでしたね。ちなみにオペランドは、演算子で処理される式や変数などのことです。忘れてしまった人は前々回に戻って確認してください。

 三項演算子を使用するときは、「さもなければ(Aでなければ)C」という部分を忘れないようにしてください。

 「AならばB」だけではダメです。必ず例外が出たときにどうするかを決めておきましょう。

widthが4の倍数でないなら?

 では、さきほどの「widthが4の倍数でないならwidthを4の倍数にしたものをwidthとし、もともと4の倍数ならwidthそのまま」を三項演算子を使って表してみましょう。

 まず日本語のまま、先ほどの式にあてはめてみます。

width = widthが4の倍数でない ? widthを4の倍数にしたもの : widthそのまま

 まず「widthが4の倍数でない」を演算子などを使って表さなければなりません。

 4の倍数であるかないかをどうやって見分ければいいでしょうか?

 少し考え方を変えてみます。

 4の倍数は4で割り切れる数、4の倍数でない数は4で割り切れない(余りが出る)数と言い換えることができます。

 つまり、widthを4で割ったときの余りが0ならばwidthは4の倍数、widthを4で割ったときの余りが0でなければwidthは4の倍数ではないというわけです。

 あとは余りを求める計算方法があればいいということになります。

 余りを求めるための演算子は%です。

 %はint(整数)型とfloat(小数)型のオペランドに使える演算子です(前々回参照)。

 使い方は+や-などと同じで、x%yx÷yの余りを求めます。

 「〜ではない」を表す演算子は!=(または<>)なので、「widthを4で割ったときの余りが0ではない」(「widthは4の倍数ではない」)を演算子を使って表すと次のようになります。

width%4 != 0

widthを4の倍数にする?

 次に無理矢理「widthを4の倍数に」する部分を考えます。

 4の倍数ではない数字を4の倍数にするにはどうすればいいか?

 これには先程の余りを求める式を利用します。

 ある数を4で割って余りが出るとき、そのある数から余りを引いた数は4の倍数になります。

250 ÷ 4 = 62 ... 2 -> ( 250 - 2 ) ÷ 4 = 62

 このように250から余りの2を引いた数(248)は、4で割り切れます(4の倍数)。

 ですから、widthを4の倍数にするためには、widthからwidthを4で割ったときの余りを引けばいいのです。

 余りを求める演算子は%ですから、これをwidthを使って表すと次のようになります。

width - width%4

修正スクリプトの完成

 以上のことをふまえて、スクリプトを完成させましょう。

width = widthが4の倍数でない ? widthを4の倍数にしたもの : widthそのまま

 これを演算子を使って表すと次のようになります。

width = (width%4 != 0) ? width - width%4 : width

 「widthそのまま」は、そのまま「width」を持ってくればOKです。

operand7.png

 これで「widthが4の倍数でないならwidthを4の倍数にしたものをwidthとし、もともと4の倍数ならwidthそのまま」をwidthとして使用することができます。

x = A ? B : C (Aならばx = B、さもなければx = C)」の形ですね。

 あとは、これをスクリプト内に付け加えれば、修正スクリプトの完成です。

operand5.png
operand5_colorbar.png

 修正したスクリプトを実行してみました。

operand5_fileinfo.png

 [File Information...]を見ると、解像度は248x168になっています。

 248:186 = 4*62:3*62 = 4:3

 4:3になっていますね。

 演算子に関する説明は、これでいったん終わりにします。

 また自分で作る関数について解説するときにでも、あらためて具体例を挙げながら紹介したいと思います。

 さて、次回はreturn文についての補足を少ししてから、お待ちかねの(待ってない?)クイズの答え合わせと参りましょう。

最終更新日 2003年12月16日

最終更新日時: 2014-03-12 (水) 23:37:09 (3690d)