Search - User list
Full Version: 曲線(直線)を単位距離で分割する方法
Root » 日本語フォーラム » 曲線(直線)を単位距離で分割する方法
mikuriya1
Bezier曲線(直線)をなるべく正確な単位距離で分割したいので、
方法がありましたらご教示お願いします。

まず例として自分の試した方法です
Bezier曲線(または直線)をmeasureノードで長さを計ります。アトリビュートperimeterは650です
この650を200ごとに分割これを繰り返し最後は50余らせるという想定です。

最初の曲線を切り出すのにcarveノードを使用しましたが、carveノードは単位距離は使えない(割合でカットする)ため、
firstUは0、secondUは200/650で0.3….という値を入れましたが分割された曲線には当然ながら誤差が生まれます。

数回程度であれば誤差が与える影響は少ないのですが、多くなるほど大きくなるので困ってしまいました。
Enivob
リサンプルノードは、ラインを等量で分割します。
mikuriya1
お答えいただき、ありがとうございます。
リサンプルを通すと、ベジエがポリゴンラインになってしまいますね。
それと誤差が発生してしまうようです。
Enivob
おそらく、ポリゴンを変換してベジェに戻しますか?
Satoru
primuvconvert 関数を使って単位距離を変換できるので、それを Carve SOP で使うのはどうでしょう。

run over primitive :
float curvelength;

// typeid : 1 Poly, 2 NURBCurve, 3 BezierCurve
int typeid = primintrinsic(0, "typeid", @primnum);
if(typeid == 1)
    curvelength = primintrinsic(0, "measuredperimeter", @primnum);
else if(typeid == 2 || typeid == 3)
    curvelength = primintrinsic(0, "arclength", @primnum);
    
float unitlen = clamp(chf("len") / curvelength, 0, 1);
f@domainu = primuvconvert(@OpInput1, set(unitlen, 0), @primnum, PRIMUV_UNITLEN_TO_UNIT)[0];

Image Not Found
mikuriya1
ご返答ありがとうございます。
>Enivobさん
いえ、分割まではベジェ以外に変換する想定ではないです。
>Satoruさん
結果として、ベジェの自体の仕様?精度が不安定で不明なため、
正確な位置でカットするのが難しいのかもしれません。諦めようと思っています。

頂いたhiplcを検証しましたので報告します。
頂いたvex(Aとします)こちらで以下の部分のみ改変したVEX(Bとします)
vexf@domainu = clamp(chf(“len”) / curvelength, 0, 1);

1回目と2回目にそれぞれ長さとカーブの異なるベジェを使用しました。
1回目はhiplc内のフリーハンドで描かれてるベジエを使用しました。カットするlengthは1を指定、結果Aのが精度がよく若干誤差がございました。
2回目はこちらで用意したline(Bezier長さは121)カットするlengthは20を指定、結果Bのが精度がよく誤差はありませんでした。

この結果から丸め誤差みたいな要因でベジェの長さ自体が曖昧になってしまうのかもしれません。
画像左がAのattribwrangle右がBでございます。
Satoru
こちらでもベジェで結果が合わないのを確認しました。検証足らずで申し訳ないです。
mikuriya1
いえいえ、
vexの使い方は大変参考になります。ありがとうございます
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB