R - 使用 rgl 绘制由平面描述的区域

2024-02-14

我想绘制一个多面体,它由以下不等式描述:

3*x+5*y+9*z<=500
4*x+5*z<=350
2*y+3*z<=150

x,y,z>=0

它是一个线性规划。目标函数为:

4*x+3*y+6*z

多面体是该程序的可行区域。 我能够将不等式绘制为平面,这应该描述多面体 (注意,这是我第一次尝试 rgl,所以代码有点乱。如果你想改进它,请随意这样做):

# setup
x <- seq(0,9,length=20)*seq(0,9,length=20)
y <- x
t <- x


f1 <- function(x,y){y=70-0.8*x}
z1 <- outer(x,y,f1)

f2 <- function(x,y){500/9-x/3-(5*y)/9}
z2 <- outer(x,y,f2)

f3 <- function(x,y){t=50-(2*y)/3}
z3 <- outer(x,y,f3)

# plot planes with rgl
uM = matrix(c(0.72428817, 0.03278469, -0.68134511, 0,
              -0.6786808, 0.0555667, -0.7267077, 0,
              0.01567543, 0.99948466, 0.05903265, 0,
              0, 0, 0, 1),
            4, 4)
library(rgl)
open3d(userMatrix = uM, windowRect = c(0, 0, 400, 400))
rgl.pop("lights")
light3d(diffuse='white',theta=0,phi=20) 
light3d(diffuse="gray10", specular="gray25")
rgl.light(theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", 
           diffuse = "#FFFFFF", specular = "#FFFFFF", x=30, y=30, z=40)
rgl.light(theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", 
          diffuse = "#FFFFFF", specular = "#FFFFFF", x=0, y=0, z=0)
bg3d("white")
material3d(col="white")
persp3d(x,y,z3,  
        xlim=c(0,100), ylim=c(0,100), zlim=c(0,100),
        xlab='x', ylab='y', zlab='z', 
        col='lightblue',
        ltheta=100, shade=0, ticktype = "simple")
surface3d(x, y, z2, col='orange', alpha=1)
surface3d(t, y, z1, col='pink', alpha=1, smooth=TRUE)

现在我想绘制由平面描述的区域

x,y,z>=0.

但我不知道该怎么做。我尝试这样做:

x <- seq(0,9,length=20)*seq(0,9,length=20)
y <- x
z <- x

f4 <- function(x,y,t){
  cond1 <- 3*x+5*y+9*z<=500
  cond2 <- 4*x+5*z<=350
  cond3 <- 2*y+3*z<=150

  ifelse(cond1, 3*x+5*y+9*z,
         ifelse(cond2, 4*x+5*z,
                ifelse(cond3, 2*y+3*z,0)))
}

f4(x,y,z)
z4 <- outer(x,y,z,f4) # ERROR

但这就是我被困住的地方。 external() 只为 2 个变量定义,但我有 3 个。我怎样才能从这里继续前进?


您可以通过一次相交 3 个平面来计算多面体的顶点 (由于其他不等式,一些交点位于多面体之外: 你也必须检查这些)。

获得顶点后,您可以尝试连接它们。 要识别哪些在边界上,您可以取线段的中间, 并检查是否有任何不等式满足作为等式。

# Write the inequalities as: planes %*% c(x,y,z,1) <= 0
planes <- matrix( c(
  3, 5, 9, -500,
  4, 0, 5, -350,
  0, 2, 3, -150,
  -1, 0, 0, 0,
  0, -1, 0, 0,
  0, 0, -1, 0
), nc = 4, byrow = TRUE )

# Compute the vertices
n <- nrow(planes)
vertices <- NULL
for( i in 1:n )
  for( j in 1:n)
    for( k in 1:n )
      if( i < j && j < k ) try( { 
        # Intersection of the planes i, j, k
        vertex <- solve(planes[c(i,j,k),-4], -planes[c(i,j,k),4] )
        # Check that it is indeed in the polyhedron
        if( all( planes %*% c(vertex,1) <= 1e-6 ) ) {
          print(vertex)
          vertices <- rbind( vertices, vertex )
        }
      } )

# For each pair of points, check if the segment is on the boundary, and draw it
library(rgl)
open3d()
m <- nrow(vertices)
for( i in 1:m )
  for( j in 1:m )
    if( i < j ) {
      # Middle of the segment
      p <- .5 * vertices[i,] + .5 * vertices[j,]
      # Check if it is at the intersection of two planes
      if( sum( abs( planes %*% c(p,1) ) < 1e-6 ) >= 2 )
        segments3d(vertices[c(i,j),])
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R - 使用 rgl 绘制由平面描述的区域 的相关文章

随机推荐

  • 一次推送两条路由时不会调用 RouteAware didPushNext

    当同时推送两条路线到Navigator并使用RouteAware获取时 更新了当前状态 第一个路由的 didPopNext 没有 叫 似乎调用了 RouteObserver didPush 将调用 didPushNext 对于调用 Firs
  • 将图像 2 重叠在图像 1 上

    我们在网站中显示 image1 如下 现在我们提供上传 image2 的选项 我们想要上传的 image2 应该与现有的 image1 重叠 例如here http www dailyobjects com custom cases app
  • ABAP中的求值顺序

    ABAP 是否有明确的评估顺序 例如 在表达式中foo bar 是否可以保证哪种方法foo and bar 首先评估 执行 在 ABAP 关键字文档中找不到此类信息 ABAP 文档 arith exp 算术运算符 https help sa
  • 在哪里可以下载所有聚合物元素的 zip 文件?

    Polymer 1 0 最近发布了 我可以在elements polymer project org https elements polymer project org 网站 但我找不到一个简单的链接来下载一个大 zip 文件中的所有内容
  • #define 与运算符一起使用[重复]

    这个问题在这里已经有答案了 我知道 define具有以下语法 define SYMBOL string例如 如果我写 define ALPHA 2 1 define BETA ALPHA 2 then ALPHA 1 but BETA 0
  • 我应该如何在类和应用程序层之间传递数据?

    例如 如果我正在创建一个 3 层应用程序 数据 业务 UI 并且数据层正在抓取单个或多个记录 在发送到业务层之前 是否将数据层中的所有内容转换为通用列表 集合 发送数据表可以吗 将信息发送回数据层怎么样 如果我使用对象 列表 这些成员是数据
  • iPhone:如何拖动或移动 UIImage/UIButton,如下所示?

    我不知道如何在我的应用程序中获得以下类型的功能 如上图所示 用户可以滑动 拖动 不同的图像部分 并可以组合图像 谁能告诉我这是哪一个控件 或者有什么教程吗 查看 MoveMe 示例应用程序 它将向您展示如何通过触摸和拖动来移动子视图 然后
  • FileLocator.resolve(url) 的转义结果

    方法FileLocator resolve url 可用于翻译地址bundleentry something somewhere x txt到正确的文件 URL mnt foo somewhere x txt 然而 这也记录在https b
  • MFC和ATL之间的根本区别是什么?

    假设我是only将它们用于 普通 GUI 程序 没有 COM 没有 ActiveX 没什么花哨的 我将看到 ATL 和 MFC 之间的根本区别是什么 以帮助我弄清楚使用哪一个 我在网上做了一些搜索 但最终没有一个答案真正回答了我的问题 ht
  • 当 MATLAB 找不到我要打开的文件时,阻止 MATLAB 创建新文件

    我经常尝试使用以下命令从 MATLAB 命令窗口打开现有的 MATLAB 文件 edit exampleFile 或者 我可以按cmd shift D并在编辑器中突出显示要打开的函数的名称 但是 如果在使用这两种方法时我希望打开的函数不在路
  • Python 中的埃拉托斯特尼筛法

    我正在尝试编写一个python函数来返回小于给定值的素数个数以及所有素数的值 我需要使用埃拉托斯特尼筛法算法 我相信我在函数中遗漏了一些东西 例如 当我想找到 100 以下的素数时 我得到的只是 2 3 5 7 我知道如果我不使用 平方根
  • Laravel 在 Trait 内重定向

    trait foo public function bar redirect not working use Traits class DonController extend Controller use Traits foo this
  • 如何反转 DataGridView 中的行

    我正在使用数据网格 但这些值没有按照我希望的方式显示 我当前的代码如下 我将如何反转行 string strOutput strLine Split int totalRows Convert ToInt16 strOutput 4 int
  • PHPUnit 中默认运行单个测试套件

    我的 PHPUnit 配置文件有两个测试套件 unit and system 当我运行测试运行程序时vendor bin phpunit 它运行两个套件中的所有测试 我可以通过以下方式定位单个套件testsuite flag vendor
  • 原则 2 紧密联系

    我将doctrine 2 PDO 与mysql 一起使用 对服务器进行压力测试时 mysql 报告大量中止连接 高达 20 我正在尝试找出问题所在 Mysql手册建议确保正确关闭与数据库的连接 http dev mysql com doc
  • 如何在循环中获取当前迭代器项的索引? [复制]

    这个问题在这里已经有答案了 如何获取Python当前项的索引iterator https docs python org 3 7 glossary html term iterator在循环中 例如当使用正则表达式时finditer返回迭代
  • 在javascript中将json对象写入文本文件

    我在 javascript 中有一个 JSON 对象 我想简单地将 JSON 对象写入文本文件 从我到目前为止遇到的事情来看 由于客户端的安全问题 不可能这样做 有解决方法吗 如果最初放置一些虚拟值 是否可以修改已存在的文件 Thanks
  • 如何通过操作base64代码来调整base64图像的大小或更改分辨率?

    有很多将图像编码为 Base64 的示例 有没有办法通过简单地操作实际的 Base64 编码内容来更改该图像的大小或分辨率 您的 base64 代码可能是 iVBORw0KGgoAAAANSUhEUgAAAWQAAAFjCAIAAACFfO
  • Microsoft Azure 媒体服务上的类似 Skype 的应用程序

    目前我正在研究一个类似 Skype 的应用程序的想法 例如 人们与其他人进行视频通话 现在我想运行这个微软Azure媒体服务 http azure microsoft com en us services media services 但是
  • R - 使用 rgl 绘制由平面描述的区域

    我想绘制一个多面体 它由以下不等式描述 3 x 5 y 9 z lt 500 4 x 5 z lt 350 2 y 3 z lt 150 x y z gt 0 它是一个线性规划 目标函数为 4 x 3 y 6 z 多面体是该程序的可行区域