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

问题描述 投票:2回答:2

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

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

}

结果看起来像这样:

enter image description here

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

c++ arrays 2d drawing shapes
2个回答
5
投票

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

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

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

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

  1. N,你想要的波数。
  2. 定义浮点数组amps[N]phases[N]
  3. 为每个amps[i]选择一个0到1 /(2N)之间的随机数,为每个phases[i]选择一个0到2π之间的随机数。
  4. 对于每个角度alpha(以弧度为单位,计算)>
  5. radius = 1 + sum[i=0 to N-1] amps[i] * cos((i+1)*alpha + phases[i])
    x = cos(alpha)*radius;
    y = sin(alpha)*radius;
    
  1. 继续进行。
  2. 结果(来自Wolfram Mathematica):

“”

为了使其更有趣,将第k

个幅度限制为k(或k + 1,因为我们从零开始索引)的负功率。这是在步骤3中,当N = 30时,随机数由pow(i+1,1.5)代替2N的情况:

“”


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.