I need to define an object (or a region) that is kind of "blob" shaped on a discrete gridmap. It should look something like this:
其中红色区域表示中心点(这些只是想法,任何斑点形状都可以,只要它可以随机变化)。到目前为止,我的想法是迭代地将角度从起点(= 0 度)增加到 360 度,并使用三角学来计算圆的外点(如果半径 = 1 = const,则将得到单位圆)。然后,我使用 Bresenham 的直线算法(记住:我们正在离散网格上移动)来计算连接圆心和我刚刚想出的外点的直线。我的想法是,如果我可以稍微改变半径,我就可以创建这些斑点形状。到目前为止,我所想到的给了我很好的形状,但它们并不是真正的“斑点”。这是我的代码(请注意x0
and 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++,但我认为该方法并不真正取决于所使用的语言。关于如何创建类似于我需要的形状的任何提示/帮助/指导?或者甚至是一个为你做这样的事情的框架?对我来说,重要的是获得其中点的坐标,将它们放入我的网格图中。
随着角度改变半径是可行的方法。但是,您可以使用具有预定幅度和相位的多个周期函数的总和来代替随机游走。这保证了
- 旋转360°后半径会恢复到原来的值,
- 您可以轻松控制遇到的半径范围。 (您需要避免小于零)。
选择一个正弦或余弦函数,将角度乘以整数并添加随机相位。按随机(预定)幅度缩放每个值。添加一个大于所有振幅之和的常数。利润。
我不会用 C++ 编写此代码,因为正如您所说,它不会为算法添加任何重要内容。它可能是这样的:
- 取 N,即您想要的波数。
- 定义浮点数组
amps[N]
and phases[N]
.
- 为每个选择一个 0 到 1/(2N) 之间的随机数
amps[i]
每个都在 0 到 2π 之间phases[i]
.
- 对于每个角度
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-th 振幅的某个负幂k (or of k+1,因为我们从零开始索引)。这是随机数除以而不是 2N 的情况pow(i+1,1.5)
在步骤 3 中,对于 N = 30:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)