您的 changeCenter proc 指示顶点集合是对 ( {{x1 y1} {x2 y2} ...}
) 的列表,但您返回的是平面列表:
proc changeCenter { vertices deltaX deltaY } {
set recentered [list]
foreach vertex $vertices {
lassign $vertex x y
lappend recentered [list [expr {$x + $deltaX}] [expr {$y + $deltaY}]]
}
return $recentered
}
如果顶点确实是一个平面列表 ( {x1 y1 x2 y2 ...}
),则一次读取列表 2 个元素:
proc changeCenter { vertices deltaX deltaY } {
set recentered [list]
foreach {x y} $vertices {
lappend recentered [expr {$x + $deltaX}] [expr {$y + $deltaY}]
}
return $recentered
}
我没有对其进行基准测试,但我怀疑就地更新顶点列表可能比附加到新列表更快:
proc changeCenter { vertices deltaX deltaY } {
for {set i 0} {$i < [llength $vertices]} {incr i} {
lset vertices $i 0 [expr {[lindex $vertices $i 0] + $deltaX}]
lset vertices $i 1 [expr {[lindex $vertices $i 1] + $deltaY}]
}
return $vertices
}
或者
proc changeCenter { vertices deltaX deltaY } {
for {set i 0} {$i < [llength $vertices]} {incr i 2} {
lset vertices $i [expr {[lindex $vertices $i] + $deltaX}]
set j [expr {$i + 1}]
lset vertices $j [expr {[lindex $vertices $j] + $deltaY}]
}
return $vertices
}
取决于上面提到的顶点列表的结构。
按名称传递顶点列表会更快(避免复制数据):
proc changeCenter { verticesName deltaX deltaY } {
upvar 1 $verticesName v
for {set i 0} {$i < [llength $v]} {incr i 2} {
lset v $i [expr {[lindex $v $i] + $deltaX}]
set j [expr {$i + 1}]
lset v $j [expr {[lindex $v $j] + $deltaY}]
}
# no need to return a value
}
并用变量名调用它:
changeCenter vertices 1 2