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