2016-10-24 2 views
0

私は、交差していない球や回転楕円体を表示するのに役立つライブラリやその他のソースコードを探していますが、必ずしもビンのパッキングの問題ではありません。これらの球体のそれぞれは、さらに小さな球体のセットを含むことができます。私は、この「世界」を通してスライス、すなわち2つの平行な平面、すなわち、離れた立方体を取って、与えられたスライスによっていくつのより大きい球とより小さな球が「捕捉されるか」を計算し、3Dグラフィック。2つの平行な平面または直方体で拘束された回転楕円体の数をどのようにしてプロットするか?

私はプログラミングなどで豊富な経験を持っていますが、3D空間は私には新しく、幾何学的には少し錆びます。私はR +とD3.jsのrglパッケージを調べましたが、明白な解決策は見当たりません。 StackOverflowを使って検索しましたが、「Cube sphere intersection test」ですか?ポスト、それは私が探しているものを私に得ることはありません。おそらくこれが "衝突"の問題かそれ以上の立体視問題に該当するかどうかは確かではありませんが、CRANパッケージのStereoMorphも答えは出ませんでした。

私はどこに見えるべきであるかに関する提案は大歓迎です。私はまた、特定のコンピュータ言語には結びつかない。

ありがとうございます!

答えて

1

球は次のように定義されます

[centerX,centerY,centerZ,radius] 

と面はあなたがの方向に沿って移動した場合に

[normalVectorX,normalVectorY,normalVectorZ,distance] 

の距離が平面に原点からの距離であると定義されます法線ベクトル。言い換えれば、法線ベクトルの各成分に距離を掛けると、平面上のどこかにポイントが置かれます。

球が平面又は他の一方の側にあるかどうかをテストする:

プロジェクト垂直な平面上への球の中心、球の半径を加算し、その和は、平面距離未満である場合、交差していない。他のプレーンの

CENTER = [centerX,centerY,centerZ] 
NORMAL = [normalVectorX,normalVectorY,normalVectorZ] 
isBelowHighPlane = dotProduct(CENTER,NORMAL)+radius < distance 

、和が大きい場合、半径、テストを引く、「下」面を言うことができます:

isAboveLowPlane = dotProduct(CENTER,NORMAL)-radius > distance 

上記試験の両方が該当する場合したがって、球体であります含まれています。

注:あなたの平面が空間A、B、Cでの3点で、たとえば、他のいくつかの方法で定義されている場合は、あなたが任意の2辺の外積を取ることによって、正常に見つけることができます:

normalVector = normalize(crossProduct((B-A),(B-C))) 

あなたがその法線ベクトルを持っていたら、あなたが通常の上に、これらの点のいずれかへの原点からのベクトルを投影することによって距離を見つけることができます。

distance = dotProduct(B,normalVector) 

は、距離が負でもよいです。

だから、あなたが選ぶどんな言語で必要な3D機能は以下のとおりです。

dotProduct()crossProduct()、およびnormalize()

あなたはそれを含む大きな球に小さな球からいくつかの接続を持っており、その大きな球体がある場合完全に入っていても完全に入っていても、すべての小さな球体の状態を即座に知ることができます。ただし、大きな球が完全に外れているかどうかをテストするには、テストで追加のバリエーションが必要です。

isAboveHighPlane = dotProduct(CENTER,NORMAL)-radius > distance 
isBelowLowPlane = dotProduct(CENTER,NORMAL)+radius < distance 
関連する問題