- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试栅格化并填充超球面。本质上,我有一个固定大小的 d 维网格和一个球体(中心,半径),想找出网格的哪些单元格与球体重叠并存储它们的坐标。
我知道 Midpoint circle algorithm它利用 8 路镜像并生成圆形的外部单元格(边界)。我还更改了链接的维基百科代码以填充圆圈(即,生成边框内所有单元格的坐标)。
但是我不知道任何更高维度的算法。例如在 4d 中,我一直在考虑通过生成所有可能的圆圈来实现,如下面的伪代码所示。基本思想是因为 4d 球体是 (x-x0) 2 + (y-y0)**2 + (z-z0)**2 + (k-k0)**2 = r 2,这等于 (x-x0) 2 + (y-y0)**2 = r 2 - (z-z0)**2 - (k-k0)**2。因为我知道如何画圆,所以我只需要为 z 和 k 的所有可能值生成所有圆。
assume center=(x0,y0,z0,k0) and radius r
for all dimensions equal or higher than 2://this is z and k
//make a list of possible values this dimension can take
//from z0 to z0+radius with a step of 1
all_lists.append([dim0,dim0+1,...,dim0+radius])
produce the product of all the lists in all_lists
//now i have a list [[z0,k0],[z0,k0+1],....,[z0+1,k0],[z0+1,k0+1],....,[z0+radius,k0],...[z0+radius,k0+radius]]
for every element l of the list, compute the radius of the circular "cut"
l.append(r**2 - z**2 - k**2)
Now call the Midpoint Circle Algorithm, but for every (x,y) pair that it produces, we need to export 4 points, namely (x,y,±z,±k)
最佳答案
一段时间没有人回答所以这里是我的简单而明显的 C++ 解决方案:
//---------------------------------------------------------------------------
const int N=10; // number of dimensions
struct point { double a[N]; }; // N-dimensional point
#define color DWORD // type of your color property
//---------------------------------------------------------------------------
// N x nested for(a=a0;a<=a1;a+=da) return false if ended
// it could be optimized a lot but for clarity I leave it as is
// ix=-1 at start and N = number of dimensions / nested count
bool nested_for(double *a0,double *a,double *a1,double *da,int &ix,int N)
{
if (ix<0)
{
int i;
if (N<1) return false; // N too low
for (i=0;i<N;i++) a[i]=a0[i];
for (i=0;i<N;i++) if (a[i]>a1[i]) return false; // a0>a1 for some i that is wrong !!!
ix=N-1;
return true;
}
for (;;) // a+=da
{
a[ix]+=da[ix];
if (a[ix]<=a1[ix]) break;
if (!ix) return false; // end of nested for
a[ix]=a0[ix];
ix--;
}
ix=N-1;
return true;
}
//---------------------------------------------------------------------------
void draw_point(point &p,color c)
{
// draw your point ...
}
//---------------------------------------------------------------------------
void fill_hypersphere(point &p0,double r,color c)
{
int i,ix;
bool init;
point a,b,a0,a1,da;
double aa,rr=r*r;
for (i=0;i<N;i++) a0.a[i]=-r; // loop boundary for all axises <-r,+r>
for (i=0;i<N;i++) a1.a[i]=+r;
for (i=0;i<N;i++) da.a[i]=1.0; // step between pixels
for (ix=-1;nested_for(a0.a,a.a,a1.a,da.a,ix,N);) // N x nested for
{
aa=0.0; // aa = distance from zero ^ 2
for (i=0;i<N;i++) aa+=a.a[i]*a.a[i];
if (aa<=rr) // if it is inside sphere
{ // compute the translated point by p0 to b
for (i=0;i<N;i++) b.a[i]=p0.a[i]+a.a[i];
draw_point(b,c); // and draw/fill it or whatever
}
}
}
//---------------------------------------------------------------------------
这是可以使用 ray castig 加速的蛮力,请参见:
XY
平面 (
z=0
) 用于 1D、2D、3D 和 4D 超球面。我不确定一维,但其余的都可以(不确定超空间是为一维定义的还是应该只是一个点)。
O(N!)
其中 N 是维数,运行时间是
c0*(N!)*r
哪里
c0
是常数时间,
r
是半径和
N
是维数。
(0,0,0,0)
和低多边形数量,所以它不是线框困惑):
<0,PI>
中最后一个是
<0,2*PI>
.这允许直接构建 n 球流形/网格。在我的引擎中,它看起来像这样:
//---------------------------------------------------------------------------
void ND_mesh::set_HyperSphere (int N,double r) // dimensions, radius
{
// ToDo
const int d1=12;
const int d2=d1+d1;
const double da1= M_PI/double(d1-1);
const double da2=2.0*M_PI/double(d2);
int i;
reset(N);
if (n==2)
{
int i0,i1;
int ia,ja;
double a;
pnt.add(0.0);
pnt.add(0.0);
for (ja=d2-1,ia=0,a=0.0;ia<d2;ja=ia,ia++,a+=da2)
{
pnt.add(cos(a));
pnt.add(sin(a));
i0=ja+1;
i1=ia+1;
s3(i0,i1,0);
}
}
if (n==3)
{
int i00,i01,i10,i11;
int ia,ib,ja,jb;
double a,b;
pnt.add(0.0);
pnt.add(0.0);
pnt.add(0.0);
for (ja=d1-1,ia=0,a=0.0;ia<d1;ja=ia,ia++,a+=da1)
for (jb=d2-1,ib=0,b=0.0;ib<d2;jb=ib,ib++,b+=da2)
{
pnt.add(cos(a));
pnt.add(sin(a)*cos(b));
pnt.add(sin(a)*sin(b));
i00=(ja*d2)+jb+1;
i01=(ja*d2)+ib+1;
i10=(ia*d2)+jb+1;
i11=(ia*d2)+ib+1;
s4(i00,i01,i11,0);
s4(i00,i11,i10,0);
}
}
if (n==4)
{
int i000,i001,i010,i011,i100,i101,i110,i111;
int ia,ib,ic,ja,jb,jc;
double a,b,c;
pnt.add(0.0);
pnt.add(0.0);
pnt.add(0.0);
pnt.add(0.0);
for (ja=d1-1,ia=0,a=0.0;ia<d1;ja=ia,ia++,a+=da1)
for (jb=d1-1,ib=0,b=0.0;ib<d1;jb=ib,ib++,b+=da1)
for (jc=d2-1,ic=0,c=0.0;ic<d2;jc=ic,ic++,c+=da2)
{
pnt.add(cos(a));
pnt.add(sin(a)*cos(b));
pnt.add(sin(a)*sin(b)*cos(c));
pnt.add(sin(a)*sin(b)*sin(c));
i000=(ja*d1*d2)+(jb*d2)+jc+1;
i001=(ja*d1*d2)+(jb*d2)+ic+1;
i010=(ja*d1*d2)+(ib*d2)+jc+1;
i011=(ja*d1*d2)+(ib*d2)+ic+1;
i100=(ia*d1*d2)+(jb*d2)+jc+1;
i101=(ia*d1*d2)+(jb*d2)+ic+1;
i110=(ia*d1*d2)+(ib*d2)+jc+1;
i111=(ia*d1*d2)+(ib*d2)+ic+1;
_cube(i000,i001,i010,i011,i100,i101,i110,i111);
}
}
for (i=0;i<pnt.num;i++) pnt.dat[i]*=r; // radius
}
//---------------------------------------------------------------------------
哪里
pnt[]
是点列表和
_cube
添加一个由 5 个四面体构成的立方体,覆盖其体积。如您所见,这会创建 2D 圆盘、3D 球和 4D 球体(不是全体积,只是流形相邻节点之间的层)“表面”。
关于geometry - 光栅化和填充超球面的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046106/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!