gpt4 book ai didi

C++ 创建随机形状的 "blob"对象

转载 作者:行者123 更新时间:2023-11-30 02:16:29 24 4
gpt4 key购买 nike

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

红色区域表示中心点(这些只是想法,只要可以随机变化,任何 Blob 形状都可以)。到目前为止,我的想法是将角度从起点(= 0 度)迭代增加到 360 度,并使用三角函数计算圆的外点(如果半径 = 1 = const,这将导致单位圆)。然后我使用 Bresenham 的线算法(记住:我们在离散网格上移动)来计算连接圆心和我刚想出的外点的线。我的想法是,如果我可以稍微改变半径,就可以创建这些 Blob 形状。到目前为止我想出的东西给了我漂亮的形状,但它们并不是真正的“ Blob ”。这是我的代码(注意 x0y0 标记我的网格图的中心点,plotBresenham 只是把所有的 1在区域中,以便可以可视化网格图):

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++,但我认为这种方法并不真正取决于所使用的语言。关于如何创建更像我需要的形状的任何提示/帮助/指导?或者甚至是一个为你做这样的事情的框架?对我来说,重要的是要有点的坐标,把它们放到我的网格图中。

最佳答案

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

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

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

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

  1. 取 N,您想要的波数。
  2. 定义 float 组 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 = sin(alpha)*radius;
  1. 像以前一样继续。

结果(来自 Wolfram Mathematica):

为了让它更有趣,将第 k 振幅限制为 k(或 k+1,因为我们是从零开始索引的)。这是在步骤 3 中将随机数除以 pow(i+1,1.5) 而不是 2N,N = 30:

关于C++ 创建随机形状的 "blob"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54828017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com