mas*_*sel 4 c++ arrays drawing 2d shapes
我需要定义一个对象(或一个区域),它是一种在离散网格图上形状的“斑点”。它应该是这样的:
其中红色区域表示中心点(这些只是想法,只要可以随机变化,任何斑点形状都可以)。到目前为止,我的想法是迭代地将角度从起点(= 0 度)增加到 360 度,并使用三角学来计算圆的外点(如果半径 = 1 = 常量,这将导致单位圆)。然后我使用 Bresenham 的线算法(记住:我们在离散网格上移动)来计算连接圆心和我刚想出的外点的线。我的想法是,如果我可以稍微改变半径,我可以创建这些斑点形状。到目前为止我想出的形状给了我很好的形状,但它们并不是真正的“斑点”。这是我的代码(注意x0并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)
}
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
抱歉画的粗糙。编程语言是 C++,但我认为这种方法并不真正取决于所使用的语言。关于如何创建与我需要的形状相似的形状的任何提示/帮助/指导?或者甚至是一个为你做这样的事情的框架?对我来说,将点的坐标放入我的网格图中很重要。
随角度改变半径是可行的方法。但是,您可以使用具有预定幅度和相位的多个周期函数的总和来代替随机游走。这保证了
选择一个正弦或余弦函数,将角度乘以一个整数并添加一个随机相位。按随机(预先确定的)幅度缩放每个。添加一个大于所有振幅总和的常数。利润。
我不会用 C++ 写这个,因为正如你所说,它不会为算法添加任何重要的东西。它可能是这样的:
amps[N]和phases[N].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;
Run Code Online (Sandbox Code Playgroud)
结果(来自 Wolfram Mathematica):

为了使它有点更有趣,限制ķ个幅度由一些负面力量ķ(或ķ +1,因为我们是从零索引)。这是pow(i+1,1.5)在第 3 步中除以随机数而不是 2N 时,N = 30:
