NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

3次元グラフにベクトルを書き込む

いつもお世話になっております。
岡本と申します。

 

3D曲面グラフについて、質問がございます。

よろしくお願いいたします。

 

3D曲面グラフの標準の入力は
x,yは1次元配列、zは2次元配列ですが、
(x,y,z)のデータを入力にしたいと思っています。

 

表題の質問ですが、自己解決できないかと過去の質問を調べましたところ、
以前、他の方の質問で同様の質問がございました。

 

http://forums.ni.com/t5/NI%E8%A3%BD%E5%93%81%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AB%E3%83%83%E3%82%B7%E...


質問された方は自己解決できたようですが、具体的にどのように解決されたのか、わかりませんでした。
回答内容にある、x,y,zがそれぞれ1次元配列である必要があるとのことですが、
zが2次元配列がデフォルトでzの値を1次元配列入力にするための手段がわかりませんでした。


上記が解決できた時、次に行いたいことは、
xy,yz,xzのいずれかの選択した任意の面と平行な面が曲面と交差する値を数値として取り出したいということです。

 

たとえば、山をグラフで描いたとして、
1)xy平面と平行な等高線に相当する高さを指定し、その等高線を示すラインを値を数値として配列などに格納
2)yz平面と平行な断面の稜線に相当するラインを数値として配列などに格納
のようなことを実現したいと考えています。

 


当方、LabVIEW8.5 WinXpの環境です。

 

よろしくご指導くださいますようお願いいたします。

 

0 件の賞賛
メッセージ1/6
4,536件の閲覧回数

こんにちは。

 

こんなイメージでしょうか?

 

(1)放物面(山)を計算し、x,y,zの座標テーブルを作成。

(2)これを3Dグラフにプロットして、

(3)さらに任意のX位置でのYZ断面を2Dグラフにプロットする

 

ように作ってみました。

 

スタートさせたあと、係数や、R等の数値を

変更してみてください。

0 件の賞賛
メッセージ2/6
4,506件の閲覧回数

ITOB様

お忙しい中、お時間割いてサンプルまで作成してくださり、大変感謝いたします。
どうもありがとうございました。
大変参考になります。

 

 

ブロックダイアグラムを全て見切れておりませんが、
(2)に関して、x,y,zの1次元配列が接続されていることを確認しました。
この方法で、グラフは描けるものと考えます。ありがとうございます。

 


(3)に関してですが、説明が上手く出来ていなかったのですが、
(1)でLabVIEWで計算したデータではないものをファイルから読み込み入力します。
そのため、ご提示頂いた(3)のように断面に相当するラインを計算しなおす、ということができない状況です。


実現するために、グラフの投影、切片検出などの機能があったら、
その機能を使うことで断面を検出できないか、という事を考えておりました。

難しいことをやろうとしているのかすら、分からない状況です。

平行面に相当する値をしきい値にして、前後のデータに絞り込んで
その値を比較し補完してデータを作成しプロットをする、
が力ずくでの実現方法かと考えておりますがそれでもうまくいくかわかりません。

 

実現方法のヒントでも構いませんので、ご指導よろしくお願いいたします。

0 件の賞賛
メッセージ3/6
4,498件の閲覧回数

ちょうど私も、同じようなことをしているところです。

いまのところ、補間をどうやろうか考えているところです。

いい案が思いついたら情報共有します。

岡本さんも、いい案が思いついたら教えてください!

 

すぐにお役にたつことができず。すみません。

 

0 件の賞賛
メッセージ4/6
4,446件の閲覧回数

ITOB様

引き続きご検討いただき、ありがとうございます。
お時間割いていただき、恐縮です。

 

私の現在の状況をご報告いたしますと、
ベクトルから3Dグラフに表示することまではお陰様で実現できております。
ありがとうございました。


ベクトルのデータは15000点程度でちょうどカーテンのような形状です。
データそのものは点の集まりでしかありません。

 

断面を求める条件としては、カーテンとほぼ平行な面での断面を求めることは無く、
断面は一度に複数や、等高線のような閉じられた断面が現れることはありません。
カーテンと床と平行な面よりなる断面は1本の線になります。

 

断面を求める方法として、一定間隔の仮想の点の列を作って、
そのそれぞれの周りに存在する点を探し出して補完する、ということを考えております。

周りに存在する点を探す方法として、あるxを固定したときのy、zについて、
仮想の点のy、zに最も近い+-の点のくみあわせ4点(++、+-、-+、--)
(=ある点を第1象限から第4象限で囲む4点)を見つけて、
補完することで断面に相当する点列を計算できるのではないか、試そうとしています。
簡単な絵を書いてみました。


もっとスマートなやり方がありそうなものですが、今考えていることは上記の方法です。


点群から面にする方法として一番近い点同士をつなげて面にすればよいのですが、
実際には、点同士がつながるか否かの情報がないと難しいのでしょうね。

 

もう少し進展したら、ご報告いたします。

 

今後ともよろしくおねがいいたします。

0 件の賞賛
メッセージ5/6
4,431件の閲覧回数

随分と時間が経ってしまいましたが、当初の狙いのとおりにプログラムできました。

 

先の投稿で間違いがありました。


あるxを固定したときのy、zについて → 高さzでの断面を考えた時の、x、zについて

 

周りに存在する点を探す方法として、高さzでの断面を考えた時のx、zについて、
仮想の点のx、zに最も近い+-の点のくみあわせ4点(++、+-、-+、--)
ある点を第1象限から第4象限で囲む4点を見つけて、
補完することで断面に相当する点列を計算できるのではないか、試そうとしています。

 

補間のところですが、一定間隔で作った仮想の点それぞれについて、
その点の4象限それぞれの領域に存在する点のうち、
着目点に距離が一番近い点を探し出して、評価点を4点決定します。

4点のうちの3点の組み合わせで出来る平面が4条件ありますので、
それぞれの面上に存在するとした場合のyを推定しました。

 

4推定値を平均化すべきか、重み付けして値を補間すべきか悩んでいますが、
点群から、いちおう、断面らしきものが見え始めました。

 

補間する良い方法があったら、ご指導ください。
よろしくお願いいたします。

0 件の賞賛
メッセージ6/6
4,256件の閲覧回数