首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用n维生成三维笛卡尔曲面坐标

用n维生成三维笛卡尔曲面坐标
EN

Stack Overflow用户
提问于 2019-07-19 01:51:58
回答 1查看 105关注 0票数 0

我已经实现了一些代码来生成一个使用指定尺寸的三维笛卡儿坐标曲面。然而,这是相当缓慢和一个非常低效率的方式来实现这一点。有人能帮我找到一个更好的方法来减少迭代次数吗?

代码语言:javascript
复制
library(rgl)
density <- 1

#test data 5 x 10 x 15 box
a <- seq(from = 1, to = 5, by = density)
b <- seq(from = 1, to = 10, by = density)
c <- seq(from = 1, to = 15, by = density)

#length of each dimension
aL <- length(a)
bL <- length(b)
cL <- length(c)

#data.frame to store 3D box
test = data.frame()

#calculate the indices for the nested for loop
inner <- bL * cL
outer <- aL * bL * cL
tracker <- 1:inner
tracker <- c(tracker, (outer - (inner) + 1):outer)
for(x in 1:(aL-2)) {
    for(i in 1:bL) {
        if(i == 1 || i == bL) {
            tracker <- c(tracker, (inner+1):(inner+cL))
        } else {
            tracker <- c(tracker, inner + 1)
            tracker <- c(tracker, inner + cL)
        }
        inner <- inner + cL
    }
}

#loops over all possible combinations and uses only the indices above
iter <- 1
for(x in a) {
    for(y in b) {
        for(z in c) {
            if(any(iter == tracker)) {
                test <- rbind(test, data.frame(x = x, y = y, z = z))
            }
            iter <- iter + 1
        }
    }
}

points3d(test)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-19 05:34:33

虽然有机会通过预先分配矢量和数据帧来加快速度,但你是否考虑过分别生成你表面的六个面,然后把它们粘在一起呢?

expand.grid函数简化了这一点:

代码语言:javascript
复制
faces_xy <- expand.grid(x = a, y = b, z = c(min(c), max(c)))
faces_xz <- expand.grid(x = a, y = c(min(b), max(b)), z = c)
faces_yz <- expand.grid(x = c(min(a), max(a)), y = b, z = c)
surface <- unique(rbind(faces_xy, faces_xz, faces_yz))

每个faces_变量都包含指定平面上的两个面。对unique的调用是消除人脸共享的边缘上的重复点。

我没有做过任何基准测试,也没有费心地分析每种方法的复杂性,但我预计这会大大加快速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57104563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档