目次

図形表示

 移動Vectorを表示しなければ、ロボットの動きが見えません。

 そこで、3頂点のVectorを表示後、合成Vectorでロボット
 がどちらに、どれほどのスピードで動くかを表示します。

 Tcl/Tkでは、図形表示はCanvas上に限定されています。


3頂点のVector表示

 3頂点は、Top、Left、Rightで正3角形に配置されています。  正3角形の重心まで、各頂点のVectorを移動して表示。  TopのVectorをX,Y成分に分割して計算します。  Topでは、Y成分だけなので、X成分は0とします。 set xt 0 set yt $topPWM  LeftのVectorをX,Y成分に分割して計算します。 Leftは、TopのVectorと60°右に傾いているので  X成分、Y成分に係数を乗算。 set xl [expr $leftPWM * (0.5)] set yl [expr $leftPWM * (sqrt(3) / 2)]  RightのVectorをX,Y成分に分割して計算します。 Rightは、TopのVectorと60°左に傾いているので  X成分、Y成分に係数を乗算。 set xr [expr $rightPWM * (-0.5)] set yr [expr $rightPWM * (sqrt(3) / 2)]  ここまでで、正3角形の重心を原点にした、各頂点の  Vectorを算出できました。  Canvas上に表示するので、幅と高さを考えて、正3角形の重心  を決めなければなりません。  Canvasは、以下のように定義してあります。  canvas .canOrg -width 200 -height 200 -bg gray  幅が200、高さが200の正方形領域なので、(100,100)を  重心に設定。  原点から(100,100)に重心を移動したときは、各頂点の成分を  平行移動します。 set xt [expr $xt + 100] ; set yt [expr 100 - $yt] ; # Top set xl [expr $xl + 100] ; set yl [expr 100 - $yl] ; # Left set xr [expr $xr + 100] ; set yr [expr 100 - $yr] ; # Right  Y成分は、上に行くほど座標値が減少するので、符号反転で  増加になるようにしなければなりません。  各頂点のVectorが計算できたので、重心から直線をひいて  Vectorを表示。 set w .canOrg $w create line 100 100 $xt $yt -fill purple $w create line 100 100 $xl $yl -fill green $w create line 100 100 $xr $yr -fill blue  色は、Top:紫、Left:緑、Right:青としました。  Canvas上で直線を引くためlineを使います。

移動Vectorを表示

 移動Vectorは、変数xcmpとycmpに格納されています。  Canvasの.canVectorに、直線を描画すると移動Vectorを表示可能。  .canVector、以下のように定義済み。  canvas .canVector -width [expr $cntv * 2] -height [expr $cntv * 2] -bg gray  定数cntvはset cntv 280で定義しているので  ($cntv,$cntv)から直線描画でVector表示します。  移動Vectorを平行移動。 set xv [expr $xcmp + $cntv] set yv [expr $cntv - $ycmp]  移動Vectorの変換ができたので、表示します。 .canVector create line $cntv $cntv $xv $yv -fill red

図形領域初期化

 3頂点、移動の各Vectorを表示する前に、以前の表示を  消去しておきます。  これをやらないと、現在の状態なのか、以前の状態なのか  判別できません。  プロシージャmasterClearで、初期化コードを定義。 proc masterClear {} { .canOrg delete all .canVector delete all }

全プロシージャ

 図形表示プロシージャをまとめると、以下となります。 proc drawGraph {} { global topPWM leftPWM rightPWM xcmp ycmp cntv # get components set xt 0 set yt $topPWM set xl [expr $leftPWM * (0.5)] set yl [expr $leftPWM * (sqrt(3) / 2)] set xr [expr $rightPWM * (-0.5)] set yr [expr $rightPWM * (sqrt(3) / 2)] # move set xt [expr $xt + 100] ; set yt [expr 100 - $yt] ; # Top set xl [expr $xl + 100] ; set yl [expr 100 - $yl] ; # Left set xr [expr $xr + 100] ; set yr [expr 100 - $yr] ; # Right # masterClear # draw each vector set w .canOrg $w create line 100 100 $xt $yt -fill purple $w create line 100 100 $xl $yl -fill green $w create line 100 100 $xr $yr -fill blue # draw jointed vector set xv [expr $xcmp + $cntv] set yv [expr $cntv - $ycmp] .canVector create line $cntv $cntv $xv $yv -fill red }
目次

inserted by FC2 system