1

これが私の問題です。次のコードを使用して構築したハイパーキューブがあります。

X <- seq (-1/sqrt(2),1/sqrt(2),length.out=100)
Y <- seq (-sqrt(2)/(2*sqrt(3)),sqrt(2)/sqrt(3),length.out=100)
Z <- seq (-1/(2*sqrt(3)),sqrt(3)/2,length.out=100)
grid <- data.frame (expand.grid(X=X,Y=Y,Z=Z))

次に、グリッド data.frame から、次の座標で定義された四面体内にないすべてのポイントを削除します。

w : (0,0,sqrt(3)/2)
x : (0,sqrt(2)/sqrt(3),-1/(2*sqrt(3)))
y : (-1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3)))
z : (1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3)))

非常に長いコードがなければ、これを行う方法が見つかりません。誰でも私を助けてくれませんかありがとう!!!

4

2 に答える 2

1

パッケージには、点が多面体内にあるかどうかを調べるptinpoly機能があります。pip3d

library(ptinpoly)
X <- seq(-1/sqrt(2),1/sqrt(2),length.out=10)  #I used a smaller dataset here
Y <- seq(-sqrt(2)/(2*sqrt(3)),sqrt(2)/sqrt(3),length.out=10)
Z <- seq(-1/(2*sqrt(3)),sqrt(3)/2,length.out=10)
# The query points has to be inputted as a matrix.
grid <- as.matrix(expand.grid(X=X,Y=Y,Z=Z))

w <- c(0,0,sqrt(3)/2)
x <- c(0,sqrt(2)/sqrt(3),-1/(2*sqrt(3)))
y <- c(-1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3)))
z <- c(1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3)))
# The matrix of vertices
tetra_vert <- matrix(c(w,x,y,z),byrow=TRUE,nrow=4)
# The matrix of faces (each row correspond to a vector of vertices linked by a face.
tetra_faces <- matrix(c(1,2,3,
                        1,2,4,
                        1,3,4,
                        2,3,4),byrow=TRUE,nrow=4)
inout <- pip3d(tetra_vert, tetra_faces, grid)

結果は整数のベクトルであり0、点が面に落ちることを意味し1、多面体の内側、-1外側にあることを意味します。

したがって、問題の解決策は次のとおりです。

grid[inout%in%c(0,1),]
于 2013-03-04T09:13:51.233 に答える
0

四面体を形成する平面を作成し、点が各平面の右側にあるかどうかを比較します。

ポインター: 平面法線などで内積を計算することを考えてください。1 つのオプションは、四面体のポイントから各コーナーまでベクトルを描画し、合計で 4 つ、ポイントからポイントまで 1 つのベクトルを描画し、ドット積などを使用して、ポイント間のベクトルが他の 4 つのベクトル内にあるかどうかを確認することです。

ポイントへのベクトルがコーナー ベクトルの非負の倍数と十分に短いベクトルの合計として表現できる場合、ポイントはおそらく四面体内にあります。

于 2012-06-06T19:43:39.570 に答える