Как добавить плоскость эллипса в 3D-график в R

57
6

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")

Как добавить плоскость эллипса в 3D-график в R? Благодарю!

спросил(а) 2014-06-13T18:39:00+04:00 6 лет, 3 месяца назад
1
Решение
70

Все еще не уверен, что вы пытаетесь сделать, но это заселяет пересечение вашего самолета

z = x + y

и ваш параболический эллипсоид

г = 5x 2 -4xy + 5у 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(...) но когда я пытался, чтобы функция не сходилась...

ИЗМЕНИТЬ Ответ на комментарий ОП.

Таким образом, это пересекает ваш параболический эллипсоид с местом 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))

ответил(а) 2014-06-13T20:45:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема