Я новичок в массивах Tcl. У меня следующий вопрос.
У меня есть прямоугольник с двумя рядами R1 и R2. Каждая из этих строк имеет 8 различных значений. Я хочу вернуть эти 16 значений (координаты x и y) либо в текстовом файле, либо в виде вывода списка из процедуры. Я читал несколько предыдущих сообщений о том, что Tcl proc не может выводить массив, если мы не используем dict. Итак, я попытаюсь нарисовать картинку, чтобы вы могли лучше понять мой вопрос.
R1 x1y1 x2y2 ... x8,y8 R2 x9,y9 ... x16, y16
Ожидаемый результат, когда я запускаю процедуру либо в командной строке, либо в файле с фиктивными значениями в качестве примера
$> (1,2) (2,3) (3,4) ....... (7,8) (9,10) (10,11) ......... (15,16)
Это то, что я пробовал, и я получаю те результаты, которые мне нужны. Но это жестко запрограммировано для двух строк. Я хочу, чтобы он мог определять, сколько строк там, а затем соответственно выводить количество строк.
proc getPointList {rect_boundary rowOffset colOffset rowIncr colIncr } {
set cordlist $rect_boundary
set xl [lindex $cordlist 0]
set yl [lindex $cordlist 1]
set xh [lindex $cordlist 2]
set yh [lindex $cordlist 3]
set list "" ;
for {set y [expr {$yh - $colOffset}]} {$y >= [expr {$yl + $colOffset}]} { incr y $colIncr } {
for {set x [expr {$xl + $rowOffset}]} {$x <= [expr {$xh - $rowOffset}]} { incr x $rowIncr } {
set list "$list $x $y" ;
puts "Value of x is: $x"; puts "\t Value of y is: $y" ;
}
}
return $list
}
set rect_boundary {10 15 100 40} # xl yl xh yh
set rowOffset 5
set colOffset 5
set rowIncr 10
set colIncr 15
Некоторая логика, которую мне нужно реализовать в этом коде на основе yh-yl и xh-xl, чтобы вычислить высоту и ширину прямоугольника и, соответственно, выходные строки
Команда для вызова процедуры
$> getPointList $rect_boundary $rowOffset $colOffset $rowIncr $colIncr
Просто для вашего понимания внутри прямоугольника в определенной строке есть восемь точек x, y. Смещение по x - это первая точка x в строке от левой или правой границы, после чего все точки разделяются значением приращения, которое я называю rowIncr. То же самое верно и для столбца.
Ожидаемый результат: это то, что делает приведенный выше код, но он жестко запрограммирован для двух строк. Я хочу увеличить и реализовать логику, если строки и столбец являются переменными.
$> R1: (15 40) (25 40) (35 40) (45 40) (55 40) (65 40) (75 40) (85 40) (95 40)
R2: (15 15) (25 15) (35 15) (45 15) (55 15) (65 15) (75 15) (85 15) (95 15)
Прямоугольное изображение для большей четкости, поскольку эта штука не позволяет мне обновлять изображения
__________________________________________________________________________ (100,40)
| |- 5 |
| . . . . . . . . |
| |- 15 |
|-5-. . --10---. . . . . . |
| |
|_________________________________________________________________________|
(10,15)
Для Джерри:
Case1 rowIncr 10 colIncr 20
__________________________________________________________________________ (80,40)
| |- 5 |
| . . . . . . . . |
| |- 20 |
|-5-. . --10---. . . . . . |
| |
|_________________________________________________________________________|
(10,10)
Case2 rowIncr 20 colIncr 35
_________________________________________________ (100,70)
| |- 5 |
| . . . . . |
| |- 35 |
|-5-. . --20---. . . |
| | |-5 |
|________________________________________________|
(10,25)
и так далее ...