在R中使用RGL绘制3D线段

3

我在使用rgl三维图形包的应用程序时遇到了一些问题。

我正在尝试绘制一些线段。我的数据排列在一个名为“markers”的数据框中,有六列,分别对应起始x,y和z值以及结束x,y和z值。

startX  startY startZ endX   endY    endZ
69.345  45.732     20  115 39.072 1.92413
80.270  38.480     30  175 44.548 0.36777
99.590  33.596     20  175 35.224 0.06929
32.120  41.218     20  115 39.294 2.81424
11.775  37.000     30  175 35.890 1.38047
76.820  44.104     22  115 44.992 4.14674
85.790  23.384     18  115 36.112 0.40508
80.040  17.464     20  175 31.080 2.59038
103.615 38.850     22  115 39.220 3.18201
41.200  31.006     30  175 36.260 3.48049
88.665  43.956     30  115 39.738 0.50635
109.365 23.976     20  175 33.374 3.99750

这应该很简单。只需将这些值传递给segment3d()命令,我应该得到想要的图。但是我无法弄清楚如何正确地将相应的起始和结束对传递到segment3d()中。
我尝试了几乎所有可能的方法($符号、索引、连接、使用循环、apply和sapply等),甚至阅读了文档。文档很好,它说对于参数x、y和z:“任何合理的定义坐标的方式都可以接受。” 唉...它确实提到了xyz.coords实用程序。
所以我查阅了那份文件。我认为我理解了它的作用; 我甚至可以使用它来标准化我的数据,例如。
starts <- xyz.coords(markers$startX, markers$startY, markers$startZ)

ends <- xyz.coords(markers$endX, markers$endY, markers$endZ)

但我仍然不确定该如何处理这两个列表。
segments3d(starts, ends)
segments3d(starts + ends) 
segments3d((starts, ends), (starts, ends), (starts, ends))
segments3d(c(starts, ends), c(starts, ends), c(starts, ends))
segments3d(c(starts$x, ends$x), c(starts$y, ends$y), c(starts$z, ends$z))

我知道为什么上面的方法不起作用。我现在只是试图尝试各种方法,因为这让我感到非常愚蠢,好像有些显而易见的东西——我意思是极其显然的——我错过了。
我在 rgl 文档中查找示例,唯一一个使用 segment3d() 的地方与我尝试做的事情有些类似,他们使用了我之前尝试过的 '+' 符号。基本上,他们构建了两个矩阵并将第二个矩阵加到第一个矩阵中。
2个回答

7

类似这样的东西应该可以工作。

library(rgl)
open3d(scale=c(1/5,1,1))
segments3d(x=as.vector(t(markers[,c(1,4)])),
           y=as.vector(t(markers[,c(2,5)])),
           z=as.vector(t(markers[,c(3,6)])))
axes3d()
title3d(xlab="X",ylab="Y",zlab="Z")

enter image description here

问题在于segments3d(...)需要将x(以及y和z)值成对输入。因此,第1-2行是第一个线段,第3-4行是第二个线段,以此类推。您需要进行交替排序,例如$startx$endx等。上面的代码已经实现了这一点。


太好了。我尝试使用transform(t)做了一些事情,但从未想过转换为as.vector。但这样就完成了。为了完整起见,如果有人有一个优雅的解决方案,在xyz.coords之后使用变换,我很乐意看到它以便完整/学习。 - noLongerRandom

0
创建数据集的代码:
markers <- data.frame(startX = c(69.345, 80.270, 99.590, 32.120, 11.775, 76.820, 85.790, 80.040, 103.615, 41.200, 88.665, 109.365), startY = c(45.732, 38.480, 33.596, 41.218, 37.000, 44.104, 23.384, 17.464, 38.850, 31.006, 43.956, 23.976), startZ = c(20, 30, 20, 20, 30, 22, 18, 20, 22, 30, 30, 20), endX = c(115, 175, 175, 115, 175, 115, 115, 175, 115, 175, 115, 175), endY = c(39.072, 44.548, 35.224, 39.294, 35.890, 44.992, 36.112, 31.080, 39.220, 36.260, 39.738, 33.374), endZ = c(1.92413, 0.36777, 0.06929, 2.81424, 1.38047, 4.14674, 0.40508, 2.59038, 3.18201, 3.48049, 0.50635, 3.99750))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接