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

制作形成四面体的平面,并比较一个点是否在每个平面的右侧。

指点:考虑用平面法线等计算点积。一种选择是从四面体点到每个角绘制一个向量,总共 4 个和从点到点的 1 个向量,然后使用点积等来查看点-点向量是否在其他 4 个向量内。

如果指向它的向量可以表示为角向量的非负倍数和足够短的向量的总和,则该点可能在四面体内。

于 2012-06-06T19:43:39.570 回答