アプリ版:「スタンプのみでお礼する」機能のリリースについて

三次元の空間に、N面体があります。
各面のなす角は0~360度で、星型のように、180度以上となる角もあります
そのN面体において、隣り合う各面で成される角を算出したいのですが。。。
角度はN面体を外側から見た場合の角度と定義します。

隣り合う平面の方程式を
(1) Ax+By+Cz=D
(2) ax+by+cz=d
と定義した場合に、
成される角は各面の法線ベクトルを用いて、
θ=arccos{(A*a+B*b+C*c)/√((A^2+B^2+C^2)*(a^2+b^2+c^2))}
で算出できることが分かりました。

ただ、この式ですと結果が±θと±(180-θ)のうちどれとなるのか分かりません。
成す角が上記の4つのうち、どれなのか知る手立てはありませんか。

A 回答 (6件)

#3の補足です。



「面を構成する頂点の順番(外側から見て左回りで)」について。

凹凸が複雑に入り組んでいて、全体像が把握できないような多面体なら、どっちが外側か内側かを判断するのは難しいかもしれません。
その場合は、#5さんのような方法で計算するしかないでしょう。

ただ、形を想像できるような多面体なら、どっちが外側か内側かは分かっていると思いますので、最初からそれをデータとして持ったほうが簡単です。


もうひとつ、
2平面の角度を確定するためには、平面の裏表だけではなく、共有する辺の方向の情報も必要になります。
これがないと、+θと-θの区別がつきませんので。
    • good
    • 0
この回答へのお礼

なんとなくですが、イメージがつかめたような気がします。
そこまで複雑な多面体ではなく、点の順序もつけることができそうなので、一度チャレンジしてみたいと思います。

ありがとうございました。

お礼日時:2011/09/11 19:08

2番です。



「S以外のすべての面とPとの共有点の総数」という言い方が大まかなので若干補足します。

AのS上のr近傍(S上で中心A半径rの開円盤)Vを考えます。V上の任意の点A'について同様にP'が定義できて他の面との共有点を調べることができます。

V上のすべての点についてそのようなP'を考えて、S以外のすべての面との共有点の総数を調べます。

rを十分小さくとって、V上の点のすべてにおいてそのような共有点の総数がすべて同じであれば、その数を採用します。

rをいくら小さくとってもそのような共有点の総数が同じにならない場合がありますが、その場合はそれらの総数のうちの最小な値を採用します。面の数が有限なので最小値が存在します。

このようにしてSの法線が他の面の辺をかすめて偶奇が逆転したり、他の面に法線の一部の線分が含まれてしまったりして共有点の数が∞になってしまう場合をうまく除外することができます。

3番さんの説明にある「面を構成する頂点の順番(外側から見て左回りで)」について、それを決定するのは難しいです。ローカルには、隣り合う面同士で共有する辺上で逆向きになるように順番を指定すれば、内側か外側かどちらか一方にそろえることができますが、そろえたとしても、それが実際に内側なのか外側なのか決定する手段が与えられていません。
    • good
    • 0
この回答へのお礼

2回もアドバイスいただき、ありがとうございました。

難しく、理解が未だついていっていませんが、参考に考えてみたいと思います。

お礼日時:2011/09/11 19:07

#3の追記です。



多面体の情報として、
面の表(外側)方向の法線ベクトル
もあったほうがいいです。
これがないとどっちが表かを判断するのが(不可能ではありませんが)難しいですから。
    • good
    • 0

#1です。



2つの法線ベクトルの外積は、2つの平面が共有する辺のベクトルになります。

その辺のベクトル方向が、(1)の平面の表(外側)から見て左回りか右回りかを判定すれば+θか-θが決定できます。(どっちが+でどっちが-かは確認していないので分かりませんが、必ずどちらかに固定されます)


2つの平面の方程式のほかに、
「平面の表(外側)はどちらか」、
「2つの平面が共有する辺の端点P,Qの座標」と、
「(1)の平面の表(外側)から見て、P→Qは左回りか右回りか」
の情報があれば角度の計算ができます。


#2さんの回答は、平面の裏表を判定する方法として、
多面体を構成する面と直線とが共有点を持つかどうかを調べることとしていますが、これを計算するには面を構成する辺の情報が必要で、かなり難しい計算になるし、精度の関係で正しい答がでるかどうかも不明です。

上記の「(1)の平面の表(外側)から見て、P→Qは左回りか右回りか」
という判定も、面を構成する頂点の座標が分かっていれば可能ですが、これも計算が厄介です。


なので、多面体の情報として、
頂点の座標
面を構成する頂点の順番(外側から見て左回りで)
辺を共有する面の情報(どの面とどの面が辺を共有しているか)
を把握しておけば、計算が楽になるでしょう。
    • good
    • 0

2つの面が与えられただけでは面のどちらが外側でどちらが内側か判断することはできません。



ある面Sのどちらが内側でどちらが外側かは、以下のようにして判断できます。

その面上の点Aを一つ固定し、Aを通りその面に垂直な直線lを考えます。

l上のAと異なる点を一つとって固定します。それをBとします。

l上の点Xで、ベクトルAXとベクトルABとの内積が正であるもの全体をP、負であるもの全体をQとすると、P∪{A}∪Q=lとなります。

S以外のすべての面とPとの共有点の総数が偶数である場合、BはそのN面体の外側にあり、奇数である場合は内側にあることになります。
    • good
    • 0

とりあえず、考え方だけ。



角度を確定させるためには、面の裏表の情報が必要です。
それで±(180-θ)の候補は除かれます。

あとは、外積を使えば、±θのどちらであるかを決定できます。

この回答への補足

お返事、ありがとうございます。
知識が無くて、頓珍漢なことを聞いてしまったらすみません。
外積はベクトルの形になると思うのですが、その外積結果をどう見たらよいのでしょうか。
たとえば、法線ベクトルAと法線ベクトルBの外積A×B=(a,b,c)とした場合、
それから、±θはどのように判断したら良いのでしょうか?

補足日時:2011/09/08 02:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!