根据Dragon曲线字符串并行计算2X2数组值-OpenCL

时间:2018-08-09 18:22:27

标签: opencl pyopencl l-systems

什么是龙曲线: 龙从一个简单的公理开始:FX。然后使用以下规则将其扩展为更长的字符串:

X -> X+YF+
Y-> -FX-Y

导致这种行为/绘画

enter image description here

在OpenCL上并行计算这些字符串扩展非常容易,因为很容易看到确定性模式:

FX
FX+YF+
FX+YF++-FX-YF+
FX+YF++-FX-YF++-FX+YF+--FX-YF+
FX+YF++-FX-YF++-FX+YF+--FX-YF++-FX+YF++-FX-YF+--FX+YF+--FX-YF+
^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^^^
  A*      B       A       B       A       B       A       B

A & B模式很容易在OpenCL上并行计算为一维问题。 但是,一旦有了扩展的字符串,说FX+YF++-FX-YF++-FX+YF+--FX-YF++-FX+YF++-FX-YF+--FX+YF+--FX-YF+(4个扩展),您将想出一条实际绘制的龙曲线。这是通过使用以下规则用X,Y坐标值填充2X2数组来完成的:

for c in expandedString:
  if c == "F":
        turtles.forward(10)
  elif c == "-":
        turtles.left(90)
  elif c == "+":
        turtles.right(90)

向右,向左和向前的功能定义:

def forward(n):
     global angle
     global x
     global y

     if n != 0:
        draw()

        if angle == 0:
            y -= 1

        elif angle == 90:
            x += 1        
        elif angle == 180:
            y += 1        
        elif angle == 270:
            x -= 1       
        else:
            print "angle:"
            print angle
            sys.exit("Invalid angle!")

        forward(n - 1)

def left(a):
    global angle
    angle = ((angle - a) + 360) % 360


def right(a):
    global angle
    angle = ((angle + a) + 360) % 360

canvas = numpy.zeros(shape=(50000, 50000)).astype('uint8')
def draw():   
        canvas[x, y] = 255

注意:这些规则在python中。

Canvas是一个2X2的numpy数组,函数forward根据全局角度使用函数draw用值255填充它,该角度随字符串从左向右读取而变化。遇到-+会导致向右转或左转,分别调用leftright函数,遇到F会填满画布2X2的十个位置值为255的数组。任何其他未填充的插槽都包含值0。

到目前为止,我已经确定的是,我们仅在遇到F时才填充数组。这发生在扩展字符串-> FX+YF++-FX-YF++-FX+YF+--FX-YF++-FX+YF++-FX-YF+--FX+YF+--FX-YF+的每四个步骤中。计算遇到F的角度也有一个模式。当全局角度为180度或0度且X保持恒定并且Y根据规则(请参见上文)上升或下降时,会遇到每个奇数F(从第一个F开始为0)。甚至在角度270或F处遇到F,并且X向上或向下而Y保持不变但是,将准确值预测为even Fs的180/0或{{1 此外,预测画布将在哪个X和Y坐标值处遇到F是一个谜,这可能与第一个问题有关。

我认为某处有解决方案,我需要它:)。或来自OpenCL爱好者的任何想法,因为我可能完全错误地解决了这个问题。我知道这是一个二维问题,但是如果可以在OpenCL上并行化则是一个谜。顺序处理非常简单,但是我需要并行处理(不必是100%并行)。

0 个答案:

没有答案