【问题标题】:rgl: draw plane spanned by two 3D vectorsrgl:绘制由两个 3D 向量跨越的平面
【发布时间】:2020-04-03 22:25:39
【问题描述】:

我无法理解rgl::plane3d 的参数需要绘制一个由两个向量(x0x1)跨越的平面,通过给定点( O=原点)。这是一个解释投影的图表。

rgl 文档没有提供足够的示例让我理解要指定的内容。

这是我的 MWE:

library(matlib)
library(rgl)
rgl::open3d()
O <- c(0, 0, 0)
x0 <- c(1, 1, 1)
x1 <- c(0, 1, 1)
y <- c(1, 1, 3)
XX <- rbind(x0=x0, x1=x1)
matlib::vectors3d(XX, lwd=2)
matlib::vectors3d(y, labels=c("", "y"), color="red", lwd=3)
# how to specify the plane spanned by x0, x1 ???
# planes3d(..., col="gray",  alpha=0.2)
# draw projection of y on plane of XX
py <-  matlib::Proj(y, t(XX))
rgl::segments3d(rbind( y, py))
rgl::segments3d(rbind( O, py))

【问题讨论】:

    标签: r projection rgl plane


    【解决方案1】:

    要找到与x0和x1都平行的平面,求这两个向量的叉积,我们可以手动完成,因为它是R:

    library(pracma)
    cross(x1,x2)
    [1]  0 -1  1
    

    因此,与此垂直的平面方程基本上是任何点积为0的向量,意思是:

    0*x + -1*y + 1*z = 0
    -y + z = 0
    

    你可以阅读更多关于here的解释。或者在您的场景中,您可以将其视为需要 y = z 平面(因为 x 不同)。

    因此,如果您查看文档,它会说:

    ‘planes3d’和‘rgl.planes’使用参数化绘制平面 a x + b y + c z + d = 0。

    我们没有偏移量,所以 d = 0,剩下的就是 a = 0、b= -1 和 c= 1:

    plot3d(rbind(0,x1),type="l",xlim=c(0,3),ylim=c(0,3),
    zlim=c(0,3),xlab="x",ylab="y",zlab="z")
    lines3d(rbind(0,y),col="red")
    lines3d(rbind(0,x0))
    
    py <-  matlib::Proj(y, t(XX))
    segments3d(rbind( y, py),col="gray")
    segments3d(rbind( O, py),col="gray")
    
    planes3d(a=0,b=-1,c=1,col="turquoise",alpha=0.2)
    

    【讨论】:

    • 详细的解释很有帮助。但是,我现在看到可以简单地将平面指定为plane3d(cross(x0, x1), col=...)
    • 是的,没错..抱歉有点啰嗦,我才意识到......
    • 有没有办法将其扩展到矩形的交点而不是带有 rgl 对象的平面?我问是因为与平面相交,比如mesheR,返回点,但如果想要点和边......
    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多