什么是龙曲线:
龙从一个简单的公理开始:FX
。然后使用以下规则将其扩展为更长的字符串:
X -> X+YF+
Y-> -FX-Y
导致这种行为/绘画
在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填充它,该角度随字符串从左向右读取而变化。遇到-
和+
会导致向右转或左转,分别调用left
或right
函数,遇到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%并行)。