这是我的问题。 我有一个使用以下代码构建的超立方体:
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)))
如果没有多长的代码我就找不到了。任何人都可以帮助我 谢谢!!!
答案 0 :(得分: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),]
答案 1 :(得分:0)
制作形成四面体的平面,并比较一个点是否位于每个平面的右侧。
指针:考虑用平面法线计算点积等。一种选择是从四面体点到每个角绘制一个矢量,总共4个点和点到点的1个矢量,然后使用点积和诸如此点来查看点点矢量是否在其他4个点内。
如果向量的矢量可以表示为角矢量的非负多次和矢量足够短,则该点可能在四面体内。