rgl: нарисовать плоскость, натянутую на два трехмерных вектора - PullRequest
0 голосов
/ 04 апреля 2020

У меня проблемы с пониманием аргументов для rgl::plane3d, необходимых для рисования плоскости, натянутой на два вектора ( x0 , x1 ), проходящей через заданную точку ( О = происхождения). Это диаграмма, поясняющая проекцию.

В документации по rgl недостаточно примеров, чтобы я мог понять, что именно указать.

enter image description here

Вот мой 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))

1 Ответ

2 голосов
/ 04 апреля 2020

Чтобы найти плоскость, параллельную как x0, так и x1, найти перекрестное произведение этих двух векторов, мы можем сделать это вручную, так как это R:

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

Итак, уравнение плоскости перпендикулярно этому - в основном любой вектор, точечное произведение которого даст вам 0, что означает:

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

Подробнее об объяснении можно прочитать здесь . Или в вашем сценарии вы можете думать об этом, как о плоскости ay = z (потому что x отличается).

Так что, если вы посмотрите на документацию, она говорит:

' planes3d 'и' rgl.planes 'рисуют плоскости, используя параметризацию ax + by + 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)

enter image description here

enter image description here

...