关于绘图平面的R代码z = x + y:
library("rgl")
f <- function(x,y)
x+y
x_grid <- seq(0,1, length=20)
y_grid <- x_grid
z_grid <- outer(x_grid, y_grid, f)
surface3d(x_grid, y_grid, z_grid,front="line",back="line")
axes3d()
关于绘图椭圆的R代码5x ^ 2-4xy + 5y ^ 2 = 1:
my.fun <- function(x,y){5*x^2 - 4*x*y + 5*y^2}
x<-seq(-sqrt(5/21), sqrt(5/21), length.out = 101)
y<-seq(-sqrt(5/21), sqrt(5/21), length.out = 101)
z<-outer(x,y,my.fun)
contour(x, y, z, levels = 1, drawlabels = 0, xlab = "x", ylab = "y")
如何将椭圆平面添加到R中的3D绘图?谢谢!
答案 0 :(得分:2)
仍然不确定你要做什么,但这会绘制你的飞机的交叉点
z = x + y
和你的抛物线椭球
z = 5x 2 -4xy + 5y 2
并在链接的图像中为生成的椭圆着色。
library(rgl)
f <- function(x,y) x+y
my.fun <- function(x,y) 5*x^2 - 4*x*y + 5*y^2
x_grid <- seq(0,1, length=20)
z_grid <- outer(x_grid, x_grid, f)
theta <- seq(0,2*pi,length=1000)
r <- sqrt(5/21)
df <- expand.grid(x=r*cos(theta),y=r*cos(theta))
df$z <- with(df,f(x,y) - my.fun(x,y))
xyz <- df[df$z>=0,]
surface3d(x_grid, x_grid, z_grid, front="line",back="line")
axes3d()
zlim <- range(-1000*f(xyz$x,xyz$y))
zlen <- diff(zlim) + 1
palette <- heat.colors(zlen)
col <- palette[-1000*f(xyz$x,xyz$y)-zlim[1]+1 ]
with(xyz,points3d(x,y,f(x,y),color=col))
这使用快速而肮脏的方法来计算平面和椭球的交点:在(x,y)中创建一个相对精细的点网格,然后简单地识别f(x,y) - my.fun(x,y) < 0
的所有点。这些点位于交叉点形成的椭圆内。然后只绘制这些点。
我认为,执行此操作的惯用方法是使用ploygon3d(...)
,但是当我尝试使用该函数时,该功能并未收敛...
编辑回应OP的评论。
因此,这将绘制抛物线椭球与地点z = 1
的交点,并根据x的增加值(看起来像您提供的图像)对结果进行着色。我不知道这是什么意思......
library(rgl)
f <- function(x,y) rep(1,length(x))
my.fun <- function(x,y) 5*x^2 - 4*x*y + 5*y^2
x_grid <- seq(0,1, length=20)
z_grid <- outer(x_grid, x_grid, f)
theta <- seq(0,2*pi,length=1000)
r <- sqrt(5/21)
df <- expand.grid(x=r*cos(theta),y=r*cos(theta))
df$z <- with(df,f(x,y) - my.fun(x,y))
xyz <- df[df$z>=0,]
surface3d(x_grid, x_grid, z_grid, front="line",back="line")
axes3d()
zlim <- range(-1000*xyz$x)
zlen <- diff(zlim) + 1
palette <- heat.colors(zlen) # height color lookup table
col <- palette[-1000*xyz$x-zlim[1]+1 ] # assign colors to heights for each point
with(xyz,points3d(x,y,f(x,y),color=col))