我需要定义一个对象(或区域),该对象在离散网格图上呈“斑点”形状。它看起来应该像这样:
其中红色区域表示中心点(这些只是想法,只要能随意改变,任何形状的形状都会起作用)。到目前为止,我的想法是将角度从起点(= 0度)迭代地增加到360度,并使用三角函数计算圆的外点(如果半径= 1 =常数,则将产生单位圆)。然后,我使用Bresenham的线算法(请记住:我们正在离散网格上移动)来计算连接圆心和我刚想到的外点的线。我的想法是,如果我可以稍微改变半径,则可以创建这些过时的形状。到目前为止,我想出的一切都给了我不错的形状,尽管它们并不是真正的“笨拙”。这是我的代码(请注意x0
和y0
标记了我的网格图的中心点,plotBresenham
只是将所有1s
放在区域中,以便可以可视化该网格图):
double radius = 10;
for(int alpha=0; alpha<360; alpha++) {
double x = cos(alpha*M_PI/180.0)*radius;
double y = sin(alpha*M_PI/180.0)*radius;
if(alpha<45) radius+=0.5;
else if(alpha<90) radius-=0.5;
else if(alpha<135) radius+=0.5;
else if(alpha<180) radius-=0.5;
else if(alpha<225) radius+=0.5;
else if(alpha<270) radius-=0.5;
else if(alpha<315) radius+=0.5;
else radius-=0.5;
plotBresenhamLine(x0,y0,x,y)
}
结果看起来像这样:
对不起,这幅画很粗。编程语言是C ++,但我认为这种方法实际上并不取决于所使用的语言。关于如何创建类似于我需要的形状的任何提示/帮助/指导?甚至是一个为您做这样的事情的框架?对我而言,拥有点的坐标并将其放入我的网格图中非常重要。
改变半径和角度是要走的路。但是,除了随机游走,您还可以使用具有预定振幅和相位的几个周期函数之和。这样可以保证
选择一个正弦或余弦函数,您可以将角度乘以整数并添加一个随机相位。按随机(预定)幅度缩放每个。添加一个大于所有幅度之和的常数。利润。
我不打算用C ++编写它,因为正如您所说,它不会对算法增加任何重要的意义。它可能像这样:
amps[N]
和phases[N]
。amps[i]
选择一个0到1 /(2N)之间的随机数,为每个phases[i]
选择一个0到2π之间的随机数。alpha
(以弧度为单位,计算)>radius = 1 + sum[i=0 to N-1] amps[i] * cos((i+1)*alpha + phases[i])
x = cos(alpha)*radius;
y = sin(alpha)*radius;
结果(来自Wolfram Mathematica):
为了使其更有趣,将第k
个幅度限制为k(或k + 1,因为我们从零开始索引)的负功率。这是在步骤3中,当N = 30时,随机数由pow(i+1,1.5)
代替2N的情况:对于一个过时的形状,metaballs的(有点密集)星座可能会产生漂亮的形状。