我有一个以隔行扫描顺序绘制线条的程序(分形)。最初,给定H
行绘制,它确定帧数N
,并绘制每个N
帧,然后绘制每个N+1
'帧等。
例如,如果H = 10
和N = 3
,则按顺序绘制它们:
0, 3, 6, 9,
1, 4, 7,
2, 5, 8.
然而,我不喜欢乐队逐渐变厚的方式,在很长一段时间之间留下大片区域。因此,该方法被增强为递归绘制每组中的中点线而不是紧接的后续线,例如:
0, (32) # S (step size) = 32
8, (24) # S = 16
4, (12) # S = 8
2, 6, (10) # S = 4
1, 3, 5, 7, 9. # S = 2
(括号中的数字超出范围而未绘制。)算法非常简单:
Set S to a power of 2 greater than N*2, set F = 0.
While S > 1:
Draw frame F.
Set F = F + S.
If F >= H, then set S = S / 2; set F = S / 2.
当在最后一个步长上绘制奇数帧时,它们以简单的顺序绘制,就像初始(恼人)方法一样。每四个帧等都是一样的。它并没有那么糟糕,因为已经绘制了一些中间帧。
但是相同的排列可以递归地应用于每个步长的元素。在上面的示例中,最后一行将更改为:
1, # the 0th element, S' = 16
9, # 4th, S' = 8
5, # 2nd, S' = 4
3, 7. # 1st and 3rd, S' = 2
前面的行太少,导致递归生效。但是如果N
足够大,某些行可能需要多级递归。任何具有3个或更多相应元素的步长都可以递归排列。
问题1。 N
元素上的这种排列是否有一个通用名称,我可以用它来查找其他材料?我也对可能存在的任何类似例子感兴趣。如果我是第一个想要这样做的人,我会感到惊讶。
问题2。我可以用一些技巧来计算它吗?我在C工作,但我对此阶段的算法级别更感兴趣;我很高兴阅读其他语言的代码(在合理范围内)。
我还没有解决它的实施问题。我希望我首先预先计算排列(与前面方法的算法相反)。但我也很感兴趣,如果有一种简单的方法可以在不必预先计算的情况下绘制下一帧,类似于前一种方法的复杂性。
答案 0 :(得分:3)
听起来好像你正在尝试构建一维low-discrepancy sequences。您可以通过反转索引的二进制表示来计算您的排列。
def rev(num_bits, i):
j = 0
for k in xrange(num_bits):
j = (j << 1) | (i & 1)
i >>= 1
return j
使用示例:
>>> [rev(4,i) for i in xrange(16)]
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
适用于一般n的变体:
def rev(n, i):
j = 0
while n >= 2:
m = i & 1
if m:
j += (n + 1) >> 1
n = (n + 1 - m) >> 1
i >>= 1
return j
>>> [rev(10,i) for i in xrange(10)]
[0, 5, 3, 8, 2, 7, 4, 9, 1, 6]