是否有直接的方法在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()
的问题,因为它使用 Qhull 库,它不支持约束Delaunay 三角剖分或非凸对象的网格生成。
任何建议表示赞赏。
P.S。
我将数据作为ascii文件,但它有3列,长度为225行。提供此服务的最佳方式是什么?
可从以下网址获取数据:http://pastebin.com/R2p4Cf7d
情节的顶部应该是凹的!这是使用persp3d()
创建表面外观的图像。它是使用极坐标中的规则网格上的更多网格点计算的,而不是使用不规则的搭配点。
答案 0 :(得分: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()生成的三角剖分。
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
结果并不完全完美,因为最终的情节(右)有一个虚假的三角形。
我希望上述内容对任何有类似问题的人都有用。
答案 1 :(得分:0)
我认为deldir::deldir()
在这种情况下比geometry::delaunayn()
做得更好(作为新功能rgl::plot3d.deldir()
的纪念)。 (我使用了OP's Data。)
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")