如何绘制联锁环面?

时间:2014-05-22 06:21:52

标签: r plot gnuplot

如何在this page for gnuplot

中绘制R中的互锁圆环

interlocking tori

我尝试在R中使用代码,但它们不起作用:

try_tori_1 = function(){
    library(rgl)
    xvec= yvec = seq(-pi,pi,by=0.1); 
    z <- outer(xvec,yvec,function(x,y) {sin(x)+.5*sin(x)*cos(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue")
    z <- outer(xvec,yvec,function(x,y) {cos(x)+.5*cos(x)*cos(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", add=T)
    z <- outer(xvec,yvec,function(x,y) {.5*sin(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", add=T)
    z <- outer(xvec,yvec,function(x,y) {1+cos(x)+.5*cos(x)*cos(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", add=T)
    z <- outer(xvec,yvec,function(x,y) {.5*sin(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", add=T)
    z <- outer(xvec,yvec,function(x,y) {sin(x)+.5*sin(x)*cos(y)} )
    persp3d(z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", add=T)
}

try_tori_2 = function(){
    library(rgl)
    u= v = seq(-pi,pi,by=0.1); 
    plot3d(cos(u)+.5*cos(u)*cos(v),sin(u)+.5*sin(u)*cos(v),.5*sin(v))
    plot3d(1+cos(u)+.5*cos(u)*cos(v),.5*sin(v),sin(u)+.5*sin(u)*cos(v))
}

2 个答案:

答案 0 :(得分:6)

我的回答是基于这两个网站的例子:

以下是你的表现:

library(plot3D)
x <- seq(-pi,pi,by=0.1)
y <- seq(-pi,pi,by=0.1)
R = 1.0
r = 0.5
M <- mesh(x, y)
alpha <- M$x
beta <- M$y
surf3D(x = (R + r*cos(alpha)) * cos(beta), 
       y = (R + r*cos(alpha)) * sin(beta), 
       z = r * sin(alpha), 
       col="blue", colkey=FALSE, alpha = 0.3, border="black", 
       xlim=c(-0.5*pi,0.5*pi), ylim=c(-0.5*pi,0.5*pi), zlim=c(-0.5*pi,0.5*pi))
surf3D(x = R + cos(alpha) + r*cos(alpha) * cos(beta), 
       y = r*sin(beta), 
       z = sin(alpha)+ r * sin(alpha) * cos(beta), 
       col="red", colkey=FALSE, alpha = 0.3, border="black", add=T)

这会产生这个情节:

interlocking tori

需要注意的重要事项是:

  • 使用surf3D函数
  • 使用mesh
  • 设置您的角度
  • 查看全部,使用第一个图
  • 指定范围(xlim等)
  • 使用颜色和alpha进行绘图以获得
  • 之后的颜色

答案 1 :(得分:2)

您还可以使用misc3d(呈现交互式rgl图)来做到这一点。

library(misc3d)
R <- 3; r <- 1
fx <- function(u,v) (R+r*cos(u))*cos(v)
fy <- function(u,v) (R+r*cos(u))*sin(v)
fz <- function(u,v) r*sin(u)
parametric3d(fx, fy, fz, umin=0, umax=2*pi, vmin=0, vmax=2*pi, color="red")
gx <- function(u,v) fx(u,v) - R
gy <- fz
gz <- fy
parametric3d(gx, gy, gz, umin=0, umax=2*pi, vmin=0, vmax=2*pi, color="blue", 
             add = TRUE)

enter image description here