如何有效地将体素空间聚类成尽可能少的相似、连续的块?

2024-03-16

我正在研究使用体素来表示大型(256x256x256 体素)战场以及服务器托管的多人游戏的可破坏地形的可行性。任何游戏一次只存在一个战场。然而,为了能够广播房间及其地形的变化,我试图找到一种算法,可以将体素分组为尽可能少的矩形块。

举一个简单的例子,如果关卡的下半部分完全充满一种类型的体素,上半部分充满另一种类型的体素,则关卡应分为两个块,一个代表关卡的下半部分,另一个代表关卡的下半部分。其他代表顶部。理想情况下,该算法应该能够实时运行,这样地形中的任何变形都可以在每帧的基础上进行计算并向客户端广播。这应该使客户端能够有效地渲染地形,而不必担心在客户端中重复地形破坏逻辑。

以下是我尝试过的方法以及我发现的问题。报告的块计数用于通过将超过 4,194,304 个“地球”体素随机放置到尽可能靠近底部的位置来填充 256^3 空间,以获取随机选择的 (x,z) 坐标。仅计算“EARTH”块。

  • 八叉树:非常快,但如果我在空间中间分裂,它会产生大量的块(800,000+)。
  • k-D 树分裂以最小化分裂后的加权熵:比八叉树稍慢,但块少得多(~350,000)。
  • k-D 树分裂以最大化信息增益比:比之前的 k-D 树方法快两倍,生成的块少得多(~167,000),但仍然很慢。
  • k-D 树分裂以最小化 Gower 相似度:非常慢,但生成的块比任何其他 k-D 树方法都要少(~155,000)。
  • 当将每个无人认领的“地球”块视为块的定义点时,贪婪地抓取可用的非相交的最大子集、最大体积块:即使是线程化的,该算法也慢得令人发指(在 8 核系统上使用 8 个线程大约需要 16 分钟) ,但它生成的块最少(
  • 贪婪地抓取不相交块的最大子集,同时将块的尺寸视为目标分数以最大化:比其他贪婪方法慢得多,并且还会生成数千个块。

考虑到最大可接受的块数是每个 (x,y) 坐标一个块来表示单个列,只有贪婪卷的结果才可以被认为接近最佳。

我不知道如何在不使用永无休止的强力方法的情况下计算最小块数,所以我不知道是否可以比贪婪体积方法做得更好。此外,我不知道如何才能让它更快。谁能给我一个算法来尝试或至少为我指明正确的方向?如果不能做得更好,我想用另一种方法来解决我的问题。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地将体素空间聚类成尽可能少的相似、连续的块? 的相关文章

  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • Spark 在 WholeTextFiles 上创建的分区少于 minPartitions 参数

    我有一个文件夹 里面有 14 个文件 我在一个集群上使用 10 个执行器运行 Spark Submit 该集群的资源管理器为 YARN 我创建了我的第一个 RDD 如下所示 JavaPairRDD
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 如何修复 TypeError: G 必须是 'd' 矩阵?

    目标 尝试通过优化过程运行玩具数据集 我遇到以下错误 TypeError Traceback most recent call last
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l

随机推荐

  • 如何显示加在一起等于零的行

    几周来一直在寻找解决方案 但一无所获 我有类似这样的数据表 client ref supplier key client amount 1111 GBP 10 1111 GBP 10 1111 EUR 50 2222 CHF 22 5 22
  • 画布内存使用总量超出最大限制 (Safari 12)

    我们正在研究一个可视化网络应用程序 https affinitymap epfl ch它使用 d3 force 在画布上绘制网络 但现在 iOS 上的浏览 器遇到了问题 在与界面进行几次交互后 进程就会崩溃 据我记得 这不是旧版本 iOS1
  • 未知的输入格式:'x11grab'

    guys 当我编译 ffmpeg 并在 linux 中运行 ffmpeg 时遇到问题 我的环境 1 ubuntu 17 10 x64 bit 我认为操作系统版本不是关键 2 gcc Ubuntu 6 3 0 19ubuntu1 6 3 0
  • 我的异步调用在 forEach 循环中填充列表之前返回

    我有一个例程 它从设备获取文件名列表 然后读取文件以构建列表 然而 调用例程总是返回零项 我打印文件名 所以我知道它们存在 但是 在我读取文件之前 异步似乎正在返回 我在进行 HTTP 调用时使用了类似的代码 但是 这里的某些事情导致例程返
  • 什么是 ./.local/share/Trash (Unix) [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用虚拟机来运行 Java Web 应用程序 操作系统是 XFCE Ubuntu 我使用命令找到了我想要的文件find name s
  • 奇怪的 GCC 错误:程序中出现杂散 '\NNN'

    我的开源库中出现了以下问题 我无法弄清楚发生了什么 我的两个用户有 GCC 编译器错误 如下所示 home someone Source src regex cpp 1 1 warning null character s ignored
  • 错误 ITMS - 90167 在包中找到的应用程序包数量

    在开始撰写有关该错误的文章之前 我正在 macOS Sierra 上运行并使用 Xcode 7 3 1 因此 我从我的应用程序创建一个存档 我验证该应用程序并通过验证 但在上传到应用程序商店时 我收到错误 错误 ITMS 90167 在包中
  • 从函数的签名中获取位置参数的名称

    使用 Python 3 x 我尝试从某个函数获取所有位置参数的名称 即 def foo a b c 1 return 现在我正在这样做 from inspect import signature empty args x for x p i
  • 使用 log4net 进行日志记录的最佳实践是什么?

    有人告诉我使用 log4net 将 日志记录 添加到我的代码中 问题是没有人可以及时旅行并查看日志记录需要用来解决哪些现实世界问题 因此 是否有一套关于记录哪些内容以获得合理的成本 收益权衡 所以 应该添加什么类型的日志记录 到一个有用的应
  • 更改 SweetAlert 上的图标图像大小

    我正在尝试更改 SweetAlert 上的图标图像大小 在 css 文件中我看到 sweet alert sa icon width 80px height 80px border 4px solid gray webkit border
  • 从 R Studio 中的 mclapply 打印

    我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出 但这似乎以某种方式被抑制 例如这里提到的 mclapply 是否保证按顺序返回其结果 https stackoverflow com questions 1469
  • 避免派生类 C++ 中的“纯虚函数调用”

    我对 C 相当陌生 所以如果这个问题的水平稍微低于这里的通常标准 我想道歉 我试图让几个类从具有虚拟函数定义的基类继承 然后我想创建一个 MainClass 数组 它可以包含所有派生类 以便输出派生 定义的虚拟功能 我收到错误 R6025
  • 检测 stdout 是否重定向到管道(而不是文件、字符设备、终端或套接字)?

    理想情况下 这可以在 shell 中编写脚本 但 Perl 或 Python 也可以 C 代码可能会有帮助 但可能不符合成本 效益 我认识到重定向到 FIFO 命名管道 可能与真实管道无法区分 这已经是我并不真正关心的边缘情况了 严格的 P
  • brew 安装 libusb 链接失败

    我正在安装libusb with brew在我的 Mac 中 酿造安装libusb 链接步骤失败 如下所示 Error The brew link step did not complete successfully The formula
  • API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物

    从 API 级别 9 开始 有android filterTouchesWhenObscured属性及对应setFilterTouchesWhenObscured方法上ViewGroup 例如 当视图有onClickListener设置并且
  • 从 XMLHttpRequest 中删除 HTTP 标头

    我正在开发一个 ajax 长轮询类型应用程序 我想最大限度地减少我使用的带宽量 目前最大的成本之一是客户端 HTTP 标头 一旦我建立了连接并在客户端上存储了会话 ID 我真的不想再浪费任何带宽来传输冗余的 http 信息 例如浏览器类型
  • 使用Java根据数据库中的最大ID生成下一个ID

    我正在开发一个网络应用程序 它将有多个用户 我使用mysql作为数据库 在我的应用程序中 我正在获取最新的id from the database using max id 然后为新注册生成下一个 id 这种方法是不正确的 因为 id 可能
  • Groupby 与 min 结合,同时保留整个数据帧[重复]

    这个问题在这里已经有答案了 我想结合 groupby 和 min 但保留整个数据框 如果我使用下面的方法 我最终只会得到 2 列 即 col1 和 col2 对于这个 df col1 col2 col3 1 1 A 1 0 B 2 2 C
  • 导入 BitTorrent Bencode 模块

    我使用的是 Mac OS X 10 6 Python 是 2 6 1 我已经安装了 Bencode 模块 sudo easy install BitTorrent bencode 它出现在站点包中 Library Python 2 6 si
  • 如何有效地将体素空间聚类成尽可能少的相似、连续的块?

    我正在研究使用体素来表示大型 256x256x256 体素 战场以及服务器托管的多人游戏的可破坏地形的可行性 任何游戏一次只存在一个战场 然而 为了能够广播房间及其地形的变化 我试图找到一种算法 可以将体素分组为尽可能少的矩形块 举一个简单