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]
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]
好吧,你不能改变lt
and的行为rt
。但是有一些选择。
选项1
您可以编写自己的 and 的可逆版本,lt
并rt
在您之前使用常规版本的过程中使用它们:
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
等。