1

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]
4

1 回答 1

1

好吧,你不能改变ltand的行为rt。但是有一些选择。

选项1

您可以编写自己的 and 的可逆版本,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

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

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 坐标。但我们可以想象类似于上面的代码也会更新seth, xcor, setx, pos,setpos等。

于 2020-03-18T02:09:55.503 回答