Casio Basic入門G08
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2015/08/16
追記 2015/08/24
5. Casio Basic でグラフィックス2015/08/16
追記 2015/08/24
前回: Casio Basic入門G07
Chapter G08
ViewWindow (直交座標系)の有効活用
RclPict と RclCapt の違い
今回は、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 設定とほぼ同じであり、これらの変数を変更すれば座標系の設定を変えられるのです。但し、Xscale や Yscale という変数はなく、それぞれ Xscl, Yscl が正しい変数名なのは要注意です。
View と Window の間にスペースが入っている点も含めて、Xscal、Yscale の記述は改訂すべきだと思います。
実は、取扱説明書の記述には、さらに大きな問題があると思っています。Xminの値、Xmaxの値、Yminの値、Ymaxの値 との記述は、実に誤解を招く表記だと思います。
本来は、以下の意味です。
・ Xmin = 画面左端の X の値
・ Xmax = 画面右端の X の値
・ Ymin = 画面下端の Y の値
・ Ymax = 画面上端の Y の値
書式と入力方法
⇒ ViewWindow の性質
⇒ ViewWindow に関連する変数
ViewWindow で物理座標系に近い設定を試してみます。
物理座標系は、以下のような 座標値の値と座標軸の方向になっています。

これと類似の座標系を ViewWindow で設定するには、
ViewWindow 1,127,0,63,1,0
とします。変数で設定するには、
1→Xmin
127→Xmax
0→Xscl
63→Ymin
1→Ymax
0→Yscl
で ViewWindow コマンドを使わなくても同等の設定になります。
※ ViewWindow コマンドを使うか、変数の代入かは、実は大きな違いがあります。ViewWindow コマンドを使うと座標系設定に加えてグラフィックス画面の消去が行われます。変数の設定のみでグラフィックス画面の消去が行われるのかどうか?調べる必要があります [2015/08/24 追記]。もし消去されないのなら使い分けができそうです。
※ 物理座標系では、座標値に X = 1 ~ 127 の整数、Y = 1 ~ 63 の整数 以外の値を設定するとエラーになるので、同等の ViewWindow設定と表現しています。
さて、赤文字で示した部分を見ると、Ymin は Yの最小値ではなくて、画面下端の Yの値であり、Ymax は Yの最大値ではなくて、画面上端の Yの値であると理解すべきだと分かります。
カシオは伝統的に、古くからのユーザーへの利便性を常に考慮していて、古い機種との互換性を確保するためのコストを惜しまないところがあります。取扱説明書の表記についても、古い機種との互換性を考え、古くからのユーザーに分かりやすい表現を使っているため、このような誤解を招く表現になっているのではないかと思います。
当ブログでは、勝手ながら 2006年以降に発売された新世代 Casio Basic 搭載機種を対象にしているので、このカシオの伝統を尊重しつつ、しかし敢えて上記の指摘をしておきます。
ViewWindow の落とし穴
先ず抑えておきたいのが、前回紹介した問題で、ピクセルと座標系設定を1対1に対応させることの重要性です。
例えば、ViewWindow 0,126,0,0,62,0 は前回紹介したように、確実な設定です。

ここでは、ピクセル座標値 1 ( = 1pix) に対して、ViewWindow 座標値 1 が対応しています。予め用意されている変数 Xdot は 1 になっています。変数 Xdot は、X 方向の1 pix あたりの X座標値です。
但し、1 pix に対して、ViewWindow 座標値が 1 などの整数である必要もありません。割り切れれば良いと言えます。その一例として、論理座標系を ViewWindow で設定できます。

これを変数を使って設定すると、
-6.3→Xmin
6.3→Xmax
0→Xscl
-3.1→Ymin
3.1→Ymax
0→Yscl
この設定では、X方向の 1 pix に対応する座標値を示す変数 Xdot は、この例では 0.1 になっています。0.1 刻みで割り切れるので、前回見てきたような問題はありません。
前回作ったプログラムで、以下のものがありました。

ファイル名: DLINE2.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
⇒ダウンロード: DLINE2.1
ここで、ViewWindow 設定を変更します。
ファイル名: DLINE4.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,62,0,0
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
⇒ ダウンロード: DLINE4.1
赤文字が変更したところです。
画面下端の Yの値が 62、上端の Yの値が 0 と設定しています。DLINE2.1 の座標系と比べて上下が反転していますね。

では、以下のように ViewWindow 設定を変更したら、描画はどうなるでしょうか?
ファイル名: DLINE4.2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 126,0,0,62,0,0
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
⇒ ダウンロード: DLINE4.2
画面左端が X=126、右端は X=0、下端は Y=62、上端は Y=0 に設定されています。

このように、同じグラフィックス描画処理でも、座標系が異なると描画結果が異なります。
これまで、プログラムの冒頭に必ず ClrGraph を記述していました。ClrGraph はグラフィックス画面を消去するだけでなく、併せて論理座標系を設定します。もし プログラムで ViewWindow 座標系を設定するのであれば、ClrGraph でなくて Cls でも十分です。
但し、一旦設定した座標系は、次に座標系を変更するまでは、その設定が維持される点は要注意です。Cls は ViewWindow とペアで使うと間違いないでしょう。
==========
三角形の領域を千鳥格子で描画する処理を、座標系を4回変えて描画するプログラムを作ってみます。
ファイル名: DLINE4.3
Cls
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
StoV-Win 1
ViewWindow 0,126,0,62,0,0
StoV-Win 2
ViewWindow 126,0,0,62,0,0
StoV-Win 3
ViewWindow 126,0,0,0,62,0
StoV-Win 4
For 1→M To 4
RclV-Win M
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
Next
⇒ ダウンロード: DLINE4.3
このプログラムでは、最初に4つの ViewWindow 座標系を StoV-Win コマンドで保存しておきます。
点線を描画する時、保存しておいた ViewWindow 設定を RclV-Win コマンドで呼び出して、異なる設定4個を外側の For ループで4回繰り返します (赤文字部分)。
赤文字で示した外側の For ループでは、M が 1 からスタートします。最初は M=1 なので、RclV-Win M は RclV-Win 1 です。そして内側の For ループ は DLINE4.1 や DLINE4.2 と同じ処理です。
外側の For ループが2回目に回る時は、M が1つ増えて、M=2 になるので、RclV-Win M は RclV-Win 2 です。そして、内側の For ループは同じ描画処理です。
外側の For ループが3回目になる時は、M ささらに1つ増えて、M=3 になるので、RclV-Win 3 の設定で内側の For ループの描画を行います。
外側の For ループは M= 4 までループを継続します。4回目が最後で、RclV-Win 4 で 同じ描画を行って、For ループを終了します。
ViewWindow 設定の保存と呼び出しのコマンド、StoV-Win / RclV-Win の説明や入力方法は、以下を参照してください。
⇒ Casio Basic入門 G05 の StoV-Win / RclV-Win の説明
では、このプログラムを実行してみましょう。
最初に以下の描画になります。内側の For ループで、左下から上へ点線が増えてゆくのが見えます。

ここまで描画すると、この三角形の領域が消去され、左上から下へ点線の描画が始まります。

ここまで描画されると、これが消去され、右上から下へ点線の描画が始まります。

さらに、ここまで描画されると、これも消去され、右下から上へ点線の描画が始まります。

ここまで表示されたら、プログラム終了です。
グラフィックス画面の消去コマンドは、プログラム冒頭の Cls しか実行していません。それにも関わらず、外側の For ループが1回回るたびに、グラフィックス画面が消去されています。
ViewWindow には、座標系を設定するだけでなく、グラフィックス画面を消去する機能もあり、RclV-Win は、ViewWindow と同等なので、このようになります。
※ 但し、Plot で描画した点に限っては、1つ前に描画したものは消去されないという例外があります。
このプログラムで分かるように、同じ描画でも ViewWindow や RclV-Win を使って座標系を切り替えることで、プログラムにバリエーションが出せるわけです。
==========
ViewWindow や RclV-Win では、ブラフィックス画面が消去されます。上のプログラム DLINE4.3 で4回描画される3角形の千鳥格子の領域を、重ねて描画したい場合は、どうすれば良いのか?
これを実現するために、以下のプログラムを作ってみました。
ファイル名: DLINE4.4
Cls
CoordOff
GridOff
AxesOff
LabelOff
StoPict 1
ViewWindow 0,126,0,0,62,0
StoV-Win 1
ViewWindow 0,126,0,62,0,0
StoV-Win 2
ViewWindow 126,0,0,62,0,0
StoV-Win 3
ViewWindow 126,0,0,0,62,0
StoV-Win 4
For 1→M To 4
RclV-Win M
RclPict 1
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
StoPict 1
Next
⇒ ダウンロード: DLINE4.4
DLINE4.3 に赤文字の部分を追加しています。千鳥格子の3角形の領域が描画されたところで、StoPict で画面イメージを保存しておき、RclV-Win でグラフィックス画面が消去された直後に、保存しておいた画面イメージを表示し、その上に千鳥格子の3角形の領域を上書きさせる作戦です。
画面イメージの保存は StoPict、保存しておいた画面イメージを重ね合わせるのは RclPict を使います。これらコマンドの書式や入力方法は、以下を参照してください。
⇒ Casio Basic入門G05 の StoPict / RclPict の説明
プログラムが起動し初期設定が終わったところの何も表示されていないグラフィックス画面のイメージを、最初に StoPict 1 で保存しておきます。
次に、4つの座標系の設定をしてグラフィックス画面が消去された直後に、RclPict 1 で保存しておいた画面イメージを重ね合わせ、その上に点線描画を行います。これを4回繰り返します。
プログラムを起動させ、終了すると以下のようになります。

このプログラムで、点線が描画されている時、画面の右上には ■ マーク (ビジーマーク) が表示されていて、プログラム動作中であることを示しています。StoPict が動作する時も、画面右上には ■ マーク (ビジーマーク) が表示されているので、このマークも保存されるかと思えば、プログラム終了時の画面を見れば、■ マークがありません。
従って、StoPict は ビジーマーク ■ を無視してイメージ保存することが分かります。
==========
RclPict は、保存しているイメージを完全に上書きするのか、重ね合わせるのかを再度確認するために、DLINE4.4 に1行追加して実行してみます。
ファイル名: DLINE4.5
Cls
CoordOff
GridOff
AxesOff
LabelOff
StoPict 1
ViewWindow 0,126,0,0,62,0
StoV-Win 1
ViewWindow 0,126,0,62,0,0
StoV-Win 2
ViewWindow 126,0,0,62,0,0
StoV-Win 3
ViewWindow 126,0,0,0,62,0
StoV-Win 4
For 1→M To 4
RclV-Win M
PlotOn 63+2M,31
RclPict 1
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
StoPict 1
Next
⇒ ダウンロード: DLINE4.5
赤文字部分を追加しました。
追加した PlotOn 63+2M,31 は、画面中央あたりに点を1つ描画し、4回座標系を変更するたびに、少しずつ位置をずらすようにしています。もし、RclPict が保存イメージを完全上書きするなら、RclPict の直前に PlotOn で描画した点は消えるはずです。
このプログラム起動して終了した時は、以下のようになりました。

画面中央あたりに点が4つあります。つまり、RclPict は、既にある描画の上にイメージを重ね合わせることが確認できます。
[2015/08/23 追記]
保存したグラフィックス画面のコピーを描画するコマンドには、 RclPict 以外に RclCapt があります。RclPict と RclCapt は、それぞれ異なるイメージデータを扱います。
[MENU] キーで表示される MAIN MENU で MEMORY アイコンを選び、

、[F1] (F1: Main Memory) で表示される画面を見てみます。

フォルダ名 <CAPTURE> と <PICTURE> が表示されています。グラフィックス画面を Capt イメージとして保存すると <CAPTURE> フォルダが作られ、その中に Capt イメージファイルが作成されます。
このように、Pict イメージファイルと Captイメージファイルは、それぞれ異なるイメージデータとして管理されていることが分かります。それぞれのフォルダ名で [EXE] を押すと、フォルダ内のファイルリストが現れ、ファイル名とファイルサイズが確認できます。Pict ファイルは 2068 バイト、Capt ファイルは 1048 バイト とファイルサイズが異なっていることからも、ファイルフォーマットが異なっていることが分かります。
さて、RclPict で描画するには、StoPict で保存した Pict イメージデータを使います。一方 RclCapt で描画するイメージデータ (Capt イメージデータ) を保存するコマンドは用意されていません。Capt イメージデータを保存するには、グラフィックス画面が表示されビジーマークが点灯していない時 (プログラムが停止している時) に、[SHIFT] [7] (CAPTURE) を押すとグラフィックス画面を Capt イメージで保存されます。
RclPict は上で調べたように重ね合わせ表示をするので、RclCapt は同様に重ね合わせなのか、上書きなのかを調べてみます。
最初に Capt イメージを保存するため、以下のプログラムを実行するか、プログラム DLINE1.6 で [2] (2:Broken) を選び、画面中央に破線を描画して、これを画面キャプチャー (Captイメージ) を保存します。
Cls
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
SketchBroken Horizontal 31
破線は以下のように描画されます。

これが表示されている時、[SHIFT] [7] (CAPTURE) を押し、

1 を入力して、Capt #1 に画面イメージを保存します。これから分かるように、Capt イメージは 最大 20 枚保存できます。このイメージを呼び出すには、RclCapt 1 と記述します。
これで準備ができました。では、上で作ったプログラム DLINE4.5 の一番最後に RclCapt 1 を追加しましょう。
Cls
CoordOff
GridOff
AxesOff
LabelOff
StoPict 1
ViewWindow 0,126,0,0,62,0
StoV-Win 1
ViewWindow 0,126,0,62,0,0
StoV-Win 2
ViewWindow 126,0,0,62,0,0
StoV-Win 3
ViewWindow 126,0,0,0,62,0
StoV-Win 4
For 1→M To 4
RclV-Win M
PlotOn 63+2M,31
RclPict 1
For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next
StoPict 1
Next
RclCapt 1
これを実行して描画が終わると、以下のようになります。

RclCapt コマンドは上書きすることが、これで確認できます。
今回のまとめ
- ViewWindow は座標値 と ピクセル座標値 が1対1の対応になるように設定すると良い。
- 同じグラフィックスコマンドでも、座標系が変わると描画結果が異なる。
- ViewWindow 設定を StoV-Win で保存し、RclV-Win で呼び出すと、ViewWindow と同等の動作になる。
- ViewWindow や RclV-Win は、座標系を変更するだけでなく、グラフィックス画面を消去する。
- StoPict は、ビジーマーク ■ を無視して画面イメージを保存する。
- RclPict は、既にあるグラフィックス描画の上にイメージを重ね合わせる。完全に上書きするわけではない。
- RclCapt は、既にあるグラフィックス画面に上書きする。
今回使ったグラフィックス コマンド
- ViewWindow
- Xmin / Xmax / Xscl / Ymiin / Ymax / Yscl
- Xdot
- SketchDot
- F-Line
- StoV-Win / RclV-Win
- StoPict / RclPict
- RclCapt
つづく...
⇒ Casio Basic入門 G09 / 目次
応援クリックをお願いします。励みになるので...