3

是否有直接的方法在 R 中绘制非凸曲面?

我对凸面使用了类似下面的东西,它工作正常:

xyz <- cbind(y,x,z)
tbr <- t(surf.tri(xyz, delaunayn(xyz)))
rgl.triangles(xyz[tbr,1], xyz[tbr,2], xyz[tbr,3])

但是,对于非凸面,凹面区域会被填充。我认为这是该函数的问题,delaunayn()因为它使用不支持约束 Delaunay三角剖分或非凸对象的网格生成的Qhull库。

任何建议表示赞赏。

附言

我有一个 ascii 文件的数据,但它有 3 列,长 225 行。提供这个的最佳方式是什么?

数据可在: http: //pastebin.com/R2p4Cf7d

情节的顶部应该是凹的!persp3d()这是使用表面外观创建的图像。它是在极坐标中使用规则网格上的更多网格点来计算的,而不是使用不规则的搭配点。

正确渲染表面,但网格点更多。

4

2 回答 2

3

以下解决方案并不完美,但如果您有 Matlab 的副本,则可以使用。

library(rgl)
library(geometry)
# Read in data - also at: http://pastebin.com/R2p4Cf7d
simDat <- read.csv("testDat.csv")
#
x   <- simDat[,1];y<-simDat[,2];z<-simDat[,3]
xyz <- cbind(simDat[,1],simDat[,2],simDat[,3])
#
triNodes <- delaunayn(xyz)
tbr1     <- t(surf.tri(xyz, triNodes ))
# Plot data from R generated triangles
open3d()
rgl.triangles(xyz[tbr1,1], xyz[tbr1,2], xyz[tbr1,3])
#
# Import data generated by Matlab function delaunay()
#  - also at: http://pastebin.com/vQV2Zaii
nodeDat_ML <- read.csv("testDatNodes.csv")
triNodes2  <- cbind(nodeDat_ML[,1], nodeDat_ML[,2], nodeDat_ML[,3],1)
#
tbr2 <- t(surf.tri(xyz, triNodes2))
# Plot data from Matlab generated triangles
open3d()
rgl.triangles(xyz[tbr2,1], xyz[tbr2,2], xyz[tbr2,3])

该代码产生以下两个表面。左图基于 R 函数 delaunayn() 生成的三角剖分,右图基于 Matlab 函数 delaunay() 生成的三角剖分。

来自 R 和 Matlab 的绘图生成三角剖分

Matlab 生成的数据可在以下网址获得:http: //pastebin.com/vQV2Zaii

相关的 Matblab 代码是:

fname = 'testDat.csv';
tt = table2array(readtable(fname)); % get data
x =  tt(:,1);y = tt(:,2);z = tt(:,3);
tri = delaunay(x,y); % the triangulation data
trisurf(tri,x(:,1),y(:,1),z(:,1)); % surface plot

结果并不完全完美,因为最终图(右)有一个虚假的三角形。

我希望以上内容对遇到类似问题的人有用。

于 2014-07-09T12:30:24.807 回答
0

我觉得deldir::deldir()geometry::delaunayn()这种情况做得更好(作为对新功能的纪念rgl::plot3d.deldir())。(我使用了 OP 的数据。)

library(rgl); library(deldir)

dxyz <- deldir(xyz[,1], xyz[,2], z=xyz[,3])

open3d()
plot3d(dxyz, col=cm.colors(256)[cut(xyz[,3], 256)], alpha=0.9)  # there isn't a bottom
wire3d(as.mesh3d(dxyz), col="black")

在此处输入图像描述

于 2016-08-29T09:26:42.970 回答