前回のスクリプトの問題点
前回作成した演算子を使ったスクリプトには、ある問題点がありました。それは何か。
|
/4、÷4、4で割る・・・んっ!?
widthが4で割り切れない場合は、どうなるんだ?
ためしにやってみましょう。
widthが4で割り切れない場合は、どうなるんだ?
ためしにやってみましょう。
width = 250にしてみました。 4で割ると62.5(62 余り2)です。割り切れません。 |
スクリプトを実行してみました。 とりあえず、カラーバーが表示されています。エラーが出て終了、ということはありませんでした。 では何も問題はなかったということなのでしょうか? |
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に保てそうです。
そこで登場するのが三項演算子です。
ん〜まいったな。本当は前回で演算子の話は終わるはずだったのに面倒くs・・・
ハッ( ̄□ ̄;)!!つい本音が(笑)
そうだ、widthが4の倍数じゃないときには、無理矢理、4の倍数にしてしまえばいいのではないだろうか?
「widthが4の倍数でないならwidthを4の倍数にしたものをwidthとし、もともと4の倍数ならwidthそのまま」
こんな感じにできれば、width:heightを常に4:3に保てそうです。
そこで登場するのが三項演算子です。
三項演算子
「〜なときは…」「〜なら…」
英語のif文みたいですね。C言語などにもif文があります。
AviSynthでは三項演算子(? :)を使って、if文のようなことができます。
三項演算子の使い方は、次のような感じです。
英語のif文みたいですね。C言語などにもif文があります。
AviSynthでは三項演算子(? :)を使って、if文のようなことができます。
三項演算子の使い方は、次のような感じです。
|
「? :」はA、B、Cという3つのオペランドを取るので三項演算子と呼ばれます。
三項演算子の三項はオペランドの数を表しているんでしたね。ちなみにオペランドは、演算子で処理される式や変数などのことです。忘れてしまった人は前々回に戻って確認してください。
三項演算子を使用するときは、「さもなければ(Aでなければ)C」という部分を忘れないようにしてください。
「AならばB」だけではダメです。必ず例外が出たときにどうするかを決めておきましょう。
三項演算子の三項はオペランドの数を表しているんでしたね。ちなみにオペランドは、演算子で処理される式や変数などのことです。忘れてしまった人は前々回に戻って確認してください。
三項演算子を使用するときは、「さもなければ(Aでなければ)C」という部分を忘れないようにしてください。
「AならばB」だけではダメです。必ず例外が出たときにどうするかを決めておきましょう。
widthが4の倍数でないなら?
では、さきほどの「widthが4の倍数でないなら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%yでx÷yの余りを求めます。
「〜ではない」を表す演算子は!=(または<>)なので、「widthを4で割ったときの余りが0ではない」(「widthは4の倍数ではない」)を演算子を使って表すと次のようになります。
4の倍数であるかないかをどうやって見分ければいいでしょうか?
少し考え方を変えてみます。
4の倍数は4で割り切れる数、4の倍数でない数は4で割り切れない(余りが出る)数と言い換えることができます。
つまり、widthを4で割ったときの余りが0ならばwidthは4の倍数、widthを4で割ったときの余りが0でなければwidthは4の倍数ではないというわけです。
あとは余りを求める計算方法があればいいということになります。
余りを求めるための演算子は%です。
%はint(整数)型とfloat(小数)型のオペランドに使える演算子です(前々回参照)。
使い方は+や-などと同じで、x%yでx÷yの余りを求めます。
「〜ではない」を表す演算子は!=(または<>)なので、「widthを4で割ったときの余りが0ではない」(「widthは4の倍数ではない」)を演算子を使って表すと次のようになります。
|
widthを4の倍数にする?
次に無理矢理「widthを4の倍数に」する部分を考えます。
4の倍数ではない数字を4の倍数にするにはどうすればいいか?
これには先程の余りを求める式を利用します。
ある数を4で割って余りが出るとき、そのある数から余りを引いた数は4の倍数になります。
4の倍数ではない数字を4の倍数にするにはどうすればいいか?
これには先程の余りを求める式を利用します。
ある数を4で割って余りが出るとき、そのある数から余りを引いた数は4の倍数になります。
|
このように250から余りの2を引いた数(248)は、4で割り切れます(4の倍数)。
ですから、widthを4の倍数にするためには、widthからwidthを4で割ったときの余りを引けばいいのです。
余りを求める演算子は%ですから、これをwidthを使って表すと次のようになります。
ですから、widthを4の倍数にするためには、widthからwidthを4で割ったときの余りを引けばいいのです。
余りを求める演算子は%ですから、これをwidthを使って表すと次のようになります。
|
修正スクリプトの完成
以上のことをふまえて、スクリプトを完成させましょう。
|
これを演算子を使って表すと次のようになります。
|
「widthそのまま」は、そのまま「width」を持ってくればOKです。
これで「widthが4の倍数でないならwidthを4の倍数にしたものをwidthとし、もともと4の倍数ならwidthそのまま」をwidthとして使用することができます。
「x = A ? B : C (Aならばx = B、さもなければx = C)」の形ですね。
あとは、これをスクリプト内に付け加えれば、修正スクリプトの完成です。
修正したスクリプトを実行してみました。 |
[File Information...]を見ると、解像度は248x168になっています。 248:186 = 4*62:3*62 = 4:3 4:3になっていますね。 |
演算子に関する説明は、これでいったん終わりにします。
また自分で作る関数について解説するときにでも、あらためて具体例を挙げながら紹介したいと思います。
さて、次回はreturn文についての補足を少ししてから、お待ちかねの(待ってない?)クイズの答え合わせと参りましょう。
また自分で作る関数について解説するときにでも、あらためて具体例を挙げながら紹介したいと思います。
さて、次回はreturn文についての補足を少ししてから、お待ちかねの(待ってない?)クイズの答え合わせと参りましょう。
前のページ | 次のページ |