- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在优化光线追踪器时,我尝试使用 Morton 空间填充曲线改进交叉数据结构的数据局部性,但我的 3D 空间不是立方体(例如 512x512x256)。所有边都是 2 的幂,但并非所有边的长度都相同。
我一直无法找到边为 2 的幂的非正方形 Morton 曲线的任何示例。如果重要的话,我可以保证 x/y 轴的大小相同,只是 z 轴的长度不同。
请注意宽度是 2x 高度,但它也可以是 3x 或 4x 或任何其他。我一直无法找到执行此操作的方法。
理想情况下,解决方案会很快,因为 Morton 代码必须进行大量计算。所以我的问题是:如何为非立方空间生成空间填充莫顿曲线?这是专门针对 GPU (Cuda) 的。
维度上的条件是:
x, y, z 是二的幂
x == y
x, y >= z
或者如果更容易
x, y > z
最佳答案
它可能会因为 nz=11 而中断,但是对于 XY 正方形的一半大小它似乎对我有用
#include <cstdint>
#include <iostream>
static inline uint32_t spread(uint32_t x)
{
x = (x | (x << 10)) & 0x000F801F;
x = (x | (x << 4)) & 0x00E181C3;
x = (x | (x << 2)) & 0x03248649;
x = (x | (x << 2)) & 0x09249249;
return x;
}
static inline uint32_t morton(const uint32_t x, const uint32_t y, const uint32_t z)
{
return spread(x) << 0 | spread(y) << 1 | spread(z) << 2;
}
auto main() -> int {
int nx = 32;
int ny = 32;
int nz = 16;
for (int iz = 0; iz != nz; ++iz)
{
for (int iy = 0; iy != ny; ++iy)
{
for (int ix = 0; ix != nx; ++ix)
{
auto m = morton(ix, iy, iz);
std::cout << m << '\n';
}
}
}
return 0;
}
更新
如何使 Morton 代码适用于 256x256x64(8 位*8 位*6 位):您必须非等距离地展开 X 和 Y,同时考虑 Z 中的位数。基本上,对于立方体,您均匀地展开:位置上的每一位0, 3, 6, 9, 12, 15, 18, 21, 24,为正交轴上的其他两位留出空间。
所以立方体存在等距分布。但是对于从 Z 插入只有 6 位的情况,您必须有 6 个 3 的距离,但最后一个间隙没有 Z 位,因此 X 和 Y 扩展的最后一个间隙应该只有 1 位宽。因此,X 和 Y 的非等距分布。
沿线的东西:如果 Nx=Ny 是 XY 平面中的位数,并且 Nz!=Nx 或 Ny 是沿 Z 轴的位数,Nz 位的扩展间隙应为 2 位,剩余的间隙应为 1 位。因此有两个展开例程 - 一个用于具有非等距展开的 X&Y,现在取决于 Nz,另一个用于 Z 轴的展开函数。
好的,这是一个工作版本,似乎做对了
#include <cstdint>
#include <iostream>
#define func auto
func spreadZ(uint32_t v) -> uint32_t { // 2bit gap spread
v = (v | (v << 10)) & 0x000F801F;
v = (v | (v << 4)) & 0x00E181C3;
v = (v | (v << 2)) & 0x03248649;
v = (v | (v << 2)) & 0x09249249;
return v;
}
func spreadXY(const uint32_t v, const uint32_t bitsZ) -> uint32_t {
uint32_t mask_z = (1U << bitsZ) - 1U; // to mask bits which are going to have 2bit gap
uint32_t lo{ v & mask_z }; // lower part of the value where there are Z bits
lo = spreadZ(lo); // 2bit gap spread
uint32_t hi = v >> bitsZ; // high part of the value, 1bit gap
// 1bit gap spread
hi = (hi ^ (hi << 8)) & 0x00ff00ffU;
hi = (hi ^ (hi << 4)) & 0x0f0f0f0fU;
hi = (hi ^ (hi << 2)) & 0x33333333U;
hi = (hi ^ (hi << 1)) & 0x55555555U;
return lo + (hi << 3*bitsZ); // combine them all together
}
func morton(const uint32_t x, const uint32_t y, const uint32_t z, const uint32_t bitsZ) -> uint32_t {
return spreadXY(x, bitsZ) << 0 | spreadXY(y, bitsZ) << 1 | spreadZ(z) << 2;
}
func ispowerof2(const uint32_t n) -> bool {
return n && (!(n & (n - 1u)));
}
func bit_pos(const uint32_t n) -> uint32_t {
if (!ispowerof2(n))
throw -1;
uint32_t i{ 1u }, pos{ 1u };
while (!(i & n)) { // Iterate through bits of n till we find a set bit, i&n will be non-zero only when 'i' and 'n' have a same bit
i = i << 1; // unset current bit and set the next bit in 'i'
++pos; // increment position
}
return pos;
}
func main() -> int {
int nx = 256;
int ny = 256;
int nz = 256; //256...128...64...32...16...8...4...2...1 all works
int bitsZ = bit_pos(nz) - 1; // should be doing try/catch
for (int iz = 0; iz != nz; ++iz)
{
for (int iy = 0; iy != ny; ++iy)
{
for (int ix = 0; ix != nx; ++ix)
{
auto m = morton(ix, iy, iz, bitsZ);
std::cout << m << '\n';
}
}
}
return 0;
}
关于c++ - 非立方区域的 Morton 曲线是 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65313532/
我正在尝试创建 treasury yield curve 的图表比较两个不同日期的汇率。我很难将两条曲线组合起来并创建一个干净的图形。 我的问题:如何将两条 yield 曲线绘制在一起, yield
我在 R 平台中使用 randomForest 包进行分类任务。 rf_object<-randomForest(data_matrix, label_factor, cutoff=c(k,1-k))
我的设计师给我设计了这个设计,但我不知道如何最好地处理图像上方和下方的曲线。 我考虑过 clip-path 但不知道如何 flex 它。如果可以的话,我不想使用图像。 最佳答案 您可以使用 borde
我正在使用 Canvas 中的笔触和路径来制作两条线,我希望它们像波浪效果一样弯曲。而不是在 Photoshop 中创建实际图像来实现此目的。 谁能帮忙得到如下图所示的曲线? 我还想在末端实现圆 An
我正在尝试开发一种可以处理图像骨架的路径/曲线的代码。我想要一个来自两点之间骨架的点 vector 。 这段代码加了点就结束了,没找到解决办法。 #include "opencv2/highgui/
现在需要帮助。我可以用MKPolyline和MKPolylineView画线,但是如何在MKMapView上的两个坐标之间画弧线或曲线呢?非常感谢。 最佳答案 在回答问题之前,重要的是要提到 MKOv
我正在尝试应用 sklearn 的想法 ROC extension to multiclass到我的数据集。我的每类 ROC 曲线看起来都找到了一条直线,取消显示曲线波动的 sklearn 示例。 我
我有以下概念问题,我无法理解。 以下是调查数据示例,其中我有一个时间列,指示某人需要多长时间才能回答某个问题。 现在,我感兴趣的是清洁量将如何根据此阈值发生变化,即如果我增加阈值会发生什么,如果我降低
如何为使用视频的对象检测应用绘制每个窗口的误报率与未命中率(或误报概率)和 ROC(接收器操作曲线)的图表?如何确定误报和命中的数量?一个例子是很有用。 最佳答案 它很简单。将所有真正 (H0) 值存
我正在尝试绘制随机森林分类的 ROC 曲线。绘图有效,但我认为我绘制了错误的数据,因为生成的绘图只有一个点(准确性)。 这是我使用的代码: set.seed(55) data.controls <
我有如下两个模型: library(mlbench) data(Sonar) library(caret) set.seed(998) my_data <- Sonar fitControl <-
是否可以仅通过查看其 ROC 曲线来了解分类器是否过度拟合?我看到如果它的 AUC 太高(例如 98%)可能会过度拟合,但这也可能意味着分类器非常好。有没有办法区分这两种情况? 最佳答案 简短的回答:
我正在 JavaFX 中创建一个图形,它应该由有向边连接。最好是双三次曲线。有谁知道如何添加箭头? 箭头当然应该根据曲线的末端进行旋转。 这是一个没有箭头的简单示例: import javafx.ap
我需要对我正在尝试的技术进行一些说明。我正在尝试将一个实体从 A 点移动到 B 点,但我不希望该实体沿直线移动。 例如,如果实体位于 x: 0, y:0 并且我想到达点 x:50, y: 0,我希望实
我试图在曲线下方绘制阴影区域,但阴影区域位于曲线上方。谁能告诉我我的代码有什么问题? x=seq(0,30) y1=exp(-0.1*x) plot(x,y1,type="l",lwd=2,col="
我需要对我正在尝试的技术进行一些说明。我正在尝试将一个实体从 A 点移动到 B 点,但我不希望该实体沿直线移动。 例如,如果实体位于 x: 0, y:0 并且我想到达点 x:50, y: 0,我希望实
我有一个如下所示的模型: library(mlbench) data(Sonar) library(caret) set.seed(998) my_data <- Sonar fitControl <
有没有办法从pyspark中的Spark ML获取ROC曲线上的点?在文档中,我看到了一个 Scala 的例子,但不是 python:https://spark.apache.org/docs/2.1
我正在尝试使用Local Outlier Factor (LOF)算法,并想绘制 ROC 曲线。问题是,scikit-learn 提供的库不会为每个预测生成分数。 那么,有什么办法可以解决这个问题吗?
我目前正在使用 GDI+ 绘制折线图,并使用 Graphics.DrawCurve 来平滑线条。问题是曲线并不总是与我输入的点匹配,这使得曲线在某些点上超出了图形框架,如下所示(红色是 Graph
我是一名优秀的程序员,十分优秀!