ランダムなポイントを近い順につなげていく方法

   7431   11   1
User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
こんにちは

今Scatterで作ったポイントをある起点から近い順につなげようとしています。

ですが、nearpoint 関数を使うと、同じ場所をループしてしまうため、つなげることができません。
どなたか、アドバイスをください。


User Avatar
Member
16 posts
Joined: Feb. 2012
Offline
ポイントに適当なアトリビュート(例えばconnected)を作り、接続されたポイントの値を1に変更して、connectedアトリビュートが0の物で一番近いポイントを探してそれを繋いでいけばできるかと思います。
User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
eiji さん

ご回答ありがとうございます。

一番近くのポイントを探すのに、nearpoint 関数を使おうとしているのですが、
検索する範囲をconnnected アトリビュートが0の点に指定する方法がわかりません。

もしわかれば、教えていただけませんか?
User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
Image Not Found

Attachments:
naerpoint.JPG (225.2 KB)

User Avatar
Member
16 posts
Joined: Feb. 2012
Offline
nearpoint()ではなくnearpoints()を使って複数の近傍ポイントを取得し、ループで各ポイントのconnectedアトリビュートをチェックします。これでconnectedが0で一番近いポイントが得られます。

サンプルファイルを作ったので参考にしてみてください。
Image Not Found

Attachments:
connection.hipnc (99.8 KB)

User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
eiji さん 

ファイルありがとうございます!
参考にして自分で作ってみたのですが、思うような結果が得られませんでした。。

もし、お気づきの点やアドバイス等ありましたら、ご教授いただけると幸いです。
助けていただいてありがとうございます!

Attachments:
S__1441794.jpg (89.5 KB)
ConnectPtsOneLine.hiplc (74.1 KB)

User Avatar
Member
16 posts
Joined: Feb. 2012
Offline
Solver SOPを使えば結構簡単にできるのですが、一つのWrangle SOPでやろうとしていろいろ苦戦して、ある問題があることが分かりました。どうやらsetpointattrib()はWrangleの処理が終わるまでジオメトリのアトリビュートの値が更新されないので、Forループ内で値をセットしても次のイテレーションで更新されるはずの値が取得できない事です。

サンプルファイル作りました。
debugと名前のつけたノードで上の事が検証できるかと思います。

Image Not Found



takiさん、
setpointattrib()を使う場合に瞬時に値を反映させる方法はあるのでしょうか?
Edited by eiji - March 23, 2019 06:03:59

Attachments:
ConnectPtsOneLine_fix.hipnc (98.1 KB)

User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
Eiji さん

添付ファイルありがとうございます!

まさか、ループ中はアトリビュートが更新されないとは・・

何はともあれ、おかげ様で先へ進めそうです。
本当にありがとうございました。

もし、アトリビュートをループの最中に更新する方法を見つけたらここに載せておきます。
User Avatar
Member
45 posts
Joined: July 2005
Offline
面白そうなのでWrangleSOP一つでやってみました。
ポイント数が多くなると結構遅くなってしまうのであまり実用的では無いかもしれませんが。。。
Image Not Found

Attachments:
ConnectPtsOneLine2.hip (79.4 KB)

User Avatar
Member
27 posts
Joined: Oct. 2018
Offline
sho
面白そうなのでWrangleSOP一つでやってみました。
ポイント数が多くなると結構遅くなってしまうのであまり実用的では無いかもしれませんが。。。
Image Not Found

sho さん


ファイル拝見させていただきました。
一つの目的に、様々な方法があって面白いですね~

参考にさせていただきます!
User Avatar
Member
1 posts
Joined: Dec. 2018
Offline
kazurati
まさか、ループ中はアトリビュートが更新されないとは・・
古いスレッドで今更ですが、この点について気づいたことがあるので書き込んでみます。

更新されないというより、入力と出力が完全に分離している構造になっているようです。
なので、仕様変更がない限りはループ中に値を更新して取得することはできないと思います。

各VEX関数のリファレンスでも、入力から値を取得する関数は
<geometry>
ノード(例えばWrangle SOP)のコンテキスト内で実行する時は、この引数にジオメトリの読み込み元の入力番号(0から始まります)を意味する整数を指定することができます。

出力に値を書き込む関数は
geohandle
書き出し先のジオメトリハンドル。現在のところ、有効な値は0またはノードの現行ジオメトリを意味するgeoselfのみです。 (将来、この引数は他のジオメトリに書き出せるようにする予定です。)

と明確に分かれています。たいていの場合、どちらも0など整数を指定する事が多いと思うので同一視しがちですが…。

RunOverがdetail以外では並列動作をするので、安定的な挙動を担保するためには適切な仕様だと思います。
それがdetailにも適用されているのは、Wrangleノードで共通仕様にしたかったからじゃないでしょうか。

まぁ、私もループ中で書き換えて次で参照したいってのはやりたくなるんですが。
なので、それを踏まえてWrangleノード一つで済みそうな処理でも、二つに分けないと実現できない事はちょいちょいありますね。

追記:
なので、仕様変更がない限りはループ中に値を更新して取得することはできないと思います。
と書きましたが、RunOverをdetailにして、
・目的のアトリビュートをローカル変数にコピー
・ループ内でローカル変数に取得/更新
・最後に出力
とすれば、似たような事は可能でした。
並列動作できないので、大量のPointを処理するような処理だと重くなるとかあると思いますが、その辺が気にならないなら使える手段です。
Edited by marv_kurushimay - Oct. 4, 2019 01:39:27
User Avatar
Member
92 posts
Joined: Oct. 2018
Offline
僕も試してみました。

Attachments:
test_20191004.hipnc (122.3 KB)

  • Quick Links