C ++创建随机形状的“斑点”对象

时间:2019-02-22 13:17:18

标签: c++ arrays 2d drawing shapes

我需要定义一个对象(或区域),该对象在离散网格图上呈“斑点”形状。它看起来应该像这样:enter image description here

红色区域代表中心点(这些只是想法,只要形状可以随机变化,任何形状都是可以的)。到目前为止,我的想法是将角度从起点(= 0度)迭代地增加到360度,并使用三角函数计算圆的外点(如果半径= 1 =常数,则将产生单位圆)。然后,我使用Bresenham的直线算法(请记住:我们正在离散网格上移动)来计算连接圆心和我刚想到的外点的直线。我的想法是,如果我可以稍微改变半径,则可以创建这些过时的形状。到目前为止,我想出的一切都给了我不错的形状,尽管它们并不是真正的“笨拙”。这是我的代码(请注意x0y0标记了我的网格图的中心点,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)

}

结果如下:

enter image description here

对不起,我的想法是粗糙的。编程语言是C ++,但我认为这种方法实际上并不取决于所使用的语言。关于如何创建类似于我需要的形状的任何提示/帮助/指导?甚至是一个为您做这样的事情的框架?对我而言,拥有点的坐标并将其放入我的网格图中非常重要。

2 个答案:

答案 0 :(得分:2)

改变半径和角度是正确的方法。但是,除了随机游走,您还可以使用具有预定振幅和相位的几个周期函数的总和。这样可以保证

  1. 旋转360°后,半径将恢复为原始值
  2. 您可以轻松控制遇到的半径范围。 (您需要避免小于零)。

选择一个正弦或余弦函数,将角度乘以整数并添加一个随机相位。按随机(预定)幅度缩放每个。添加一个大于所有幅度之和的常数。利润。

我不会用C ++编写它,因为正如您所说,它不会对算法增加任何重要的内容。可能是这样的:

  1. 以N为代表的波数。
  2. 定义浮点数组amps[N]phases[N]
  3. 为每个amps[i]选择一个介于0和1 /(2N)之间的随机数,为每个phases[i]选择一个介于0和2π之间的随机数。
  4. 对于每个角度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;
  1. 继续进行。

结果(来自Wolfram Mathematica):

为使它更有趣,请将第 k 个幅度限制为 k (或 k +1,因为我们是从零开始索引)。在这种情况下,当N = 30时,在步骤3中将随机数除以pow(i+1,1.5),而不是2N:

答案 1 :(得分:0)

对于过大的形状,metaballs的(有点密集)星座可能会产生漂亮的形状。