R语言 如何检查/判断/分割一个点是否在一个3D圆锥体内?

sd2nnvve  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(102)

我如何知道哪些点在圆锥体内部,例如下面的兔子数据?

library("onion")
library("rgl")

#bunny data
data(bunny)

#cone
pts <- cbind(c(0, 0), c(0, 0.23), c(0, 0))# the centers
radii <- c(0.0, 0.15)
cone <- cylinder3d(pts, radii, sides = 20)

#visualize
points3d(bunny, col="pink", alpha = 0.3)
shade3d(cone, col = "lightblue", alpha = 0.9)

字符串

b5lpy0ml

b5lpy0ml1#

这更像是一个几何问题,而不是一个编程问题。对于x,y,z空间中的任何给定点,x^2 + z^2 < (0.15/0.23 * y)^2将位于您定义的圆锥内的点,所以您可以这样做:

data(bunny)

pts <- cbind(c(0, 0), c(0, 0.23), c(0, 0))
radii <- c(0.0, 0.15)
cone <- cylinder3d(pts, radii, sides = 100)

cone_bunny <- bunny[bunny[,1]^2 + bunny[,3]^2 < (0.15/0.23 * bunny[,2])^2,]

points3d(cone_bunny, col="pink", alpha = 0.5)
shade3d(cone, col = "lightblue", alpha = 0.3)

字符串
x1c 0d1x的数据
我不确定你是否在寻找一个更通用的3D形状相交的解决方案-这要困难得多,但许多简单的几何相交可以从简单的代数计算。

增编

在评论中指出,你可能不想要一个实际的圆锥体,而是一个20边的金字塔,如你的例子所示。这也可以通过数学解决方案来解决:

cone <- cylinder3d(pts, radii, sides = 20) 

lims <- (0.15/0.23 * bunny[,2])^2/cos(atan2(bunny[,3], bunny[,1]) %% 
         (2*pi)/20 - pi/20)

cone_bunny <- bunny[bunny[,1]^2 + bunny[,3]^2 < lims,]

points3d(cone_bunny, col="pink", alpha = 0.5)
shade3d(cone, col = "lightblue", alpha = 0.3)


相关问题