- 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/
padding:initial 比 padding:0 有什么优势吗?示例: textarea { padding: 0; } Hello, world! 最佳答案 它们的意思是一
我尝试通过按钮填充 JList,然后在先前填充的 Jlist 上使用 DoubleClick 填充 JTextField。 代码: private void extractUsedVariables
我正在尝试做 var width = ($(this).width() + $(this).css('padding-left') + $(this).css('padding-right' ));
我在导航中添加了悬停效果,遗憾的是悬停也影响了上面的文字。如何在不影响文本位置的情况下向导航添加悬停? 可悲的是,我找不到解决这个问题的方法。 HTML 模板:http://projects.help
我是 F# 初学者,下面代码中的 %-5s 和 %5s 有什么作用?我认为它提供了空间填充,但我不确定它是如何填充的? printfn "%-5s %5s" "a" "b" 当我尝试 prin
我需要选择带狗的用户(带 type 等于“狗”的宠物) var User = Waterline.Collection.extend({ identity: 'user', attribute
我一直在尝试让 Excel 在一组列上应用公式,然后将模式扩展到整个行集。 这导致了以下代码: For i = 0 To avgsheetNames.Count - 1 If Contains(CSt
随着 Flutter 2.0 的发布,FlatButton已被替换为 TextButton . 因此,填充属性不再直接可用,而是作为 ButtonStyle属性(property)。 我的问题是,我该
这似乎是一个简单的问题,但我已经尝试了一个小时,似乎无法弄清楚。 我要做的就是用 Canvas 填充 MainWindow。我找不到任何允许这样做的属性,我能想到的唯一方法是设置 Canvas.Wid
这是a website具有移动 View 。 网站宽度为 640 像素,但 iPhone 以 678 像素渲染文档。在 Android 中看起来很棒。 我添加了视口(viewport)元: 主体 C
我正在使用 GridBagLayout到(当前)显示两行。我知道这种布局对于这项任务来说太过分了,但我正在努力学习如何使用它。问题是我已将两个面板添加到两个单独的行中,并且内容周围存在巨大差距(请参见
我有以下代码已传递给我并创建多边形: var map; function initialize() { var myLatlng = new google.maps.LatLng(-36.4
我在 Jpanel 中有一些项目,然后将其推到顶部并用作基本搜索引擎的工具栏。我遇到一个问题,因为没有足够的空间,所以我的最后一个组合框没有显示。但是,左侧有很多空白空间,我需要移动所有内容来填充 J
我创建了带有阈值的二进制图像。如下图所示如何改变白色形状的颜色以使其可索引? 到目前为止,这是我的代码: void threshold() { cv::Mat src_8uc3_img = c
我有一个 JTable,我想知道是否有更好的方法来填充它,这是我的代码: //Metodo para llenar un jtable con datos de la base public stat
我想要做的是裁剪一个卷以删除所有不相关的数据。例如,假设我有一个 100x100x100 的体积,其中填充了 0,但其中的 50x50x50 体积则填充了 1。如何从原始体积中获得裁剪后的 50x50
因此,我正在创建一种对一组数字进行洗牌的方法,其想法是创建这些数字的总体。因此,我创建了一个循环,对数字进行洗牌,然后将其添加到数组列表中,但是经过一些调试语句后,我发现它确实对数字进行洗牌,但只将最
假设我有这两个类: public class A where T : IEntityWithID, new() { private static EntityInfo entityInfo =
我正在尝试添加用户输入的两个大整数作为字符串。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但它不起作用。因此,如果我输入 456 和 7,它会给出 3,前面有一些随机字符。感谢您的任何建议
这是我将内容打印到表格 View 的代码 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: Index
我是一名优秀的程序员,十分优秀!