LOGO 中的反射(几何变换)

Reflections (geometric transformations) in LOGO

LOGO可以做几何变换吗?

特别是水平反射是否可能?

开始于:

to ngon :n :s
  repeat :n [ fd :s lt 360/:n]
end

ngon 5 50

我想要一个能反映 y=0 行的命令,它的工作方式类似于

reflect ngon 5 50

并且会产生与

相同的结果
repeat 5 [ fd 50 rt 360/5]

嗯,您无法更改 ltrt 的行为。但也有一些选择。

选项 1

您可以编写自己的 ltrt 的可逆版本,并在您以前使用常规版本的过程中使用它们:

make "reversed 0

to lt1 :a
    ifelse :reversed [rt :a] [lt :a]
end

to rt1 :a
    ifelse :reversed [lt :a] [rt :a]
end

to reflect :fn
    make "reversed 1
    run :fn
    make "reversed 0
end

to ngon :n :s
    repeat :n [ fd :s lt1 360/:n]
end

ngon 5 50
reflect [ngon 5 50]

选项 2

您可以使用包装器将命令包装在您的过程中,包装器在根据需要交换 ltrt 后执行命令:

make "reversed 0

to reflect :fn
    make "reversed 1
    run :fn
    make "reversed 0
end

to replace_all :s :find :replace
   make "head first :s
   make "tail butfirst :s
   if (list? :head) [make "head (list replace_all :head :find :replace)]
   if (:head = :find) [make "head :replace]
   if (count :tail) = 0 [output :head]
   output (se :head replace_all :tail :find :replace) 
end

to wrapper :func
    if :reversed [
        make "func replace_all :func "lt "lt1
        make "func replace_all :func "rt "lt
        make "func replace_all :func "lt1 "rt
    ]
    run :func
end

to ngon :n :s
    wrapper [ repeat :n [ fd :s lt 360/:n] ]
end

ngon 5 50
reflect [ngon 5 50]

理想情况下,应该有一个 Logo 命令来获取现有过程的主体,然后我们可以动态地将包装器应用于过程的每一行,而无需修改过程定义本身。但是,我认为 Logo 中不存在这样的命令。

还值得注意的是,还有其他命令可以更改海龟的航向或 x 坐标。但我们可以想象类似于上面的代码也更新 sethxcorsetxpossetpos