1

Tcl アレイは初めてです。私の質問は次のとおりです。

R1 と R2 の 2 つの行を持つ長方形のボックスがあります。これらの各行には、8 つの異なる値があります。これらの 16 個の値 (x 座標と y 座標) を、テキスト ファイルまたは proc からのリスト出力として返したいと考えています。dict を使用しない限り、Tcl proc は配列を出力できないという以前の投稿を読みました。それで、私の質問をよりよく理解できるように絵を描いてみます。

R1 x1y1 x2y2 ... x8,y8
R2 x9、y9 ... x16、y16

コマンドプロンプトまたは例としてダミー値を含むファイルでprocを実行したときに期待される出力

$> (1,2) (2,3) (3,4) ....... (7,8)
      (9,10) (10,11) ......... (15,16)

これが私が試したもので、必要な結果が得られています。ただし、これは 2 行にハードコーディングされています。行数を検出し、それに応じて行数を出力できるようにしたいと考えています。

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 に基づいてこのコードに実装する必要があるいくつかのロジック

proc を呼び出すコマンド

$> getPointList $rect_boundary $rowOffset $colOffset $rowIncr $colIncr

あなたの理解のために、特定の行の長方形の内側に 8 つの x、y ポイントがあります。x オフセットは、行の左または右の境界からの最初の x ポイントです。その後、すべてのポイントは、rowIncr と呼ばれる増分値で区切られます。列についても同様です。

期待される出力: これは上記のコードが行うことですが、2 つの行に対してハードコーディングされています。行と列が可変ならロジックを増やして実装したい。

$>  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)

等々 ...

4

3 に答える 3

0

ネストされたリストをどのように編成するかは、あなた次第です。最も単純な形式では、単一のリストを返します。

set result {x1 y1 x2 y2 ... x16 y16}

または、次の 2 つの行のリストを作成できます。

set result {
    {x1 y1 x2 y2 ... x8 y8}
    {x9 y9 x10 y10 ... x16 y16}
}

または、より複雑です: 各ペアはサブリストです:

set result {
    { {x1 y1} {x2 y2} ... }
    { {x9 y9} {x10 y10} ... }
}

この場合、配列を使用したくないと思います。参考までに、TCL の「配列」は、他の言語のハッシュに相当します。

于 2013-08-19T21:30:10.073 に答える