目次
前
次
図形表示
移動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
}
目次
前
次