検索 - User list
Full Version: 再帰関数(VEX)
Root » 日本語フォーラム » 再帰関数(VEX)
imo54
VEXでの再帰関数についての質問です。

Attribute Wrangleノードのなかで、ある配列を間引いて新たな配列を得るために再帰関数を使う必要があります。
しかし、公式のVEX言語リファレンスによると

>関数は、コンパイラで自動的にインラインされます。そのため、再帰関数は動作しません。再帰アルゴリズムを書くには、代わりにシェーダコールを使います。
https://www.sidefx.com/ja/docs/houdini/vex/lang.html [www.sidefx.com]

とあります。
そこで、シェーダコールのサンプル
https://www.sidefx.com/ja/docs/houdini/vex/shadercalls.html [www.sidefx.com]

>再帰シェーダ:

cvex fib(int i = 0; export int rval = 0)
{
    if (i >= 2)
    {
        int v1, v2;
        fib("i", i-1, "rval", v1);
        fib("i", i-2, "rval", v2);
        rval = v1 + v2;
    }
    else
        rval = i;
    printf("%d: %d\n", i, rval);
}

をコピペしてみても、Invalid return type(cvex) for function fibとなってしまいます。

VEXで再帰関数を使う方法をご教授願います。
Ken Taki
シーンファイルをアップロードしていただくことは可能でしょうか?
imo54
簡易的なシーンファイルを作ったので、そちらを添付します。

cvex DouglasPeucker(vector list[] = {}; float epsilon = 0; export vector rList[] = {})

では、listに元のポイントリストを、epsilonに閾値を入れ、間引きしたポイントリストrListを返すというものを想定しています。
Ken Taki
Wrangle は wrapper ですので、cvex のようなカーネルレベルの関数を使う事は出来ません。
cvex を使った例は
https://www.sidefx.com/docs/houdini/nodes/dop/popcolor.html
[www.sidefx.com] などをご覧ください。
imo54
上記リンク先とcvexの関連、および再帰関数との関連がわかりませんでした。


今回解決したい課題は、あるポイントリストの配列を間引きして新たなポイントリストの配列を得るために再帰関数を使いたいというものです。


>Wrangleはwrapperですので、cvexのようなカーネルレベルの関数を使う事は出来ません。

>再帰アルゴリズムを書くには、代わりにシェーダコールを使います。

Attribute Wrangleでcvexは使えないので、シェーダコールは別のところで行うという事でしょうか?
sho
imo54さん、シェーダーコールで呼び出したい関数は、*.vflファイルに保存して、$HOUDINI_PATH内のvex/CVexフォルダに入れれば、AttributeWrangleで使うことが出来ます。

例えば、$HOME/houdini17.5/vex/CVex/DouglasPeucker.vfl
というファイルにcvex DouglasPeucker()を定義しておくと、Wrangle内で

import DouglasPeucker;

DouglasPeucker(“list”, pointList, “epsilon”, @threshold, “rList”, @DPpointList);


みたいに呼び出すことが出来ます。

サンプルを作ってみましたのでチェックしてみて下さい。
Image Not Found



一応動いているみたいですが、epsilonの値によっては挙動が変になってる気がします。。。多分僕の使い方が間違っているのかも知れません。。。
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.