1

我正在尝试在 J 中生成谢尔宾斯基三角形(混沌游戏版本)。在给定 3 个顶点的情况下,生成它的一般迭代算法是:

point = (0, 0)
loop:
    v = randomly pick one of the 3 vertices
    point = (point + v) / 2
    draw point

我正在尝试在 J 中创建惯用版本。到目前为止,这就是我所拥有的:

load 'plot'

numpoints =: 200000
verticesx =: 0         0.5     1
verticesy =: 0 , (2 o. 0.5) ,  0

rolls =: ?. numpoints$3

pointsx =: -:@+ /\. rolls { verticesx
pointsy =: -:@+ /\. rolls { verticesy

'point' plot pointsx ; pointsy

这行得通,但我不确定我是否理解-:@+ /\.. 我认为它只是因为数学上的怪癖才起作用。我试图制作一个二元函数,它可以像inaverage一样通过点列表作为累积运行,但我无法得到类似的东西。我该怎么做?++/ \ i. 10

更新:

需要明确的是,我正在尝试创建一个avg可以以这种方式使用的二进制函数:

avg /\ randompoints

avg =: -:@+由于某种原因,不适用于此。所以我认为我遇到的问题是正确定义具有avg适当可变性的函数。

4

1 回答 1

1

为了尽可能接近算法,我可能会做这样的事情:

v =: 3 2$ 0 0 0.5, (2 o. 0.5), 1 0
ps =: 1 2 $ (?3) { v
next =: 4 :'y,((?x){v) -:@+ ({: y)'

ps =: (3&next)^:20000 ps
'point' plot ({.;{:) |: ps

但你的版本效率更高

于 2012-11-13T12:02:09.680 回答