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]
嗯,您无法更改 lt
和 rt
的行为。但也有一些选择。
选项 1
您可以编写自己的 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
等
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
和 rt
的行为。但也有一些选择。
选项 1
您可以编写自己的 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
等