Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将若干不等式绘制为平面_R_3d_Rgl_Inequality - Fatal编程技术网

R 将若干不等式绘制为平面

R 将若干不等式绘制为平面,r,3d,rgl,inequality,R,3d,Rgl,Inequality,我想画几个平面,每个平面都是一个不等式。绘制完所有平面后,我希望将它们组合起来,并为这些线内的区域着色。图像绘制了大量的三维线和着色的区域内-这是我试图做的 我的数据如下所示: df <- structure(list(z = c(0, 0.06518, 0.08429, -0.01659, 0, 0.06808, 0.12383, -1, -0.01662, 0.28782, 0, -0.09539, 0.04255, 0.09539, -0.13361, -0.28782, -0.

我想画几个平面,每个平面都是一个不等式。绘制完所有平面后,我希望将它们组合起来,并为这些线内的区域着色。图像绘制了大量的三维线和着色的区域内-这是我试图做的

我的数据如下所示:

df <- structure(list(z = c(0, 0.06518, 0.08429, -0.01659, 0, 0.06808, 
0.12383, -1, -0.01662, 0.28782, 0, -0.09539, 0.04255, 0.09539, 
-0.13361, -0.28782, -0.14468, -0.19239, 0.10642), x = c(1, 0.02197, 
0.03503, -0.02494, 0, 0.04138, 0.17992, 0, -0.02482, 0.1122, 
0, 0.01511, 0.0011, -0.01511, -0.06699, -0.1122, -0.06876, 0.12078, 
0.10201), y = c(0, 0.08735, 0.09927, 0.03876, -1, 0.22114, -0.00152, 
0, 0.03811, -0.07335, 0, -0.03025, 0.07681, 0.03025, -0.23922, 
0.07335, -0.25362, -0.09879, 0.05804), value = c(5801L, 135L, 
162L, 109L, 4250L, 655L, 983L, 4500L, 108L, 1594L, 4400L, 540L, 
147L, 323L, 899L, 1023L, 938L, 1627L, 327L)), .Names = c("z", 
"x", "y", "value"), class = "data.frame", row.names = c(NA, -19L
))
所以,我想从每一行画一个平面。然后,我想合并所有这些平面,并填写线内的值。结果应该看起来像一个多面不相等的骰子。或者一颗丑陋的钻石

我一直在玩
rgl
persp
函数,但我甚至不知道从哪里开始。我对其他软件建议持开放态度

依靠
persp3d
中的一个示例:

x <- seq(-6000, 6000, by = 1)
z <- x 
y <- seq(-4000, 4000, by = 1)

f <- function(x, y) <- { r <- -x - y + value > z } # stuck here, can you handle an inequality here?
z <- outer(x, y, f)
open3d()
bg3d("white")
material3d(col = "black")
persp3d(x, y, z, col = "lightblue",
        xlab = "X", ylab = "Y", zlab = "z")

x您可以创建一个函数工厂,该工厂接受不等式的data.frame(
df
),并返回一个函数:

  • 取三个值(x、y、z)
  • 如果加载的任何不等式不成立,则返回false
  • 工厂:

    eval_gen <- function(a,b,c,d){
      force(a); force(b); force(c); force(d)
      check <- function(x,y,z){
        bool <- T
        for (i in 1:length(a)){
          bool <- bool && (a[i] * x + b[i] * y + c[i] * z < d[i])
        }
        return(bool)
      }
    }
    
    其中:


    利用一些矩阵乘法,您可以节省大量计算时间

    library(dplyr)
    library(geometry)
    library(rgl)
    
    # define point grid
    r <- 50   # resolution
    grid <- expand.grid(
      x = seq(-6000, 6000, by = r),
      y = seq(-4000, 4000, by = r),
      z = seq(-6000, 6000, by = r))  # data.table::CJ(x,y,z) if speed is a factor
    
    # get points satisfying every inequality
    toPlot <- df %>% 
      select(x, y, z) %>% 
      data.matrix %>% 
      `%*%`(t(grid)) %>%
      `<`(df$value) %>% 
      apply(2, all)
    
    ## Alternative way to get points (saves time avoiding apply)
    toPlot2 <-
      colSums(data.matrix(df[, c('x', 'y', 'z')]) %*% t(grid) < df$value) == nrow(df)
    
    库(dplyr)
    图书馆(几何)
    图书馆(rgl)
    #定义点栅格
    r%
    `%*%`(t(网格))%>%
    `% 
    适用(2,全部)
    ##获取积分的替代方法(节省时间避免应用)
    
    toPlot2表示“线”,你是指“平面”,对吗?如果你能用油漆画一个草图来显示图形的样子会更好。是的,我指的是平面。想象一下一颗丑陋的钻石。这就是它应该看起来的样子。@slickrickious:补充道。谢谢
    ueq_test <- eval_gen(df$x,df$y,df$z,df$value) #load the inequalities
    
    library(data.table)
    library(rgl)
    
    #Note, you can change the resolution by changing the `by` argument here, I've set to 100 to keep computation time and object size manageable
    
    lx <- lz <- seq(-6000, 6000, by = 100)
    ly <- seq(-4000, 4000, by = 100)
    df_pixels <- data.table(setNames(expand.grid(lx, ly, lz), c("x", "y", "z")))
    df_pixels[, Ind := 1:.N]
    df_pixels[, Equal := ueq_test(x,y,z), by = Ind]
    df_pixels[Equal == T, colour := "red"]
    
    with(df_pixels[Equal == T, ], plot3d(x=x, y=y, z=z, col= colour, type="p", size=5, 
                                         xlim = c(-6000,6000),
                                         ylim = c(-4000,4000),
                                         zlim = c(-6000,6000)
                                         ))
    
    library(dplyr)
    library(geometry)
    library(rgl)
    
    # define point grid
    r <- 50   # resolution
    grid <- expand.grid(
      x = seq(-6000, 6000, by = r),
      y = seq(-4000, 4000, by = r),
      z = seq(-6000, 6000, by = r))  # data.table::CJ(x,y,z) if speed is a factor
    
    # get points satisfying every inequality
    toPlot <- df %>% 
      select(x, y, z) %>% 
      data.matrix %>% 
      `%*%`(t(grid)) %>%
      `<`(df$value) %>% 
      apply(2, all)
    
    ## Alternative way to get points (saves time avoiding apply)
    toPlot2 <-
      colSums(data.matrix(df[, c('x', 'y', 'z')]) %*% t(grid) < df$value) == nrow(df)
    
    # get convex hull, print volume
    gridPoints <- grid[toPlot, ]
    hull <- convhulln(gridPoints, "FA")
    hull$vol
    #> 285767854167
    
    # plot (option 1: colors as in picture)
    apply(hull$hull, 1, function(i) gridPoints[i, ]) %>% 
      lapply(rgl.triangles, alpha = .8, color = gray.colors(5))
    
    ## plot (option 2: extract triangles first - much faster avoiding apply)
    triangles <- gridPoints[c(t(hull$hull)), ]
    rgl.triangles(triangles, alpha=0.8, color=gray.colors(3))