在R中是否存在围绕XYZ线段创建3D圆柱体的函数?
用R给3D线段生成圆柱体的现成方案
嘿,好问题!在R里确实有现成的工具能帮你搞定3D线段转圆柱体的需求,不用像2D那样手动计算圆周点和坐标变换~
最推荐的工具:rgl包
rgl是R里做3D可视化与几何操作的主力军,它的cylinder3d()函数专门用来生成沿着任意3D线段的圆柱体,已经封装了所有你需要的方向计算、圆周点生成等复杂逻辑,完全适配你的数据集。
快速实现示例
拿你的数据集来演示,代码直观易懂:
library(rgl) # 生成你的数据集(加个seed让结果可复现) set.seed(123) x1 = y1 = z1 = x2 = y2 = z2 = runif(10,-1,1) radius = runif(10,0.1, 0.2) id = 1:10 data = data.frame(id, x1,y1,z1, x2,y2,z2, radius) # 打开3D交互窗口 open3d() # 遍历每个线段生成圆柱体 for(i in 1:nrow(data)){ # 提取当前线段的起点、终点和半径 start_point <- c(data$x1[i], data$y1[i], data$z1[i]) end_point <- c(data$x2[i], data$y2[i], data$z2[i]) cyl_radius <- data$radius[i] # 生成圆柱体:sides参数控制圆柱平滑度(值越大越圆) cylinder <- cylinder3d(rbind(start_point, end_point), radius = cyl_radius, sides = 20) # 绘制圆柱体,给每个圆柱随机上色区分 shade3d(cylinder, color = sample(c("red", "blue", "green", "orange"), 1)) } # 添加坐标轴和标题,方便观察 axes3d() title3d(xlab = "X轴", ylab = "Y轴", zlab = "Z轴")
提取圆柱体顶点数据(类似你的2D results)
如果你需要像2D场景那样获取圆柱体所有顶点的坐标(而非仅可视化),可以从生成的圆柱对象里直接提取:
# 以第一个圆柱为例 first_cyl <- cylinder3d(rbind(c(data$x1[1], data$y1[1], data$z1[1]), c(data$x2[1], data$y2[1], data$z2[1])), radius = data$radius[1], sides = 20) # 提取x/y/z坐标(转置后更符合数据框格式) cyl_vertices <- data.frame(t(first_cyl$vb[1:3,])) colnames(cyl_vertices) <- c("x", "y", "z") head(cyl_vertices)
其他可选工具
如果你的场景更偏向3D渲染,可以试试rayshader包的generate_cylinder()函数,但rgl在交互式3D操作与几何逻辑封装上更直接,更适配你的需求。
总的来说,rgl::cylinder3d()完全能替代手动写3D坐标转换的工作,省心又高效~
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

