如何检查/决定/分割一个点是否在 3d 圆锥体内?

问题描述 投票:0回答:1

我如何知道哪些点在圆锥体内,例如 遵循兔子数据?

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)

r rgl
1个回答
2
投票

这更像是一个几何问题,而不是一个编程问题。对于 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)

我不确定您是否正在寻找一种更通用的相交 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)

© www.soinside.com 2019 - 2024. All rights reserved.