changeCenter プロシージャは、頂点コレクションがペアのリスト ( {{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