Casio Basic入門G09

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

追加・更新 2015/09/10

 5. Casio Basic でグラフィックス

前回: Casio Basic入門G08

Chapter G09
ViewWindowと設定変数


ViewWindow は、Casio Basic のグラフィック描画の中心となる重要な設定だと分かってきました。今回は、ViewWindow の設定変数について調べ、さらに線描画の詳細をもう少し調べてみます。


ViewWindow の書式

前回と同様に、fx-9860GII のソフトウェア バージョン 2.04 取扱説明書の 8-24 ページに書かれている、ViewWindow の書式を紹介します。

ViewWindow <Xminの値>,<Xmaxの値>,<Xscaleの値>,
          <Yminの値>,<Ymaxの値>,<Yscaleの値>,
          <Tθminの値>,<Tθmaxの値>,<Tθpitchの値>


今のところ直交座標系のみについて調べているので、当面3行目は無視しておきます。

<...の値> とは、それぞれ専用の変数の値を指しているので、間違いではありません。と言うのも、変数 Xmin, Xmax, Xscl, Ymin, Ymax, Yscl , Ysc に値を代入するだけで、ViewWindow 設定とほぼ同じであり、これらの変数を変更すれば座標系の設定を変えられるのです。但し、XscaleYscale という変数はなく、それぞれ Xscl, Yscl が正しい変数名なのは要注意です。

ViewWindow の間にスペースが入っている点も含めて、Xscal、Yscale の記述は改訂すべきだと思います。

実は、取扱説明書の記述には、さらに大きな問題があると思っています。Xminの値、Xmaxの値、Yminの値、Ymaxの値 との記述は、実に誤解を招く表記だと思います。

本来は、以下の意味です。
・ Xmin = 画面左端の X の値
・ Xmax = 画面右端の X の値
・ Ymin =
画面下端の Y の値
・ Ymax =
画面上端の Y の値


書式と入力方法
 ⇒ ViewWindow の性質
 ⇒ ViewWindow に関連する変数



座標系を設定する場合、ViewWindow コマンドの実行と、Xmin, Xmax, Xscl, Ymin, Ymax, Yscl での各変数設定は同じ効果だと分かっています。そこで、以下のプログラムを作ってみます。

ファイル名: VLINE1
Cls
CoordIff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→X To 126
X→Xmin
126+X→Xmax
Vertical 126
Whle Getkey
WhileEnd
Next


⇒ ダウンロード: VLINE1


プログラム冒頭のグラフィックス画面消去は、ViewWindow で座標系を設定するので、論理座標系に自動設定する機能を含んだ ClrGraph を使わず Cls にしても問題はありません。

ViewWindow 0,126,0,0,62,0 で座標値とピクセル位置が、四捨五入による誤差が発生しない座標系にしています(四捨五入による五歳については Casio Basic入門G07 参照)。

For 文では、座標系の設定を変更してから垂直線を描画する動作を繰り返しています。For 文内にある While ループは、何かキーを押したらループが回り、キーを離したらループを出る動作をするので、何かキーを押した時は垂直線描画の繰り返しが一時停止します。

さて、For 文をもう少し詳しく見てゆきます。

変数 X は最初 0 なので、Xmin は 0 、Xmax は 126 になります。最初の ViewWindow の設定のままとも言えます。そして 垂直線描画コマンドで Vertical 126 を実行するので、画面の右端に垂直線が描画されます。

For 文(ループ)が2回目に実行される時は X が 1 増えて 1 になるので、Xmin は 1、Xmax は 127 になります。X座標の範囲が 1 から 127 になり、座標系が 1 ずれます。すると Vertical 126 は画面右端から1ピクセル左にずれた位置に垂直線を描画します。

For 文(ループ)が3回目に実行されるときは、X が 1 増えて 2 になるので、Xmin が 2、Xmax が 128 になり、Vertical 126 は画面右端から2ピクセルずれた位置に垂直線を描画します。

このように、垂直線が右端から1ピクセルずつ左へ繰り返し描画されてゆき、X が 126 の時が For 文(ループ)最後の繰り返し処理になります。X が 126 の時は、Xmin が 126、Xmax が 252 になり、Vertical 126 は画面左端に垂直線を描画して、For ループが終わります。

XminXmax の設定変更が、ViewWindow の再設定と完全に同一の動作をするなら、設定が変更されるたびにグラフィックス画面を消去し(ViewWindow の仕様)垂直線が右端から左端まで移動するように見えるはずです。もしグラフィックス画面消去を行わないなら、画面が垂直線で埋められ最後は画面が真っ黒になるはずです。

では、プログラムを実行して確かめてみます。

VLINE1-1 

さらに、縦線が左に移動してゆきます。移動中に何かキーを押している間は、縦線の移動が止まります。

VLINR1-2 

左端まで移動すると止まります。

VLINE1-3 

垂直線が右端から左端まで移動することから、XminXmax の値変更は、ViewWindow 設定と同様に グラフィックス画面の消去動作を伴うことが確認できました。



座標系設定変数の動作について、もう少し詳しく調べて見るために、わざとエラーが出る条件を探すために、次のプログラムを実行してみます。

ファイル名: VLINE2
Cls
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 60→X To 126
X→Xmin
126-X→Xmax
Vertical Xmax-1◢
Next


⇒ダウンロード: VLINE2


For 文では、ViewWindow 座標系の横幅を狭くして垂直線を描画しています。、
For ループの最初は、X=60 だから、Xmin=60、Xmax=66 になり、Vertical 65 が実行されます。
ループ2回目は、X=61、Xmin=61、Xmax=65 なので、Vertical 64 が実行されます。
3回目は、X=62、Xmin=62、Xmax=64 で、Vertical 63 が実行されます。
4回目は X=63 なので、Xmin=63、Xmax=63 となり、Vertical 62 が実行されます。

XminXmax が同じ値になると、X座標の幅が 0 となりエラーが出る可能性があるので、この時の様子を調べるのが目的です。

併せて、Vertical のパラメータに ViewWindow の設定変数を指定して正しく動作するかどうかも確かめます。
なお、Vertical Xmax-1◢ なので、垂直線を描いて一旦停止します。[EXE] で一旦停止解除です。

では、このプログラムを実行します。

起動した時;

VLINE2-1 

[EXE] を一回押すと、

VLINE2-2 

さらに、[EXE] を押すと、

VLINE2-3 

もう一度、[EXE] を押すと、エラーが発生します。

VLINE2-4 

このエラー;

Range ERROR
  Press [EXIT]


は、範囲設定のエラーという意味です。表示に従って [EXIT] を押すと、

VLINE2-5 

カーソルが、Vertical Xmax-1 の前にきています。つまり、Vretical コマンド実行前にエラーが発生していることを示しています。
[EXE] を押す回数から、XminXmax がともに 63 になっていて、やはり、X座標の幅が 0 になるとエラーが発生するようです。


ここで、VLINE2 をもう一度実行すると、面白いことが分かります。

VLINE2-6 

上と同じ Range ERROR (範囲設定のエラー) となりますが、エラーが発生している場所を確認するために、[EXIT] を押すと

VLINE2-7 

エラーが発生しているところが異なります。

もう一度、上のソースコードを見れば分かるように、Vertical コマンドに達する前の ViewWindow コマンドでエラーになっています。さらに、ViewWindow 0,126,0,0,62,0 の最後にカーソルがあるので、この ViewWindow 座標設定後にエラーが発生していて、上のエラーとは発生場所が異なっています。

ViewWindow 座標設定により、XminXmax が異なる設定になるから、Range ERROR が解消されることを期待しましたが、そうはゆかないことが分かります。

一旦 Range ERROR が発生すると、ViewWindowでは解消できないわけです。



Range ERROR を解消する方法を調べて見ると、以下の2つの方法が有効です。
  1. ViewWindow 0,126,0,0,62,0 の代わりに 0→Xmin:126→Xmax とする。
  2. 冒頭の Cls  を ClrGraph に置き換える。
エラー解消方法1から、XminXmax の優先度が ViewWindow よりも高いことが分かります。

先ず、以下のように赤文字部分を1行追加します。

ファイル名: VLINE3.1
Cls
CoordOff
GridOff
AxesOff
LabelOff
0→Xmin:126→Xmax
ViewWindow 0,126,0,0,62,0
For 60→X To 126
X→Xmin
126-X→Xmax
Vertical Xmax-1
Text 1,1,X
Text 7,1,Xmin
Text 13,1,Xmax◢
Next


⇒ ダウンロード: VLINE3.1


これを実行すると最初は正常動作しますが、XminXmax が同じ値になるとエラーになります。つまり一旦はエラーが解消されることが確認できます。


エラー解消法2として、プログラム冒頭の ClsClirGraph に置き換えます。

ファイル名: VLINE3.2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 60→X To 126
X→Xmin
126-X→Xmax
Vertical Xmax-1
Text 1,1,X
Text 7,1,Xmin
Text 13,1,Xmax◢
Next


⇒ ダウンロード: VLINR3.2


ClrGraph によりエラーが解消されると最初の ViewWindow 設定は正しく動作するので、エラーは解消されていることが分かります。しかし、XminXmax が等しくなると再びエラーになります。

従って、万一の Range ERROR に備えて、プログラム冒頭のグラフィックス画面消去には ClrGraph を使うのが確実だと分かります。



さて、XminXmax が同じ値になると Range ERORR が発生することが分かったので、他に Range ERROR が発生する他の条件を調べて見ます。

Xmin = Xmax = 0 でエラーが発生するならば、ViewWindow 0,0,0,0,62,0 でもエラーが発生するはずです。以下のプログラムを実行してみます。

ファイル名: VW1.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,0,0,0,62,0


⇒ ダウンロード: VW1.1


これを実行してみると、Range ERROR が発生しません。つまり ViewWindow の設定のみではエラーにならず、その後のコマンドでエラーが発生することになります。

ViewWindow の後にグラフィックス描画コマンド(Sketch コマンド)と ViewWindowRange ERROR が発生することが分かりました。

以下のプログラムで確認できます。描画コマンドは、全て ' でコメントアウトしていあるので、1つづつコメントアウト記号を外して確認してください。

ファイル名: VW1.2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,0,0,0,62,0
'ViewWindow 0,126,0,0,0,0


'Plot
'PlotOn 0,0
'PlotOff 0,0
'PlotChg 0,0
'Line
'F-Line 0,0,1,1
'Circle 0,0,1
'Vertical 0
'Horizontal 31
'Text 1,1,1
'PxlOn 1,1
'PxlOff 1,1
'PxlChg 1,1
'PxlText(0,1)
'ViewWindow 0,126,0,0,62,0
'126→Xmax

⇒ ダウンロード: VW1.2


Plot から PxlChg までは、Range ERROR が発生し、[EXIT] を押すrと、これらコマンドの頭でカーソルが点滅しています。これらコマンドは、実行される前にエラーが発生することが確認されました。これらコマンドの内部動作として、XminXmax が等しいかどうかをチェックして、等しい時にはコマンドを実行する前にエラー表示をすることが分かります。

ところが、PxlTest(0,1) の場合は、エラー発生時に、0 の直後でカーソルが点滅しますが、コマンドが実行される前にエラー表示されます。

次に、ViewWindow 0,0,0,0,62,0 をコメントアウトし、'ViewWindow 0,126,0,0,0,0 のコメントアウトを外しても、全く同じ結果になることが分かります。


ViewWindow
 で発生するエラーについては、要注意です。
'ViewWindow 0,126,0,0,0,0 をコメントアウトして、ViewWindow 0,0,0,0,62,0 を有効に変更し(元に戻し)ます。
この場合、エラー発生時には最後の 0 の直後にカーソルがきます。最終行の 126→Xmax のコメントアウトも併せて解除してから実行しても Range EROR が発生し、カーソルは剤後の 0 の直後にカーソルがきます。

ところが、最終行のコメントアウトした '126→Xmax を削除して、ViewWindow が最終行になる場合は、エラー発生時のカーソルは 最後の 0 の直前にきます。

ところが、ViewWindow 0,0,0,0,62,0 をコメントアウトし、'ViewWindow 0,126,0,0,0,0 のコメントアウトを外すと、エラーになりません。ViewWindow 設定で Y座標の 左端と右端の値が同じでもエラーになりません。X座標とY座標で状況が異なることに注意が必要です。この動作の内部動作については、まだよく分かりませんが、このような仕様になっています。

ViewWindow の内部動作については、まだよく分からないので、引き続き探索を続けたいと思います。



では、エラー発生の条件として、Xmin = Xmax を直接設定する場合は、以下のようになります。

ファイル名: VW1.3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
0→Xmin:0→Xmax


⇒ ダウンロード: VW1.3

これを実行してみると、Range ERROR が発生しません。つまり 0→Xmin:0→Xmax の設定のみではエラーにならず、その後のコマンドでエラーになると考えられます。

そこで、VW1.2 と同様に以下のプログラムを実行すると、グラフィックス描画コマンド(Sketch コマンド)と ViewWindowRange ERROR が発生することが確認できます。各描画コマンドと ViewWindow を1つづつコメントアウトを外して確認してみてください。

ファイル名: VW1.4
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
0→Xmin:0→Xmax
'0→Ymin:0→Ymax


'Plot
'PlotOn 0,0
'PlotOff 0,0
'PlotChg 0,0
'Line
'F-Line 0,0,1,1
'Circle 0,0,1
'Vertical 0
'Horizontal 31
'Text 1,1,1
'PxlOn 1,1
'PxlOff 1,1
'PxlChg 1,1
'PxlText(0,1)
'ViewWindow 0,126,0,0,62,0
'126→Xmax

⇒ ダウンロード: VW1.4

エラーの発生の状況は、VW1.2 と全く同じです。ViewWindow で発生するエラー、Ymin = Ymax 時には ViewWindow でエラーが発生しないことを含めて同一の結果になります。

Xmin = XmaxViewWindowRange ERROR になるにも関わらず、Ymin = Ymax では Range ERROR が発生しない非対称な仕様は、Xdot が変数として用意されているものの、Ydot が無いことと関係があるのかも知れません。

ここまでのエラー発生条件のまとめ;
  1. XminXmax は、この変数に値を直接代入するか、ViewWindow で間接的に設定できる。
  2. 設定方法が直接か間接かは問わず、Xmin = Xmax および Ymin = Ymax になると、Sketchコマンド実行時に Range ERROR となる。
  3. ViewWindowXmin = Xmax の時に実行するとRange ERROR となるが、Ymin = Ymax の時はエラーにならない。


座標設定変数には、Xdot もあり、次のプログラムを実行してみると、Xdot に 0 を代入しようとすると Range ERROR になることが分かります。

ファイル名: VW1.5
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
0→Xdot


⇒ ダウンロード: VW1.5


Range ERROR が発生し、[EXIT] を押すと、

0→|Xdot

と、Xdot の直前でカーソルが点滅しています。変数 Xdot に 0 が代入されると直ちにエラーになる点は、XminXmax は、互いに等しくなっても直後にはエラーとならず、Sketch コマンドや ViewWindow 実行時にエラーとなるので、挙動が異なります。 


Xdot は、以下の計算で求まります;[2015/09/10 修正]

Xdot = (Xmax - Xmin) / 126
 ※ Xmin と Xmax から Xdot を算出する時は、この式に従います。

但し、Xdot に直接値を代入する場合は、正の数でなければエラーになるので、以下の式で現す必要があります。

Xdot = |(Xmax - Xmin)| /126
 ※ | | は絶対値(+やーの符号を外す)演算です。 


以下のプログラム VW1.6 を実行してみると、XminXmax を変更すると上の式によって Xdot が更新されることが分かります。さらに、XminXmax を同じ値にすると、Xdot が 0 に更新されることが確認できます。

つまり、XminXmax の値の変化に連動して Xdot の値が 0 以下に更新されても直ちに Range ERROR にならないこと、そして、Xdot に 0 以下 を代入すれば直ちに Rnage ERROR になるのは、Casio Basic の仕様だと分かりますす。


Range ERROR を解消するために、Xdot正の値に設定しても良いかもしれません。そこで、VLINE3.10→Xmin:126→Xmax の代わりに 1→Xdot を実行させ、動作を確認してみます。


ファイル名: VLINE3.3
Cls
CoordOff
GridOff
AxesOff
LabelOff
1→Xdot
ViewWindow 0,126,0,0,62,0
For 60→X To 126
X→Xmin
126-X→Xmax
Vertical Xmax-1
Text 1,1,X
Text 7,1,Xmin
Text 13,1,Xmax◢
Next


⇒ ダウンロード: VLINE3.3


これを実行すれば、Xdot正の値に設定すると Range ERROR が解消されることが確かめられます。

[2015/09/08 追記]
ViewWindow で間接的に、あるいは XminXmax に直接値を代入して、XminXmax (つまり Xdot ≦ 0) にする場合は、Sketch コマンドや ViewWindow 実行時にエラー (Range ERROR) にはなりません。 

例えば、以下の2つのプログラムは、Xmin > Xmax に設定し、画面の右上が原点となりますが、エラーにならず、正常動作します。

VW.Test1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 126,0,0,62,0,0
Text 1,1,Xdot
Text 7,1,Xmin
Text 13,1,Xmax
PlotOn 10,10



VW.Test2

ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
126→Xmin:0→Xmax:0→Xscl
62→Ymin:0→Xmax:0→Yscl

Text 1,1,Xdot
Text 7,1,Xmin
Text 13,1,Xmax
PlotOn 10,10



座標を設定する変数、XminXmaxXsclXdotYminYmaxYscl を自由に設定して、他の変数がどのように変化するのか、確かめるプログラムを作ってみます。

これまでのサンプルプログラム作成で、XsclYscl の値を変えても、他の変数への影響が無いことが経験的に分かっています。
XminXmax そして YminYmax もそれぞれ独立に変更できることも、経験的に分かっています。
このプログラムでは、XminXmaxXdot の関係を調べることが主な目的です。
但し、これら7つの変数を自由に変更できるようにしました。

ファイル名: VW1.6
ClrGraph
CoordOff
GridOff
AxesOn
LabelOff
ViewWindow 0,126,0,0,62,0

While 1
Cls
ClrText
Locate 1,1,"1 Xmin:       "
Locate 1,2,"2 Xmax:       "
Locate 1,3,"3 Xscl:       "
Locate 1,4,"4 Xdot:       "
Locate 1,5,"5 Ymin:       "
Locate 1,6,"6 Ymax:       "
Locate 1,7,"7 Yscl:       "

Locate 9,1,Xmin
Locate 9,2,Xmax
Locate 9,3,Xscl
Locate 9,4,Xdot
Locate 9,5,Ymin
Locate 9,6,Ymax
Locate 9,7,Yscl

Do
Getkey→K
LpWhile K=0
0→M
K=72⇒1→M
K=62⇒2→M
K=52⇒3⇒M
K=73⇒4→M
K=63⇒5→M
K=53⇒6→M
K=74⇒7→M
K=47⇒Break

If M=1:Then
9→X:1→Y:10→D:1→E
Prog "IN":Z→Xmin
Else If M=2:Then
9→X:2→Y:10→D:1→E
Prog "IN":Z→Xmax
Else If M=3:Then
9→X:3→Y:10→D:1→E
Prog "IN":Z→Xscl
Else If M=4:Then
9→X:4→Y:10→D:1→E
Prog "IN":Z→Xdot
Else If M=5:Then
9→X:5→Y:10→D:1→E
Prog "IN":Z→Ymin
Else If M=6:Then
9→X:6→Y:10→D:1→E
Prog "IN":Z→Ymax
Else If M=7:Then
9→X:7→Y:10→D:1→E
Prog "IN":Z→Yscl
IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd
IfEnd

'Plot 0,0
WhileEnd

ClrText
Locate 9,5,"bye!"


⇒ ダウンロード: VW1.6
⇒ ダウンロード: IN ver 2.1G

このプログラムでは、入力ボックス を使うのでこれを併せてダウンロードしてください。

ソースコードから分かるように、[EXIT] キーで正常終了します。

プログラム起動時は、ViewWindow 9,126,0,0,62,0 が設定され、この時の各変数の値を表示します。

XminXmax に対して、Xdot = (Xmax - Xmin) / 126Xdot が変化します。
Xdot を変更すると、Xmin は変化せず、Xmax が変化します。

なお、コメントアウトしている Plot 0,0 を実行させれば、設定変更だけではエラーにならないもののグラフィックス描画コマンド(Sketch描画コマンド)の実行によりエラーになる場合を確認できます。




今回のまとめ
  • XminXmax を設定すると ViewWindow の設定と同様にグラフィックス画面が消去される。
  • Vertical コマンドのパラメータに Xmax が使える。⇒ Xmin も使える。
  • X座標の幅が 0 になると、Range ERROR が発生する。
  • Range ERRORViewWindow 設定では解消できない。
  • Range ERROR を解消するには、ClrGraph が有効。
  • Range ERROR を解消する別の方法として、座標設定変数に直接値を設定することも有効。
  • Range ERROR を解消するために、Xdot を 0 以外の値に設定することも有効。
  • Xmin = Xmax ならびに Ymin = Ymax の時、Sketch コマンドで Rnage ERROR が発生する。
  • Xmin = Xmax の時、ViewWindowRange ERROR が発生する。 
  • Ymin = Ymax では、ViewWindowRange ERROR にならない。
  • Xdot に 0 を設定すると、この設定直後に Range ERROR となる。
  • XminXmax から Xdot が自動的に求められる。
  • Xdot を変えると、Xmin は変わらず、Xmax が変化する。

今回使ったグラフィックス コマンド

  • ViewWindow
  • XminXmax 設定
  • Plot
  • PlotOn
  • PlotOff
  • PlotChg
  • Line
  • F-Line
  • Circle
  • Vertical
  • Horizontal
  • PxlOn
  • PxlOff
  • PxlChg
  • PxlTest


つづく...

Casio Basic入門 G10 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ







keywords: fx-9860GIICasioBasic、プログラミング入門グラフィックスプログラム関数電卓

リンク集 | ブログ内マップ


関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム関数電卓は、プログラムを作り・使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR