- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是给你的问题;)
我有一个用 1 和 0 填充的 3 维数组。 1 代表 3 维复杂多边形(不是简单多边形)。只有多边形的边界值为 1,内部填充为 0。现在问题来了:
我需要一个快速的算法来用 1 填充这些多边形。阵列通常具有大约的尺寸。 512x512x100。
提前致谢!
这是一个二维的例子:
0000111110000
0000100010000
0000100010000
0000111110000
应该导致
0000111110000
0000111110000
0000111110000
0000111110000
这是@Mikolas 算法的正确 3 维解决方案吗?
void scan_polygon(int frames, int rows, int cols, char data[][][], char result[][][]){
for(int f=0; f < frames; ++f)
for(int r=0; r<rows; ++r)
for(int s = 0, c=0; c<cols-1; ++c)
{
s ^= s ? ( data[f][r][c] && !data[f][r][c+1]) :
(!data[f][r][c] && data[f][r][c-1]);
result[f][r][c] = s;
}
for(int f=0; f < frames; ++f)
for(int c=0; c<cols; ++c)
for(int s = 0, r=0; r<rows-1; ++r)
{
s ^= s ? ( data[f][r][c] && !data[f][r+1][c]) :
(!data[f][r][c] && data[f][r-1][c]);
result[f][r][c] &= s;
}
最好的问候,
牛
最佳答案
如果您假设您的多边形是多边形的,则可以在单个 for 循环中完成。只需从左上角开始,并在越过边缘时跟踪奇偶校验。
一个简单的 2D 版本(添加了转置大小写):
void scan_polygon(int rows, int cols, char** data, char** result)
{
for(int r=0; r<rows; ++r)
for(int s = 0, c=0; c<cols-1; ++c)
{
s ^= s ? ( data[r][c] && !data[r][c+1]) :
(!data[r][c] && data[r][c-1]);
result[r][c] = s;
}
for(int c=0; c<cols; ++c)
for(int s = 0, r=0; r<rows-1; ++r)
{
s ^= s ? ( data[r][c] && !data[r+1][c]) :
(!data[r][c] && data[r-1][c]);
result[r][c] &= s;
}
}
如果你有一个悬垂的像素或沿扫描线突出的边缘,这可能会崩溃,例如:
00000000000000000000
00000000*11111111111 <--- Whoops!
000000*111*000000000
00000*11111*00000000
要解决此问题,您只需在转置数组上重复该过程,然后将所有结果加在一起。 Sud 等人已使用类似的方法在 GPU 上对网格进行体素化。它不是完美无缺的,因为您可以配置多个非流形顶点,其中来自它们的嘈杂锥体相交,但如果您可以保证不会发生(或者如果它很少发生),它就是其中之一我所知道的可快速获得结果的最简单方法。
编辑:修改后的解决方案,以展示如何在进行迭代后将数组重新组合在一起。
关于c++ - 3维多边形的洪水填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616161/
我有一个 3D 数组。在这个数组中,我想找到可以组合成更大元素的元素。矩形不能相互重叠。我最好先找到最大的矩形,但先到先得也不会错,尤其是在提高性能的情况下。 例如 1 0 0 0 1 0 0 0 0
这是使用 D3.js 和 topojson 的洪水 map 示例。 http://bl.ocks.org/cappelaere/6472064 https://gist.github.com/capp
首先声明一下,我不是 DevOp,所以我在 Linux 管理方面的经验有限。 我基本上遵循了这个操作方法 (https://cloud.google.com/monitoring/agent/inst
这不是出于黑客目的。我正在学习计算机科学,我只是好奇。 所以..当主机A向主机B发送TCP SYN时,主机B为接收缓冲区等分配空间,向主机A发送回SYNACK,主机A也分配这样的空间,然后向主机B发送
我正在使用这个插件 https://github.com/mozilla/rust-android-gradle ,这需要我添加 tasks.whenTaskAdded { task -> i
我是一名优秀的程序员,十分优秀!