2014年9月16日火曜日

Maxscript その12 「論理式」 比較式と論理式と条件式

論理式 「リファレンス>名前、リテラル定数、および式>単純式>論理式>論理式」

boolean値を使って論理演算(論理積、論理和、否定)を行いboolean値で答えを返す。ブール演算とも呼ばれる。2つのオブジェクトを合体するあの「ブーリアン」もここから来ているようだ。

この演算もプログラムの世界では基本的な演算となるようだ。

http://www.asahi-net.or.jp/~ax2s-kmtn/ref/logicope.html
コンポジット基礎の説明のようにも見える・・・。
----------------------
論理演算は「0と1しかない世界があったとしてANDはその世界の掛け算。ORは足し算」って昔教えてもらった。

AND
0 * 0 = 0
0 * 1 = 0
1 * 0 = 0
1 * 1 = 1

OR
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1

NOT(否定)は反転
NOT 0 = 1
NOT 1 = 0
----------------------
演算子

and
or
not

基本的な計算結果
組み合わせ(大したスクリプト書かないので僕はここまで複雑な論理式はほとんど使う事がない。)

----------------------------------------------
比較式と論理式(条件式)

比較式はboolean値を返すため、比較式の解を論理式で評価すると様々な条件を定義する事が可能になるようだ。

以下一例。()がなくてもいいものもあるけど、計算の優先順位や論理式と比較式が区別しやすいように()を付けた。



obj1 = $Sphere001
(classof obj1 == Spehre) and (obj1.radius < 10)
--「obj1が球体」かつ「半径が10より小さい」

obj1 = $Sphere001
obj2 = $Box001
(classof obj1 == sphere) and (classof obj2 == Box)
-- 「obj1が球体」かつ「obj2がボックス」

obj1 = $Sphere001
obj2 = $Box001
(classof obj1 == sphere) or (classof obj2 == Box)
-- 「obj1が球体」か「obj2がボックス」

3つになると少し複雑

obj1 = $Sphere001
obj2 = $Box001
obj3 = $Point
(classof obj1 == sphere) and (classof obj2 == Box) and (classof obj3 == Point)
-- 「obj1が球体」で「obj2がボックス」で「objがポイントヘルパー」

obj1 = $Sphere001
obj2 = $Box001
obj3 = $Point
((classof obj1 == sphere) or (classof obj2 == Box)) and (classof obj3 == Point)
-- 「obj1が球体」か「obj2がボックス」で「objがポイントヘルパー」





-----------------------------
論理式もPythonと同じですね。
(ちなみに、pyてょんは大文字小文字が1文字でも間違うとエラーになります。trueでもエラーです。)

Nukeでショートカット「D」(ノードのオンオフ)をPythonで行う場合・・・

#選択しているノードのdisableノブを取得
knob = nuke.selectedNode()['disable']
#値を反転
knob.setValue(not knob.getValue())

などとするとオンオフがきりかえれますか。
-----------------------------
排他的論理和 xor 2つの値が異なるとき1となる

しっかりは調べていないが、maxscriptにはxorがないので、自分で実装する感じだろうか

XOR
0  0 = 0
0  1 = 1
1  0 = 1
1  1 = 0

wikiによると以下の3通りらしいので
PQ=(P¬Q)(¬PQ)
PQ=(PQ)(¬P¬Q)
PQ=(PQ)¬(PQ)
 and
  or
¬ not

(not p and q) or (p and not q)
など、毎回記述するのはしんどいので、どれかを関数化し・・・

fn xor p q = (
    (not p and q) or (p and not q)
)

xor false false
xor false true
xor true false
xor true true

など。またxorの否定(否定排他的論理和)は2つの値が一致しているとき1となる。
XNOR(EQ)
0  0 = 1
0  1 = 0
1  0 = 0
1  1 = 1

論理演算 http://e-words.jp/p/r-logic.html

0 件のコメント:

コメントを投稿