楽屋裏 - Inseide Casio Basic Project

楽屋裏 - Inside Casio Basic
e-Gadget


2015/08/24


これまでに Casio Basic の探索を行ってその結果を幾つかの方法で公開してきていますが、分かる人には冗長に過ぎる感じがしていました。

カシオのプログラム電卓の取扱説明書は、プログラミングに関しては簡易過ぎる説明しかありませが、fx-5800P のテキストベースのコマンド類は一般のBasic に非常に近い仕様なので、プログラミング経験が理解の助けになります。

一方、fx-9860GII のグラフィックス関連のコマンドについては、多くの重要な仕様について説明が一切無く、プログラミングに慣れた人でも知らなければ仕様なのかバグなのか判別に苦しむような独特の仕様が多くあることが分かってきました。さらに、取扱説明書に記載されている内容も、恐らく古い機種のものを引きずっていて、改訂が必要と思われる内容があります。

そこで、fx-9860GII に fx-5800P を加えて、これらを対応機種として、Casio Basic の仕様を、簡潔かつ網羅的にまとめた辞書のようなものを作ろうと思いました。

もし既にあれば私が作る必要も無いのですが、私の知る範囲では国内はおろか、海外の英語コンテンツにも見当たりません。そこでどうせ作るのなら、世界に広く発信できるように英語で作成し、並行して日本語版も作る作戦にして、Inside Casio Basic Project と呼ぶことにしました。


先ずは、e-Gadget 内で少しづつ作り始めています;

⇒ English Edition: Inside Casio Basic

⇒ 日本語版: インサイドCasio Basic


内容の正確さや記述のわかりやすさなどを考えて、最初はコロコロと変更があると思います。英語版作成など無謀なのは承知の上での試みです。なので、じっくり、ゆっくりと進めることになると思います。


生暖かいご支援(笑)を御願いします。




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

人気ブログランキングへ


FC2ブログランキングへ


keywords: プログラム関数電卓、fx-5800P、fx-9860GII、Casio Basic

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門G08

Casio Basic入門
<目次>

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

2015/08/16
追記 2015/08/24

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

前回: 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 設定とほぼ同じであり、これらの変数を変更すれば座標系の設定を変えられるのです。但し、XscaleYscale という変数はなく、それぞれ Xscl, Yscl が正しい変数名なのは要注意です。

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

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

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


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


ViewWindow で物理座標系に近い設定を試してみます。
物理座標系は、以下のような 座標値の値と座標軸の方向になっています。
座標系とピクセル位置2 
これと類似の座標系を 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 
ここでは、ピクセル座標値 1 ( = 1pix) に対して、ViewWindow 座標値 1 が対応しています。予め用意されている変数 Xdot は 1 になっています。変数 Xdot は、X 方向の1 pix あたりの X座標値です。

但し、1 pix に対して、ViewWindow 座標値が 1 などの整数である必要もありません。割り切れれば良いと言えます。その一例として、論理座標系を ViewWindow で設定できます。
座標系とピクセル位置4 
これを変数を使って設定すると、

-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 

ファイル名: 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 の座標系と比べて上下が反転していますね。


DLINE4.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 に設定されています。

DLINE4.2 

このように、同じグラフィックス描画処理でも、座標系が異なると描画結果が異なります。

これまで、プログラムの冒頭に必ず ClrGraph を記述していました。ClrGraph はグラフィックス画面を消去するだけでなく、併せて論理座標系を設定します。もし プログラムで ViewWindow 座標系を設定するのであれば、ClrGraph でなくて Cls でも十分です。

但し、一旦設定した座標系は、次に座標系を変更するまでは、その設定が維持される点は要注意です。ClsViewWindow とペアで使うと間違いないでしょう。

==========

三角形の領域を千鳥格子で描画する処理を、座標系を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 MRclV-Win 1 です。そして内側の For ループ は DLINE4.1DLINE4.2 と同じ処理です。

外側の For ループが2回目に回る時は、M が1つ増えて、M=2 になるので、RclV-Win MRclV-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 ループで、左下から上へ点線が増えてゆくのが見えます。

DLINE4.3.1 

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

DLINE4.3.2 

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

DLINE4.3.3 

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

DLINE4.3.4 

ここまで表示されたら、プログラム終了です。

グラフィックス画面の消去コマンドは、プログラム冒頭の Cls しか実行していません。それにも関わらず、外側の For ループが1回回るたびに、グラフィックス画面が消去されています。

ViewWindow には、座標系を設定するだけでなく、グラフィックス画面を消去する機能もあり、RclV-Win は、ViewWindow と同等なので、このようになります。
※ 但し、Plot で描画した点に限っては、1つ前に描画したものは消去されないという例外があります。

このプログラムで分かるように、同じ描画でも ViewWindow や RclV-Win を使って座標系を切り替えることで、プログラムにバリエーションが出せるわけです。

==========

ViewWindowRclV-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回繰り返します。

プログラムを起動させ、終了すると以下のようになります。

DLINE4.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 で描画した点は消えるはずです。

このプログラム起動して終了した時は、以下のようになりました。

DLINE4.5 

画面中央あたりに点が4つあります。つまり、RclPict は、既にある描画の上にイメージを重ね合わせることが確認できます。



[2015/08/23 追記]

保存したグラフィックス画面のコピーを描画するコマンドには、 RclPict 以外に RclCapt があります。RclPictRclCapt は、それぞれ異なるイメージデータを扱います。

[MENU] キーで表示される MAIN MENU で MEMORY アイコンを選び、

Memory 

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

MainMemory 

フォルダ名 <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


破線は以下のように描画されます。

BrokenLine 

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

CaptPopup 

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


これを実行して描画が終わると、以下のようになります。

BrokenLine 

RclCapt コマンドは上書きすることが、これで確認できます。





今回のまとめ
  • ViewWindow は座標値 と ピクセル座標値 が1対1の対応になるように設定すると良い。
  • 同じグラフィックスコマンドでも、座標系が変わると描画結果が異なる。
  • ViewWindow 設定を StoV-Win で保存し、RclV-Win で呼び出すと、ViewWindow と同等の動作になる。
  • ViewWindowRclV-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 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ







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

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



関連記事

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

楽屋裏 - Casio Basicコマンド解説の修正履歴

楽屋裏 - 修正履歴
e-Gadget


2015/08/14

Casio Basic の探索を行ってきています。fx-58000P 搭載のコマンド類については、意外に苦労が少なかったのですが、fx-9860GII の、特にグラフィックス関係が結構手強いのです。まぁだから面白いのですが...

つい最近、fx-9860GII OS 2.04 Casio Basic のコマンドの理解に勘違いが見つかって、慌てて修正しています。全ての記事への修正に漏れがあってはいけませんが、気付かずに修正が遅れることもありそうです。(日本語の記述の問題は、また別の問題として...)

そこで、今後は Casio Basic に関して、何か勘違いしていたことに気づき、間違った記述内容を修正する時には、必ずこのエントリーにまとめておくことにします。



Cls
2015/07/29
: fx-9860GII では、グラフィックス画面の消去を行う。但しグラフィックス設定の変更を行わない点で、ClrGraphとは異なる。
: fx-9860GII で、グラフィックス画面とテキスト画面の両方の消去を行うとしていたが、テキスト画面の消去を行うとした点が誤り。

備考: fx-5800P Casio Basic については、誤りなく修正不要。

修正した記事:
- Casio Basic入門G02
- Casio Basic入門G03
 

ViewWindow 0,126,0,0,62,0
2015/08/15
: この設定にすると、ピクセル1個と座標値1が対応して、グラフィックス描画が分かりやすくなる
: ピクセル1個と座標値1が対応して、分かりやすくなる設定に ViewWindow 0,126,0,0,63,0 とした

修正した記事:
- Casio Basic入門G01






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

人気ブログランキングへ


FC2ブログランキングへ


keywords: プログラム関数電卓、fx-5800P、fx-9860GII、Casio Basic

リンク集 | ブログ内マップ
関連記事

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

楽屋裏 - 虫の軌跡 (Bug Trace)

楽 屋 裏 - Bug Trace
e-Gadget

更新 2015/08/14

虫の閉じ込め (Bug Trap) ゲーム - を作ったのですが、動く虫 (=点) を fx-9860GII の応答の遅いLCDではどうも視認性が悪く、もっと面白く遊べないかものかと、思いながらプログラムを色々と実行してみていました。⇒ 視認性向上したバージョンを追加しています。

虫を閉じ込めるには、たった3つのピクセルを以下のように並べるだけで良いこととも分かってきて、シンプルを追求する場合は、あまり発展性がない感じです。なお、視認性が向上したので、複雑で面白い形状を追求する楽しみが増えました。



BugTrap-Pict17 
⇒ ダウンロード: PICT17



一方で、以下のパターンで本当に繰り返しが無いのか、疑問に思えてきました。

BugTrap-Pict19 
⇒ ダウンロード: PICT19



そこで、プログラム BugTrap を改造して、虫の軌跡を残すように変更しました。軌跡を追跡するので プログラム名は Bug Trace です。

改造といっても、プログラム BUGTRAP の以下の赤文字で示した1行を消すだけです。あとはそのままなので、操作方法は全く同じです。捜査方法については 虫の閉じ込め (Bug Trap) を参照してください。

なお、BUGTRAP では外枠を F-Line で描いていたのを、HorizontalVertical に置き換えました。この方が初期描画が速くなります。
※ 実は、F-Line で描画していたのは、描画方向をコントロールしたくて、時計回りに外枠を描画していたのは、お気づきでしょうか?グラフィックスプログラムならではの小さなこだわりでした。


プログラム

ファイル名: BUGTRACE
'==Initialize==
ClrGraph
CoordOn
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0

'==Draw frame==
S-L-Normal
Horizontal 0
Vertical 126
Horizontal 62
Vertical 0


'==Paint mode==
Text 7,3,"EXE/→/↑/←/↓: Draw Wall
Text 13,3,"DEL: Go!"
63→X:31→Y
While 1
While Getkey
WhileEnd
Do
Getkey→K
Text 13,3,"DEL: Go!"
LpWhile K=0 Or K=47
K=44⇒Break
If K=31 Or K=68
Then

Text 13,3,"    " '8 spaces
Plot X,Y◢
Line
IfEnd
WhileEnd
Text 7,3,"             " '25 spaces
Text 13,3,"    " '8 spaces
StoPict 15

'==Draw dot==
62→B:2→A:-1→D:1→C
PxlOn B,A

'==Move dot==
While 1

'✶Set direction
If B=1 Or B=63
Then (-1)D→D
Else If A=1 Or A=126
Then (-1)C→C
Else
PxlTest(B+D,A)⇒(-1)D→D
PxlTest(B,A+C)⇒(-1)D→C
IfEnd:IfEnd

'✶Plot dot
PxlOff B,A   ← 削 除
B+D→B:A+C→A
PxlOn B,A

Getkey=47⇒Break
WhileEnd

'==Normal end
StoPict 16
ClrText
Locate 9,5,"bye!"

⇒ ダウンロード:Casio Basic プログラム BugTrace  [最終 2015/08/14 12:00]

[2015/08/13 追記]
障害物を置いた時の画面コピーを PICT15 に、最終的な軌跡の画面コピーを PICT16 に自動的に保存するように修正しました。 そのために、プログラムコードで 茶色文字で示した2行を追加しています。

[2015/08/14 追記]
sentaro様が、同じ動作をするアドインプログラムを作ってくれました。これで、様々ななパターンの探索を高速に行えるようになるので、皆様も是非お使いください。このアドインプログラムでは、虫 (=点) の描画中に、[EXIT] [MENU] 以外の好きなキーを押せば大幅に描画を高速化します(ターボ機能)。
⇒ ダウンロード: Add-in プログラム Ver1.10 BugTrace.g1a
⇒ ダウンロード: Add-In プログラム Ver1.10 ソース付き BugTrace110.zip

さらに、このアドインプログラムには、これまで作った Drunk BugBug Trap、今回の Bug Trace の3つの Casio Basic プログラムと同等の機能が含まれていて、起動時のメニュー画面で選んで起動できます。それぞれの機能は [EXIT] で終了してメニュー画面に戻ります。

上の Casio Basic プログラムでは、[OPTN] キーで画面コピーの呼び出しや保存が出来ます。一方、アドインプログラムでは、保存していた障害物の画面コピーの呼び出し、軌跡の画面コピーの保存はできません。

なお、アドインでは、ペイントモードで、[EXE] を押した時のみ十字カーソルが表示されます。一方、Casio Basic プログラムでは [EXE] を押さずに矢印キーを押せば、十字カーソルが表示されました。今回、Casio Basic の仕様を変更して、アドインと同じになるように修正しました(この方が操作の統一性があるため)。この修正は、プログラムコードで 青文字で示した3行を追加しています。



さて、But Trap の時と同様に、以下のパターン (PICT19) を呼び出して、障害物パターンとします。

BugTrap-Pict19 
⇒ ダウンロード: PICT19

このパターンを呼び出して、Bug Trace による軌跡は、結局以下のようになって、あとは同じ軌跡を繰り返したどることが分かりました。これだけ動き回ったあげく元の軌跡に戻るので、閉じ込めに失敗しているのか失敗していないのか、判断に困るところです。ただ、思いの外広い範囲を通過していることが分かって、面白い結果です。

BugTrace_result1 

他にも、障害物パターンを色々と変えてみると、どれも一定の軌跡を繰り返すことが分かりました。

BugTrace_result2 

BugTrace_result3 

BugTrace_result4 

BugTrace_result5 

BugTrace_result6 

軌跡で画面全体を万遍なく塗りつぶすのは、意外に難しそうです。


障害物無しで、軌跡を調べて見ると、

BugTrace_result7 

結構、広く塗りつぶしていることが分かります。逆に言えば、まだ完全に塗りつぶせていません。



回答募集

そこで、Bug Trace プログラムを使って、軌跡で全て塗りつぶす条件を探してみることにしました。

虫の軌跡は、斜めの移動だけなので、理想的には以下のような千鳥格子になります。

BugTrace_result_Goal 
目 標

極端な話し、障害物を描画するとき、これだけで塗りつぶすこともできるので、障害物のピクセル数をどこまで少なくして、目標の軌跡が得られるでしょうか?

ちなみに、上の目標は プログラム Bug Trace で得たのではなく、以下のプログラムで描いています。

ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0

For 0→Y To 62
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
Next

Horizontal 0
Vertical 126
Horizontal 62
Vertical 0




問題)
目標の千鳥格子の結果に少しでも近い軌跡を得るために、最も少ないピクセルの障害物をどこに配置すれば良いでしょうk?
障害物の形と配置、それと併せて軌跡の結果を教えて下さい。


皆様からの回答をお待ちしています。



[2015/08/13 追記]
<ヒント>
上の問題について、色々と調べてみていますが、1ピクセルの抜けも無い完全な千鳥格子が得られる障害物とその置き方は、4通り見つかっていて、いずれの障害物も2ピクセルです。但し、この4通りは、完全な千鳥格子に加えて、格子の間が ON になるピクセル(障害物の一部)が1つあります。

1ピクセルの障害物を試していますが、今のところ完全な千鳥格子に最も近いのは、1ピクセルだけ抜けがあり、さらに格子の間に障害物の一部の1ピクセルがある結果になります。これが4通り見つかっています。

sentaro様が、2ピクセルの障害物のパターンを見つけられたとのことです(コメント参照)。


[2015/08/14 追記]
<描画の高速化>
Casio Basic では描画が遅いので、色々なパターンを探索するには、2つの方法があります;
 ・ オーバークロックツール Ftune2 を使って、高速化する
 ・ 同等機能を高速なアドインプログラムで作る
私は、オーバークロックツールで、高速描画させて探索しています。

この度 sentaro様が、同じ動作を行うアドインプログラムを作ってくれたので、極めて高速に描画が可能になりました。
PCリンクソフト FA-124 を使って、fx-9860GII へ導入できます。
⇒ ダウンロード: Add-in プログラム Ver1.10 BugTracb.g1a

ダウンロードした Add-in プログラムを fx-9860GII へ転送する方法は、FA-124 を起動し、メニューの [HELP] - [Manual] を選び、表示される取扱説明書の 64ページ 「10. アドインのインストール」にあるので、記述に従えば簡単です。アドインのインストールが済めば、fx-9860GII で [MENU] を押して、以下のアイコン (bug と描かれているアイコン) が追加されていればインストール成功です。

BugTrace_Menu 
このアイコンを選んで [EXE]BugTrace アドインが起動します。


ところで Add-in は、SDKを使って C  言語で記述して作成します。ご興味のある方は、ソースファイル一式を触ってみてください。
 ⇒ ダウンロード: Add-in プログラム Ver1.10 ソース付き BugTrace110.zip

※ ご参考までに、SDK の入手方法は、こちら を参考にしてください。

ちなみに、sentaro様は、この自作のアドインで、高速探索するうち、1ピクセルの障害物を見つけたとのことです(コメント 参照)。



[2015/08/14 追記2]
sentaro様が 作成した Add-in は、グラフィックスプログラムは アドインで作ると高速描画が可能になる良い例です。
なお、描画中に [MENU][EXIT] 以外の好きなキーを押せば、描画が劇的に高速化します(ターボ効果)。
⇒ ダウンロード: BugTrace.g1a (Ver 1.10)



以下の一連の Casio Basic が アドインプログラムになっていて、その一部に Drunk Bug があります

楽屋裏 - 酔っ払いの虫 (Drunk Bug)
楽屋裏 - 虫の閉じ込め (Bug Trap)
楽屋裏 - 虫の軌跡 (Bug Trace)


このアドインを再コンパイルや改造できるソース付き全ファイルのダウンロードは以下;
⇒ ダウンロード: BugTrace110.zip (Ver 1.10)





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

人気ブログランキングへ


FC2ブログランキングへ





keywords: fx-9860GII、CasioBasicプログラム関数電卓コメントアウトバグ

リンク集 | ブログ内マップ
関連記事

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

楽屋裏 - 虫の閉じ込め (Bug Trap)

楽 屋 裏 - Bug Trap
e-Gadget

プログラム改善 2015/08/11
更新 2015/08/14

[2015/08/11 プログラム改善]
sentaro様のご提案で、虫 (=点) の描画を常に3個分残像(黒い三連星!) にすることで、視認性の向上が顕著です。そこで、この改善プログラムを BUGTRAP3 (3連星の '3' で、'2' は有りません(^^;) としてダウンロードできるようにしました。具体的な改造点については、上記のコメントをご覧ください。
⇒ ダウンロード: BUGTRAP3 (黒い三連星バージョン)


以前、酔っ払いの虫 (Drunk Bug) - シミュレーションゲーム - を作ってみました。

Casio Basic でのグラフィックスプログラミングで、どんなプログラムが作れるのか? その一例で、Drunk Bug は、虫がランダムに動く様子をグラフィックスで表現したもので、箱の壁で虫が進行方向を変えます。見ていて、そこそこ楽しめるプログラムになりました。


そこで、虫1匹=点1個 を画面内で直線的に移動させて、壁で反射させるプログラムを作るとどんな感じになるのか、ちょっと試してみたころ、
fx-986GII は、点描画の応答速度がかなり遅いので、点を動かすと、ピクセル表示の応答が、移動速度に追いつかなくて、動く点の視認が難しいことが分かりました。かなりウェイトをかけて、やっと視認できるようになります。

そこで、壁で反射するだけでなくて、適当に障害物を置いて、そこで反射させるような処理を追加して、処理の時間がウェイト代わりになれば、動きが複雑になって、ついでに点移動も視認できて、都合良くなるかも知れない...意外に形になるかも...と、思って作ったのが今回のプログラムです。

今回のプログラムでは、fx-9860GII の画面イメージを 保存/読出し する機能も併せて使ってみます。



Bug Trap の遊び方

⇒ ダウンロード: BugTrap [最終 2015/08/14]

先ずは、ダウンロードして遊んでみてください。

1. 障害物設置 (ペイントモード):
プログラムが起動すると、[EXE] でペイントモードに入ります。カーソルを自由に動かして、点と点を繋ぐ直線を折れ線を一筆書きで描いて、好きなように障害物を描きます。障害物無しにもできます。左下を原点 (0,0)  として、位置を考えながら障害物を自由に描きます。[DEL] でペイントモードを終了します。何も描かずに [DEL] を押してもペイントモードを終了します。
BugTrap-PaintMode 
[EXE] を押すと十字カーソルが現れます。カーソルを矢印キーで動かして [EXE] キーを押せば直線が描かれ、カーソルは消えます。再び [EXE] キーを押すと、前回カーソルが消えた位置にカーソルが現れ、次の点まで移動して [EXE] で確定すると、一筆書きで折れ線が描画できます。これを繰り返して障害物を設置します。カーソルが消えている時に [DEL] キーを押せばペイントモードを終了します。
[DEL] を押した時に、障害物のパターンを画面コピーして PICT15 として自動保存されます。

2. 虫の走行 (描画モード):
ペイントモードを終了すると、左下から虫(=点)が45度の角度で走り出します。壁(外枠)や障害物に当たると進行方向を90度変えます。斜め線などでピクセルが上下あるいは左右に隣接していない点 (孤立した点) は、虫が通り抜け、その点は消えます。

3. 終 了
[EXIT] で正常終了し、この時のグラフィックス画面をコピーして PICT16 として自動保存します。

点の動きは応答速度が遅いために、薄く視認性がよくありません。[SHIFT] [OPTN] (LIGHT) でバックライトを点灯すると少し見えやすくなります。

[2015/08/14 追記]
虫 (=点) 3個を残像のように表示させて、視認性を向上させた バージョンを使えば、虫の動きがかなり見やすくなります。
⇒ ダウンロード: BugTrap3 (黒い三連星バージョン) 


遊び方

さて虫の動きを見ていると、障害物の置き方によっては、最初から同じ経路を循環する場合や、始めは孤立した点を消去しながら進むが最終的に同じ経路を循環する場合もあります。数学的な規則性があるのでしょうが、難しいことを抜きにしても、面白いです。

このように 虫の動きを一定の範囲に閉じ込めるように障害物のパターンを探して遊びます。虫を閉じ込めるので、Bug Trap (虫の閉じ込め) という名前にしています。

せっかく見つけたパターンを保存したり、保存したパターンを呼び出して使えます。fx-9860GII には画面コピーを最大20枚保存する機能が備わっていて、これを利用します。正し、プログラム停止状態でないと画面コピーできない点に注意が必要です。


障害物パターンの取込

例えば、以下のパターンを fx-9860GII に取り込んでみましょう。

BugTrap-Pict20 
⇒ パターンのダウンロード: PICT20.G1M 


点が2つありますが、虫はこれらの点を通り抜け、その際この点は消えるので、気にする必要はありません。

ダウンロードした PICT20.G1M ファイル を、PCリンクソフト FA-124 を使って fx-9860GII に取り込みます。 FA-124 を起動して、メニューの [HELP] - [Manual] を選んで、表示される取扱説明書を読めば、全ての操作方法が分かります。今回の手順は以下参照;
  1. PICT20.G1M ファイルを上からダウンロードし、分かるフォルダに保存します。
  2. FA-124 Ver 2.04 を起動。
  3. 右ペイン (FA-124) で アイコンメニューの Main アイコン (電卓の恰好したアイコン) をクリック。
  4. ツリービューの Default フォルダの上でマウスの右クリック。
  5. メニューから Import をクリックして、保存したPICT20G1M を選んで、[開く] ボタンをクリック。
  6.  すると、右ペインのツリービューにある `Picture フォルダ下に PICT20 が取り込まれる。 
次に、fx-9860GII と PC を接続して、PICT20 をfx-9860GII へ取り込みます。詳細手順は以下参照;
  1. PCリンクソフト FA-124 Ver 2.04 を起動した状態で、fx-9860GII と PC をUSBリンクケーブルで接続。
  2. fx-9860GII に Select ポップアップメニューが現れ、そこで [F1] (DataTrans:[F1]) を押す。
  3. FA-124 画面の左ペイン (Calculator) のアイコンメニューで、Connect アイコンをクリック。
  4. 接続動作の後、接続できたらツリービューが現れる。
  5. 右ペインの Picture フォルダを右ペインの User1 フォルダまで ドラッグ&ドロップする。或いは、右ペイン (FA-124) の Picture フォルダで右クリック→メニューで Copy をクリックし、左ペイン (Calculator) の User1 フォルダの上を右クリック→メニューで Paste をクリックします。
  6. これで、fx-9860GII に PICT20 が転送される。
  7. fx-9860GII で [AC] を押すか、FA-124 の左ペイン (Calculator) のアイコンメニューの Disconnect アイコンをクリックすれば、接続が解除される。
続いて、BugTrap プログラムで PICT20 を呼び出します。

BUGTRAP を起動します。

BugTrap-PaintMode 

ペイントモードになっています。
ここで、[OPTN] キーを2回押すと、画面左下に PICT アイコンが現れ、[F1] (PICT) [F2] (RCL) で Recall From Picture Memory ポップアップが現れます。ここで、Pict 番号である 20 を入力すると画面に Pict20 の画像が取り込まれます。十字カーソルも表示されているので、[EXE] キーでカーソルを消します。カーソル位置に点が描画されますが、気にする必要はありません。孤立した点を虫が通ると、方向転換せずに、その点が消されます。もしどうしても気になるなら、カーソルを既に ON になっているピクセル上へ移動してから [EXE] キーを押してください。

BugTrap-SetPict20 

カーソルが消えると、画面左上に DEL: Go! 表示が現れます。[DEL] キーを押せば、虫の移動が始まります。24回反射して、同じ経路を巡回し続けますね。見ているとちょっと面白いです。

==========

他にも、以下の障害物パターンをダウンロードして試してみてください。

 似たようなパターンですが、ちょとした違いでかなり違います。

BugTrap_Pict16 
⇒ ダウンロード: PICT16

52回反射する軌跡が繰り返されます。


BugTrap-Pict19 
⇒ ダウンロード: PICT19

これは、虫を閉じ込められないように見えます(?)


BugTrap-Picct18 
⇒ ダウンロード: PICT18

これは、閉じ込めに成功します。


BugTrap-Pict17 
⇒ ダウンロード: PICT17


このパターンは、ピクセル3個です (左下の点は無視してください、実際に動作させると虫が通過して消えます)。おそらく閉じ込めに成功する最小ピクセルパターンではないかと思います。


障害物パターンの保存

[2015/08/14 追記]
障害物パターンを PICT15 に自動保存するように変更しました。しかし、PICT15 に決めて保存するのが不都合の場合は、以下のプログラムソースにある StoPict 15 を削除するか、行頭に ' 記号を追加してコメント行にすることで、自動保存をさせないようにできます。この場合は、以下の方法で、好きな Pict # (1 ~ 20) に画面コピーができます。

コメントアウト記号 ' の入力方法 : プログラム入力画面で、BUGTRAP あるいは  BUGTRAP3 のプログラムを表示させたばかりの状態にします。画面下の右端に CHAR  が表示されていればOKです。これが表示されていない場合は [EXIT] を1回あるいは複数回押せば、そこかで CHAR が表示されます。プログラムコードで StoPict 15 の行頭にカーソルを移動させ、
 [F6] (CHAR) [F2] (SYBL) [▶] [▶] [▶] [▶] [▶] [▶] (右を6回) [EXE] 
で、コメントアウト記号 ' が入力できます。


例えは、以下のような障害物パターンを作るとします。

BugTrap2 

十字カーソルが表示されていて、この位置まで一筆書きするために、[EXE] を押すと、

BugTrap3 

線が秒がされてカーソルが消えます。カーソルが消えると DEL: Go! が表示され、描画モードへ移行できます。

右上に マークが表示されていて、プログラムがループを回っていて実行中であることが分かります。この時は fx-9860GII 内蔵の画面コピー機能は使えません。

この画面をコピーしたいのですが、先ず [DEL] キーを押して描画モードへ以降させてから、素早く [EXIT] を押します。すると、

TC10-Quit_Bye_2 

となり、ここで [EXE], [AC], [EXIT] のいずれかを押せばプログラムは正常終了しますが、この時点ではプログラムはまだ終了していません。

ここで、[SHIFT] (F6] (G↔T) を押すと、グラフィックス画面に切り替わります。

BugTrap4 

この画面の右上には、 マークが有りませんね。従ってこの状態では 画面コピーができます。
一旦描画モードに移行しているので、左下に移動中の虫(点)が見えています。

ここで、[OPTN] [F1] (PICT) [F1] (STO) を押すと、Store In Picture Memory ポップアップが現れるので、ここで Pict番号を 1~20 のいずれかを入力します。これで、画面コピーが完了しました。

PCリンクソフト FA-124 を使って、fx-9860GII から PC へこの画像データを転送することもできます。


面白いパターンが見つかったら、ぜひ教えて下さい。



プログラム

[2015/08/14 更新]
ペイントモードの操作の統一性が出すための修正(赤文字部の追加)を行いました。

ファイル名: BUGTRAP
'==Initialize==
ClrGraph
CoordOn
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0

'==Draw frame==
S-L-Normal
F-Line 0,62,0,0
F-Line 126,62,0,62
F-Line 126,0,126,62
F-Line 126,0,0,0

'==Paint mode==
Text 7,3,"EXE/→/↑/←/↓: Draw Wall
Text 13,3,"DEL: Go!"
63→X:31→Y
While 1
While Getkey
WhileEnd
Do
Getkey→K
Text 13,3,"DEL: Go!"
LpWhile K=0 Or K=47
K=44⇒Break
If K=31 Or K=68
Then
Text 13,3,"    " '8 spaces
Plot X,Y◢
Line
IfEnd
WhileEnd
Text 7,3,"             " '25 spaces
Text 13,3,"    " '8 spaces
StoPict 15

'==Draw dot==
62→B:2→A:-1→D:1→C
PxlOn B,A

'==Move dot==
While 1

'✶Set direction
If B=1 Or B=63
Then (-1)D→D
Else If A=1 Or A=126
Then (-1)C→C
Else
PxlTest(B+D,A)⇒(-1)D→D
PxlTest(B,A+C)⇒(-1)D→C
IfEnd:IfEnd

'✶Clear & Plot dot
PxlOff B,A
B+D→B:A+C→A
PxlOn B,A

Getkey=47⇒Break
WhileEnd

'==Normal end
StoPict 16
ClrText
Locate 9,5,"bye!"

⇒ ダウンロード: BugTrap

⇒ ダウンロードBugTrap3 (視認性向上した黒い三連星バージョン) [2015/08/11 追加]



Casio Basic グラフィックスのポイント

プログラム全体は、構造化プログラムになっていて、

初期化 (Initialize)
 ↓
ペイントモード (Paint mode)
 ↓
最初の点の描画 (Draw dot)
 ↓
点の移動 (Move dot)
While 1
  進行方向設定 (Set direction)
  点の削除と描画 (Clear & Plot dot)
WhileEnd
 ↓
正常終了処理 (Normal end)


と、ペイントモードの中身以外は、非常にスッキリしていると思います。

ペイントモード
ペイントモードでは、Plot コマンドと CoordOn を組み合わせて、左下を原点 (0,0)  として、位置を考えながら障害物を自由に描きます。Plot コマンドや Plot と組み合わせて使える Line コマンドは、十字カーソルを使った簡単なお絵かきツールを作るのには便利なので、これを使ってみました。Casio Basic ならではの機能です。Plot コマンドや Line コマンドについては、Casio Basic入門G04 を参照してください。

描 画
左下から虫(=点)が45度の角度で走り出します。PxlOff で点を消してから次の位置に PxlOn で点を描画します。これらのコマンドは物理座標系 (詳細は Casio Basic入門G07 参照) で動作し、座標指定に X と Y を使えません(仕様)。物理座標は縦方向を先に、横方向を後に指定するので、普通の (X, Y) 座標の感覚に合わせるため、座標値を (B, A) としています。そこで、PxlOn B,APxlOff B,A といった記述にしています。

虫が1歩進むとき、座標 (B, A) から (B+D, A+C) へ進むようにします。D や C は、-11 のどちらかにします。要するに虫の進みは DC の値で制御します。これらのプラスマイナスの符号が逆転すれば進行方向が90度変わります (反射します)。

ピクセルが2個以上、縦か横に繋がっているところに当たると90度方向転換します (実際は当たっていません、当たる直前に方向転換しています)。障害物が斜め線になっていて、当たるピクセルの上下左右の隣にピクセルが無い時は、反射せず突き破ります(そのピクセルを消去し、虫は直進し続けます)。

指定したピクセルが ON か OFF かを判定するコマンドは PxlTest( ) しか無く、このコマンドは物理座標で動作するので、点の消去と描画にも物理座標で動作する PxlOffPxlOn を使いました。

次に描画する点が ON か OFF かを PxlTest( ) コマンドで調べて、ON なら方向転換します。

障害物での方向転換は意外に簡単に記述できます。PxlTest(B+D,A)⇒(-1)D→DPxlTest(B,A+C)⇒(-1)C→C と、たったこれだけです。こうやって DC の値を更新してから、B+D→BA+C→A によって座標 BA を更新し、最後に PxlOn B,A を実行するだけで、方向転換した虫(=点) が描画できます。

PxlOn, PxlOff, PxlTest( ) については、Casio Basic入門 で取り上げる予定です。

正常終了処理
[EXIT] で正常終了します。fx-9860GII では、[AC] で強制終了するとプログラム編修画面になって、思わぬプログラムの変更をしていまう可能性があるので、そのリスクを減らすために正常終了させることにこだわってみました。実用プログラム作成へのこだわりです。正常終了すると、bye! と表示します (実験プログラムは別として、私が作成するプログラムはこれに統一しています)。



[2015/08/14 追記]
sentaro様が 同等機能の Add-in を作ってくれました。グラフィックスプログラムは アドインで作ると高速描画が可能になる良い例です。
なお、描画中に [MENU][EXIT] 以外の好きなキーを押せば、描画が劇的に高速化します(ターボ効果)。
⇒ ダウンロード: BugTrace.g1a (Ver 1.10)



以下の一連の Casio Basic が アドインプログラムになっていて、その一部に Drunk Bug があります

楽屋裏 - 酔っ払いの虫 (Drunk Bug)
楽屋裏 - 虫の閉じ込め (Bug Trap)
楽屋裏 - 虫の軌跡 (Bug Trace)


このアドインを再コンパイルや改造できるソース付き全ファイルのダウンロードは以下;
⇒ ダウンロード: BugTrace110.zip (Ver 1.10)






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

人気ブログランキングへ


FC2ブログランキングへ





keywords: fx-9860GII、CasioBasicプログラム関数電卓コメントアウトバグ

リンク集 | ブログ内マップ
関連記事

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

楽屋裏 - 酔っ払いの虫 (Drunk Bug)

楽 屋 裏 - Drunk Bug
e-Gadget

修正 2015/07/20
追記 2015/07/21
追記 2015/08/04
追記 2015/08/14

Casio Basic入門で、fx-9860GII でのグラフィックスプログラミングを取り上げています。
取扱説明書には殆ど情報が無いので、各コマンドの仕様を細かく調べ、実際に動作させて確認しています。そこで、グラフィックスのちょっとしたプログラムを紹介しようと思います。

今回は、シミュレーションゲーム Drunk Bug です。グラフィックス描画が遅くても、十分楽しめるプログラム例だと思います。



Drunk Bug の説明

箱の中に、酔っ払った虫を一匹放り込みます。コイツは千鳥足で歩き回ります。次の瞬間どちらへ進むか全く予想がつかず、ランダムな歩みです(ランダムウォーク理論や酔歩理論の前提となる動作です)。

この虫は、歩くと糞を落とします。自分の糞があれば食べてきれいに掃除してくれます。箱の端に来ると、クルッと方向転換します。

そんな 酔っ払い虫 を箱に放り込んだ時の様子をグラフィックスで表現してみました。



プログラムの説明

虫を PlotChg コマンドで描画しています。描画位置に点が無い場合は点を表示し(=糞を落とす)、描画位置に点が有る場合は消去し(糞を食べ)ます。

虫が1歩進む時の座標は、(x, y) から (x±1, y±1) へ変化しますが、± かをランダムに決めます。1から10のランダム整数を発生させ、それを2で割った余り (Mod 関数使用) を求めると 01 になります。余りが 1 の時 で、0 の時 としています。

虫が箱の端に居る時だけ、座標値を先に 2 と反転の準備をしておいてから、±1 すれば、無駄な追加処理なしで進む方向が反転します。

[2015/07/21 追加] プログラム実行中に [EXIT] キーで一旦停止、[EXE] キーで実行継続の機能を追加(1行追加)。これで、一旦停止中に [SHIFT] [F6] (G↔T) でグラフィックス画面に切り替えて画面コピーができるようにしました。fx-9860GII には画面保存の機能が有り、保存した画像をPCに転送して、下にある実行画面の画像を得ました。
[2015/08/04 追記]
[EXIT] で一旦停止し [SHIFT] [F6] でグラフィックス画面を表示させた時の画像保存は、キー操作 [OPTN] [F1] (PICT) [F1] (STO)を行い、Pict# の番号を入力して最大20枚の画像まで保存できます(Pict# を手元に控えておきます)。その後 PCリンクソフト FA-124 で fx-9860GII と PC を接続して保存した画像をファイル変換して取得します。具体的な操作方法は、FA-124 Ver 2.04 のマニュアル 58ページに従って、控えておいたPict# を使って画像を一旦表示させ、それをPCに画像ファイルとして保存します。

ファイル名: DRUNKBUG
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0  (座標系の設定)
PlotOn 63,31               (初期位置に虫を描画)
Text 1,1,"EXE: Start"◢       (一旦停止)

Text 1,1,"AC: Quit "
 (スペース2個)

While 1
RanInt#(1,10)→P      (1から10のランダム整数を得る)
RanInt#(1,10)→Q      (1から10のランダム整数を得る)

If MOD(P,2)           (ランダム整数を2で割った余り→ 0 か 1 を得る)
Then X≥126⇒X-2→X    (右端で反転の準備)
X+1→X               (一歩進む時の X座標値)
Else X≤0⇒X+2→X       (左端で反転の準備)
X-1→X                (一歩進む時の X座標値)
IfEnd

If MOD(Q,2)           (ランダム整数を2で割った余り→ 0 か 1 を得る)
Then Y≥62⇒Y-2→Y      (上端で反転の準備)
Y+1→Y                (一歩進む時の Y座標値)
Else Y≤0⇒Y+2→Y       (下端で反転の準備)
Y-1→Y                 (一歩進む時の Y座標値)
IfEnd

PlotChg X,Y            (1歩進んだ虫を描画)
Getkey=47⇒"[EXE] to Resume"◢
WhileEnd

fx-9860GII 用 プログラムファイルのダウンロードDrungBug.g1m

(改訂・修正部分は赤文字で示した。ダウンロードファイルも改訂・修正している。)


虫の様子を見ていると、左上の AC: Quit まで糞と間違えてガツガツ食べることもあります。プログラムを再起動すると、虫の動きが全く異なることもあって、ランダムの世界は、なんだか不思議な感じですね。




DrunkBug_Pict20 

DrunkBug_Pict19 

DrunkBug_Pict18 

DrunkBug_Pict17 



Casio Basic グラフィックスのポイント

プログラミングに慣れた方なら、オヤッと思う点が1つあると思います。

ViewWindow のすぐ下で、PlotOn 63,31 で虫の初期位置を描画しています。

本来ならば、
63→X:31→Y
PlotOn X,Y


で、変数 X, Y の初期化とそれを使った初期描画をすべきですが、XY の初期化をせずに PlotOn 63,31 を実行し、その後の処理で初期化していない XY を使って、いきなり PlotChg X,Y を実行しています。

これで良いのか?

通常のプログラミング言語では、必ず初期化してください。

ところが、この Casio Basic プログラムを実際に動作させると、確実に初期位置から虫が歩きます。偶然ではありません。

Casio Basic の PlotOn コマンドは、描画をすると、その位置の X座標値を変数 X に、Y座標値を変数 Y に自動的に代入する仕様なのです。だから、PlotOn 63,31 を実行するだけで、変数 X, Y の初期化が行われます。この仕様は便利な反面、知らないと 意図しないところで XY の値が変更されるバグで悩まされるでしょう。


[2015/08/14 追記]
sentaro様が 同等機能の Add-in を作ってくれました。グラフィックスプログラムは アドインで作ると高速描画が可能になる良い例です。
なお、描画中に [MENU][EXIT] 以外の好きなキーを押せば、描画が劇的に高速化します(ターボ効果)。
⇒ ダウンロード: BugTrace.g1a (Ver 1.10)

以下の一連の Casio Basic が アドインプログラムになっていて、その一部に Drunk Bug があります

楽屋裏 - 酔っ払いの虫 (Drunk Bug)
楽屋裏 - 虫の閉じ込め (Bug Trap)
楽屋裏 - 虫の軌跡 (Bug Trace)


このアドインを再コンパイルや改造できるソース付き全ファイルのダウンロードは以下;
⇒ ダウンロード: BugTrace110.zip (Ver 1.10)








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

人気ブログランキングへ


FC2ブログランキングへ





keywords: fx-9860GII、CasioBasicプログラム関数電卓コメントアウトバグ

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門G07

Casio Basic入門
<目次>

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

更新 2015/08/09



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


前回: Casio Basic入門G06

Chapter G07
点線と ViewWindow

今回は、点線の描画について、詳しく調べます。
点線のスタイル設定については、fx-9860GII の取扱説明書(fx-9860GII_Soft_J_2.04.pdf)の 8-24 ページには、

SketchDot <Sketch文またはGraph文>

と記載があるだけです。今回は、点線を自由自在に描く方法を探りながら、グラフィックスプログラミングを詳しく調べてゆきます。



先ず最初に、点線を並べて以下のような描画を行う方法を調べます。

DLINE2s 

なかなか奥が深いことが分かりました。


前回作った点線を描画するプログラム DLINE1.1 は、以下です。

ファイル名: DLINE1.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0

SketchDot F-Line 0,31,126,31


これを実行して、LCD画面を細かくみると、点線は、ピクセルが交互にON になっています。

DLINE1.1 

点線はピクセルの ON と OFF が交互に並んだものですが、この ON/OFF のパターンを逆にできるのか?逆にするにはどうすれば良いのか? ここから調べて見ます。

と言うのも、点線を描画する書式;

SketchDot F-Line x1,y1,x2,y2
SketchDot Horizontal y


などには、ピクセルの ON/OFF の順序を指定するパラメータがありません。そこで、試しに長さの異なる点線を並べて描画させてみると、おもしろいことが分かります。

ファイル名: DLINE2.1
ClrGraph
CorrdOff
GrifOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0

For 0→Y To 62
SketchDot F-Line 0,Y,Y,Y
Next


⇒ ダウンロード: DLINE2.1


SketchDot F-Line 0,Y,Y,Y

は、座標(0, Y) と座標(Y, Y) の間を点線で結ぶことを指示しています。

そして、For ループで、Y=0 の時から始めて、点線を描き、Y を1つづつ増やして、Y = 62 になるまで点線の描画を繰り返しています。

For 0→T To 62
SketchDot F-Line 0,Y,Y,Y
Next


Y=0 の時は、
座標(0, 0) と 座標(0, 0) を結ぶとなりますが、要するに 点(0, 0) に点を描くことになります。

Y=1 の時は、
座標(0, 1) と (1, 1) の間を結ぶ点線を描きます。Y座標値が 1 の位置に点線が描かれます。

Y=2 の時は、
座標(0, 2) と (2, 2) の間を結ぶ点線を描きます。Y座標値が 2 位置に点線が描かれます。

・・・・・・・・・・

最後に、Y=62 の時、つまり画面の一番上に点線を描きます。

では、ピクセルの ON と OFF のパターンが実際にどうなるのか、このプログラムを実行して確認します。

DLINE2.1 

右端のピクセルが必ず ON になっています。言い換えれば、

SketchDot F-Line 0,Y,Y,Y

で線を描画する2つ端の端点の座標 (0, Y) と (Y, Y) のうち (Y, Y) に対応するピクセルが必ず ON になっています。つまり、点線描画の内部仕様がはっきりしました。

SketchDot F-Line の描画仕様

書式: SketchDot F-Line x1,y1,x2,y2
  • 座標 (x1, y1) と座標 (x2, y2) を結ぶ点線を描画する。
  • 座標 (x2, y2) に対応するピクセルは ON になる。
  • 座標 (x2, y2) から (x1, y1) へ向かって描画される。
最後の項目は、fx-9860GII オーバークロックツール Ftune2 を使って、逆にダウンクロック (3.69MHz) で描画させて確認しました。つまり、座標 (x2, y2) に対応するピクセルを先ず ON にしてから、(x1, y1) へ向かって順に描画していることになります。

上のプログラムでは、ViewWindow座標系で (x1, y1) が左端の位置、(x2, y2) が右端の位置だったのですが、逆に、(x1, y1) に右端の位置、(x2, y2) に左端の位置を指定すると、どうなるでしょうか?

(x2, y2) のピクセル、つまり左端のピクセルを ON にしてから、右へ描画が進みます。従って、左端が必ず ON になるはずです。実際に試してみましょう。

ファイル名: DLINE2.2
ClrGraph
CorrdOff
GrifOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0
For 0→Y To 62
SketchDot F-Line Y,Y,0,Y
Next


⇒ ダウンロード: DLINE2.2

これを実行してみます。

DLINE2.2 

左端が必ず ON になっていることが確認できました。点線のピクセルの ON/OFF パターンが全て同じになっています。

従って、上下左右のピクセルを交互に ON/OFF するパターン(千鳥格子のパターン)にするには、プログラム DLINE2.1 のように右端を常に ON になる点を交互に1ピクセルずらすようにすれば良いことが確認できました。

==========

点線を描画する SketchDot F-Line の描画仕様が、SketchDot コマンドによるのか、F-Line によるのかを確かめるために、次のプログラムを作り、さらに クロックアップツール Ftune2 を用いて、逆にクロックを落として処理速度を極端に遅くして、実際の描画の様子を調べました。

ファイル名: LINE1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0
F-Line 0,10,126,10◢
F-Line 126,20,0,20◢
Horizontal 30


⇒ ダウンロード: LINE1


オーバークロックツール Ftune2 を使って、逆に 1.84MHz までクロックを落としたところ、

F-Line 0,10,126,10 は右 (126, 10) から左へ描画され,
F-Line 126,20,0,20 は左 (0, 20) から右へ描画され、
Horizontal 30 は左から右へ描画されることが分かります。

Ftune シリーズは国産 (sentaro様作) のアドインプログラムで、海外の Casio プログラム電卓愛好家からも高い評価を受けるようになっているもので、かなり安全に使えるものです。PCのオーバークロックツールなどに比べて、様々なところに安全に使える配慮がなされています。管理人は愛用しており、大変便利なものです。当ブログでは、今のところ作者から直接サポートを受けられますので、ご興味があれば Ftune シリーズのページをご覧ください。但し、万が一ハードウェアが損傷を受けた場合、メーカー保証が受けられないことから、広く一般的に使用を勧める性格のものではないことを申し添えておきます。

さて、プログラム LINE1 の2つの F-Line の描画方向の実験結果から、

F-Line x1,y1,x2,y2

は、座標 (x2, y2) から (x1, y1) へ描画されることが分かりました。

つまり、SketchDot F-Line による点線の描画仕様は、F-Line の描画仕様によることも確認できました。

F-Line にスタイル設定をした時の描画仕様は、他にも色々ありますが、これについては次回取り上げることにして、画面全体にピクセルを交互にON/OFF して描画する今回のテーマについて、もう少し調べてゆきます。



座標系での位置と物理的なピクセルの位置

グラフィックスの描画とは、簡単に言ってしまえば、LCDのピクセルを ON/OFF させることに尽きます。この単純な操作を、様々なコマンドを使って便利に行うのが、グラフィックスプログラミングと言えます。

ピクセルは、物理的な大きさを持つ描画単位で、ピクセルの描画(ON/OFF)のためには、ピクセル位置を指定する必要があります。ピクセルの中心がピクセルの位置で、ピクセル座標 (Xpix, Ypix) を指定して、描画(ON/OFF)を行います。

fx-9860GII で使える座標系の1つに物理座標系があります。これはピクセル座標 (Xpix, Ypix) を直接指定する座標系です。
座標系とピクセル位置2 
グラフィックス描画エリアの左上の位置を (Xpix, Ypix) = (1, 1) とし、座標値は Xpix = 1, 2, ... 63 の整数、Ypix = 1, 2, ... 127 の整数です。物理座標系では、座標値に小数を設定するとエラーになります。1pix はピクセル1個の大きさなので、ピクセル座標系は実際のピクセルサイズを単位とした座標系といえます。ピクセル座標系をピクセルサイズに関係無いように抽象化したものが物理座標系で、原点を (1, 1) としているのは、ピクセルを1個、2個とカウントする感覚と一致しています。

次に、グラフィックス描画エリアの範囲について、ピクセル座標系と物理座標系の違いをみてみます。グラフィックス描画エリアは、実際に大きさを持つピクセルが 127個 x 63個並んだ範囲、つまり 127pix x 63pix の範囲(広さ)です。一方で物理座標系は、ピクセルの大きさの概念を無くした抽象的な座標系なので、その範囲はピクセル中心の座標で決まります。ピクセル中心で考えた場合、左端のピクセルと右端のピクセルのそれぞれ中心間の距離は 126pix (127pix でないことに注意) で、上端のピクセルと下端のピクセルの中心間の距離は 62 pix (同様に 63pix でないことに注意) となります (上図参照)。従って物理座標系の範囲は、126 x 62 になります (pix 単位が無いことに注目)。

Text , PxlOn, PxlOff, PxlChg, PxlTest( ) コマンドは、物理座標系で動作します。 これらのコマンドをプログラムで使うと、指定した座標は、そのままピクセル座標として描画に使われます。X座標軸が上から下、Y座標軸が左から右の方向になっていることに注意が必要です。

なお、物理座標系はプログラムで明示的に設定することはできず、上記のコマンドを使う時だけに適用されるものです。

上記のコマンド以外のグラフィックスコマンドは、論理座標系やViewWindow座標系で使います。

==========
座標系とピクセル位置4 
論理座標系は、画面の中央を原点 (0, 0) とし、
  • 座標値 X は、0.1 刻みの値 X = -6.3, -6.2, -6.1, ..., -0,2, -0.1, 0, 0.1, 0.2, ..., 6.1, 6.2, 6.3 が、Xpix = 1, 2, ..., 125, 126 に対応します。
  • 座標値 Y は、0.1 刻みの値 Y = -3.1, -3.0, -2.9 ..., -0.2, -0.1, 0. 0.1, 0.2,  ..., 2.9, 3.0, 3.1 が、Ypix = 1, 2, ..., 62, 63 に対応します。
座標値に、上記の範囲外の値や 0.1 刻みでない小数を設定してもエラーになりません。論理座標系は、物理座標系よりもさらに抽象化を進めた座標系と言えます。その結果、ピクセル座標系との1対1の関係は崩れています。

ピクセル座標系との1対1の関係が崩れる一例として、座標 (0.05, 0) の位置に描画した点は (0.1, 0) に描画した点と重なります。

確認プログラム
ClrGraph
CorrdOn
GridOff
AxesOff
LabelOff
Plot 0.05,0◢
Plot 0.1,0


このプログラムでは、ClrGraph により自動的に論理座標系に設定されることを利用しています。
これを実行してみると、Plot 0.05,0◢ で表示される十字カーソルの位置は、X=0.1, Y=0 となっています。[EXE] を押して、次の Plot 0.1,0 を実行すると、同じ位置にカーソルが表示されます。カーソルを移動させると点が1個しか描画されません。このプログラムで Plot コマンドに指定した座標値は、描画処理のためにピクセル座標系の座標値へ変換されますが、論理座標系の 0.1  がピクセル座標系の 1 に対応するので、0.05 が四捨五入されて 0.1 に換算されてから、描画処理が行われていることが分かります。

==========

さて、ViewWindow座標系は、論理座標系を自由に拡張したものです。従って、論理座標系を ViewWindow座標系で設定することもできます。

・論理座標系: ViewWindow -6.3,6.3,0,-3.1,3.1,0

例えば、ViewWindow 0,126,0,0,62,0 で設定した ViewWindow座標系は以下のようになります。
座標系とピクセル位置1 
左下隅を原点 (0, 0) として、座標値が1刻みでピクセル1個に対応させた座標系です。プログラムで座標値に整数を使えば、確実にピクセルと1対1に対応できて、分かりやすいですね。そのため、この座標系を多用しています。

==========

ViewWindow座標系は、好きな位置を原点にして、X軸方向(左右方向)やY軸方向(上下方向)を好きな方向で好きな範囲を指定できるのが最大の利点です。座標値に小数を設定できる(エラーにならない)のは論理座標と同じです。

ViewWindow 0,126,0,0,62,0 で設定した座標系では、X座標値やY座標値が整数の場合は、ピクセルの位置と一致するので分かりやすいと上で述べました。例えば、座標値を (10, 10) から (11, 10) に変えると、描画されるピクセルの位置は右隣のピクセルへ変化します。ところが、座標値が (10, 10) から (10.2, 10) へ変化した場合は、同じピクセルを指すことになります。
座標系とピクセル位置3  
この座標系では、X座標軸(横方向)の幅は 126 で、ピクセル座標系での横幅も 126 なので、X座標値 1 にピクセル1個が対応しています。つまり、座標値が 1 刻みに変化すると、実際に描画されるピクセルが1つ変化します。ピクセル1個に相当する座標値の刻みは、Xdot という変数で管理されていて、この刻みの値は自動的に Xdot に収められます。上の ViewWindow座標系では、Xdot = 1 です。プログラムで Xdot を参照したり、設定ができます。

Xdot の入力方法[VARS] [F1] (V・WIN) [F1] (X) [F4] (dot)

ClrGraph コマンドで 自動的に論理座標系が設定される時は、ViewWindow での設定がなくても Xdot = 0.1 となり、自動的に計算され Xdot に格納されます。Xdot の値は座標系が変更されるまでは保持されます。Xdot の挙動は実際に Casio Basic プログラムで確認できます (ここでは割愛しますが、興味があれば確認してみてください)。なお、Ydot もグラフィックス描画の際には必ず内部で計算しているはずですが、何故だかプログラムで参照可能な変数 Ydot はありません。

参考までに、ViewWindow の設定 (直交座標) で指定する各パラメータは

ViewWindow Xmin,Xmax,Xscl,Ymin,Ymax,Yscl

として、それぞれが変数として参照できます。逆に、現在設定されている ViewWindow 設定のうち、これら変数を使って特定のパラメータだけをプログラム内で変更できます。

内部的には、(Xmax-Xmin)÷126=Xdot が成り立つように、各パラメータが自動的に計算されまが、幾つかの条件があるようです。
  • XmaxXmin のいずれか、或いは両方が変更されると Xdot が自動的に変更される。
  • Xdot が変更されると、Xmin を変えずに Xmax が自動的に変更される。
  • Xdot に負の数を設定するとエラーになるが、逆に例えば 6.3→Xmin:-6.3→Xmax とすると Xdot-0.1 となる (X座標の向きを反転させる例)。
いずれにせよ、ViewWindow 座標系は、設定やパラメータの変更や参照が柔軟に行えます。

話を元に戻すと、ViewWindow の設定を行うと、以下の計算を自動的に行って ピクセル座標系の座標値 (XpixYpix)を算出して描画を行っています。
  • (Xmax-Xmin)÷126→Xdot の処理
  • 描画のために使われる X座標値 X から X÷Xdot を計算、これから Xpix を求める。
  • Xpix = X÷Xdot は整数値でなければならないので、小数の場合は四捨五入で Xpix を算出
従って、PlotOn 10,10PlotOn 10.2,10 が同じ描画結果になります。

Y 軸方向については、Ydot が変数として準備されていませんが、同じ計算を行っています(下記参照)。

==========

fx-9860GII のCasio Basic では、グラフィックス描画エリアが ピクセル数で 127個 X 63個と変則的で、プログラミングに慣れた人は 128個 X 64 個が描画エリアだと思い込んで、勘違いしやすいと思います。そして明かにこの勘違いによって、座標系設定を

ViewWindow 0,127,0,0,63,0

としているプログラム例をホームページやブログでたまに見かけます。Casio Basic の動作を正しく理解していれば、そしてタイプミスでなければ、このような設定にはしないと思います。

目的のプログラムが目的通りに動作すれば、目くじらを立てることもでありませんが、たまたま問題が表面化していないので、間違いに気付かないだけの可能性が大いにあります。というのも、この設定にはプログラム通りに描画されない可能性を内包していて、要注意なのです。

描画のために設定した座標値から整数のピクセル座標値 に換算する計算過程から、この問題の可能性を想像できると思います。問題の具体例は以下で紹介します。



さて、今回の目標の描画は、以下のものです。

DLINE2s 

拡大してみると、

■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■

このように、点線の点が左右、そして上下に交互にずれるように描画する必要があります。

プログラム DLINE2.1 で分かったように、ピクセルを ON にしたい点の座標を、SketchDot F-Line の3つめと4つめパラメータで指定すれば良いので、例えば以下のようにすれば良さそうです。

ViewWindow 0,126,0,0,62,0
SketchDot F-Line 0,0,126,0
SketchDot F-Line 0,1,125,1


とすると、画面の一番下は X = 126 の位置のピクセルが ON、その1つ上は X = 125 の位置のピクセルが ON になるので、ON/OFF パターンがうまくずれてくれます。

試しに、点線を下から4本、パターンをずらして描画してみます。

ファイル名: DLINE2.3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0

Sketch F-Line 0,0,126,0
Sketch F-Line 0,1,125,1
Sketch F-Line 0,2,126,2
Sketch F-Line 0,3,125,3
Sketch F-Line 0,4,126,4


⇒ ダウンロード: DLINE2.3


これを実行すると、

DLINE2.3s 

確かに、点線の ON/OFF パターンが交互になっていますね。

では、この調子で、画面全体に点線を描画させましょう。

ファイル名: DLINE2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,62,0

For 0→Y To 62
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
Next


⇒ ダウンロード: DLINE2


下から上まで連続的に 点線を描画するため、For ループを使っています。
⇒ Casio Basic コマンドリファレンス - For ループ 参照

ポイントは、SketchDot F-Line の3つめのパラメータです。ここでは MOD( ) 関数を使っています。MOD(Y,2) は、Y2 で割った余りを計算します。Y が偶数の時、2 で割った余りは 0 なので 126-MOD(Y,2)126、奇数の時は、2 で割った余りは 1 なので 126-MOD(Y,2)125 になり、Y の値から自動的に ON にしたい右端のピクセルの位置が計算できます。

MOD 関数

・書式MOD (N,R)
  • N を R で割った余りを計算する。
  • N、R は整数。整数でないとエラーになる。
  • N、R には、関数、式、変数、、数値が使える。
・入力方法[OPTN] [F6] (▷) [F4] (NUM) [F6] (▷) [F4] (MOD)

これを実行すると、点線が下から上へ描画され、以下のようになります。

DLINE2s 



さて、DLINE2 を少し変更して、以下のプログラムを実行してみましょう。

ファイル名: DLINE3.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,63,0

For 0→Y To 63
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
Next


⇒ ダウンロード: DLINE3.1

上で、こうするとプログラム通りに描画されない可能性があると上で指摘した問題を、実際に試してみます。

ViewWindow座標系の Y方向(上下)の幅を 63 に拡大し、点線を Y座標値(上下位置)0 から 63 まで描画させます。

これを実行すると、以下のようになります。

DLINE3.1s 

画面中央がプログラムで意図した点線ではなく、Normal スタイルの線になっています。

==========

この横線が描画されている Y座標値を調べるために、DLINE3.1 を少し改造して、以下のプログラムにして実行してみましょう。

ファイル名: DLINE3.2
ClrGraph
CoordOn
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,63,0

For 0→Y To 63
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
Next
Plot

⇒ ダウンロード: DLINE3.2


CoordOn を設定しておいて Plot コマンドが一旦停止すると、十時カーソルが現れ、その位置の座標値が表示される機能を使います。

これを実行すると、以下のようになります;

DLINE3.2s 

Plot はプログラムの最後にあるので、一旦停止になっていて、十時カーソルを動かすと座標値が表示されます。このようにパラメータ無しで Plot コマンドが一旦停止になると、画面の中央に十時カーソルが現れる仕様です。Plot はデバッグツールとして役立つと思います。

カーソルはちょうど異常な線の上にあり、Y座標値は Y=31.5 と表示されています。このあたりで何か意図しないことが起きているようです。



そこで、Y=30 まで点線を連続描画させ、そこで一旦止めて、[EXE] を押すたびに点線を1本づつ描画させるようにして、描画の挙動を詳しく確かめるために、プログラムを改造します。

さらに幾つかの数値に注目して、それを表示させるようにします。
座標系とピクセル位置5  
注目する数値は、以下のものです。
  • Y : プログラムで点線を描画する Y座標値(上下位置)。プログラム上、正しく指定している。
  • Ydot : これは Xdot と同様に 1ピクセルに相当する Y座標値。Casio Basic では変数 Ydot が準備されていないので、Xdot を得る方法と同じ計算で Ydot を求めます。下端と上端のピクセル中心間の距離は 62pix (上図参照)。一方、最下端と最上端の距離は、今の ViewWindow 座標系では 63 です。従って、Ydot = 63/62 と算出できて、1 にならない。そもそもこれが原因。
  • Y/Ydot : 点線を描画する Y座標値を Y で指定している。Y/Ydot を計算して、Y座標値を pix 単位に換算する。今の場合、Ydot は整数でないので、Y/Ydot も整数でなくて小数となる。Y/Ydot = Y/(63/62) = 62Y/63 と算出できる。
  • Ypix : 実際に描画されるピクセル位置の値が Ypix で、これは整数値でなければならない。そこで Y/Ydot を小数点1桁で四捨五入したものを Ypix とする。Ypix = Round(Y/Ydot) = Int(Y/Ydot +0.5) = Int(62Y/63 + 0.5)で算出する。

ファイル名: DLINE3.3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,63,0

For 0→Y To 63
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
If Y≥30:Then
Text 1,1,"Y= "
Text 1,10,Y
Text 7,1,"Ydot= "
Text 7,22,63÷62
Text 13,1,"Y/Ydot= "
Text 13,30,"      " (スペース12個)
Text 13,30,62Y÷63
Text 19,1,"Ypix= Round(Y/Ydot "
Text 19,80,Int (62Y÷63+0.5)◢
IfEnd
Next

⇒ ダウンロード: DLINE3.3


これを起動すると、先ずは以下の画面が表示されます;

DLINE3.3-1s 

ここで、着目した数値は以下のようになっています。

Y=30
Ydot=1.016129032
Y/Ydot=29.52380952
Ypix= Round(Y/Ydot)= 30


プログラムでは最後に描画した点線の Y座標値(上下位置) Y は、Y=30 となっています。
Y/Ydot は、30から少しずれているが、四捨五入した Ypix は 30 となっていて、設定位置と同じ値になっています。
そして、実際に点線は正常に描画されています。

ここで、[EXE] を一回押すと;

DLINE3.3-2s 

点線が1本追加され、正常に描画されます。着目している数値の表示は以下;

Y=31
Ydot=1.016129032
Y/Ydot=30.50793651
Ypix= Round(Y/Ydot)= 31


プログラム上、点線を1本追加しているので、Y = 31 は正常、プログラムに問題はありません。
Y/Ydot は、ほぼ 30.5 になって、ズレが大きくなっていますが、四捨五入するとギリギリ 31。
Ypix は、なんとか 31 になっていて、実際に点線が描画された Y座標値(上下位置)は、プログラム上の設定値 Y と等しくなっています。

[EXE] をもう一回押すと;

DLINE3.3-3s 

異常な横線が現れました。既に一番上のあった点線の上に、新たな点線が上書きされて、Normal スタイルの線に変化したように見えます。

着目している数値は;

Y=32
Ydot=1.016129032
Y/Ydot=31.49206345
Ypix= Round(Y/Ydot)= 31


Y=32 になっているので、プログラム上は正しく動作しています。
Y/Ydot が 31.5 未満なので、四捨五入しても 32 にならない。ズレが大きくなってついに破綻した模様。
従って、Ypix=31 が 示すように、物理的な描画は Y座標値(上下位置) 31 になっている。点線が同じ Y座標位置に上書きされたことを裏付けています。
座標系とピクセル位置5   
分かりにくいかも知れないので、図を見ながら、もう一度描画挙動を追いかけてみます。

ピクセル1個あたりの Y座標値(Ydot)をこの座標系での値に換算すると、Ydot = 63/62 = 1.016... と 1 よりも多くなります。

プログラムで Y=30 に対して、対応するピクセル位置 Ypix (整数値)を割り出すために、fx-9860GII 内部で、先ず 指定した Y をピクセル1個の座標値 Ydot で割って、ピクセル座標系の位置 Ypix = 30.507... を得て、これを四捨五入して得られた整数値 Ypix = 31 の位置に描画します。

次に、1増やした Y=31 に対応するピクセル位置 Ypix (整数値)を割り出すために、同様に YYdot で割って 31.492... を得るものの、四捨五入すると、Ypix = 31 と、同じ位置になってしまいます。

従って、Y=30 の時と、Y=31 の時は、共に Ypix=31 の位置に点線を描画しますが、これら2つの点線は ピクセル ON/OFF パターンが逆になっているので、ON と OFF のピクセルを互いを埋めた結果、Normal スタイルの線になったわけです。

DLINE3.3 を再起動して、点線が Ypix=31 の位置に上書きされる様子を確認できます。

今回の異常な描画結果は、プログラムの問題 (バグ) ではなくて、実際の描画メカニズム、つまり内部仕様の結果だと分かりました。



もし、ViewWindw座標系の上下幅をもっと大きくすると、プログラムで指定する描画位置に対して、実際の描画位置は、さらに大きくズレることが十分に考えられます。

そこで、ViewWindow座標系の設定で、最下端を 0 、最上端を自由に設定した時、点線の描画位置がどのように破綻するのかを確認するプログラムを作ってみました。DLINE3.3 をベースに改造したので、あまり美しいロジックではありませんが、実用的なグラフィックスプログラミングを作るための、準備・練習のために作りました。3つの工夫を追加しています。

このプログラムでは、点線の追加だけでなく、削除もできます。Casio Basic には線の削除を行うコマンドが無いので、点線を描画するたびに画面コピーをとっておき、1つ前の画面コピーを表示することで、点線を削除したのと同じ効果を狙います。これには、StoPict / RclPict コマンドを使います。但し画面コピーできる枚数には制限があります。Casio Basicの仕様上、最大20枚です。しかしメインメモリに余裕がなければ、保存できる画面コピーの枚数はさらに減ります。従って、プログラムの最初で、1~20 の間の整数を入力させて、画像コピーの最大枚数を指定します。ちなみに、私の fx-9860GII はグラフィックスコマンドを色々と試すために多くのプログラムが保存されていて、画面コピー20枚も保存できない事情があって、20 以下の値を設定する必要があったので、このようにしていて、お行儀の良いプログラムになったと思います。

もう一つの工夫は、ViewWindowで設定する画面上端の Y座標値を自由に設定する点です。これまでは 63 の場合をみてきましたが、より大きな数を設定した時の異常の挙動を調べられるようにします。

3つめの工夫は、上記設定後、プログラムが走り出した時はフリーランで連続的に点線の追加表示を行い、異常が見つかったら [(-)] キーで表示を一旦停止する点です。fx-9860GII のノーマルクロックでは、グラフィックス描画が比較的遅いので、このようにしました。

一旦停止後は、[▲] キーで点線を上に1本追加、[▼] キーで一番上の点線を1本削除します。異常発生の前後で、点線をの追加と削除を繰り返すことができて、その際の注目数値の変化も確認しながら、じっくりと異常の挙動を調べられます。

フリーラン後は、[EXIT] で正常終了します。さらに、フリーランでの連続描画および[▲] キーで描画する点線が画面上端を超えると、正常終了します。

一応、実用プログラム作成を意識した作りにしました。


先ずは、入力するかダウンロードして、以下のプログラムを実行してください。

ファイル名: VW.LINE3
"Y-Value/V-Win Top"?→V
"Max Pict# (1-20)"?→Q
1→F:V→S

ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

ViewWindow 0,126,0,0,V,0

Text 1,90,"Pict#:"
Text 1,115,Q
Text 7,90,"Y-Val:"
Text 7,115,V

0→L
For 0→Y To V
SketchDot F-Line 0,Y,126-MOD(Y,2),Y
If F=0:Then
Text 1,1,"Y=  "
Text 1,10,Y
Text 7,1,"Ydot= "
Text 7,22,V÷62
Text 13,1,"Y/Ydot= "
Text 13,30,"       " (スペース13個)
Text 13,30,62Y÷V
Text 19,1,"Ypix= Round(Y/Ydot "
Text 19,80,Int (62Y÷V+0.5)◢
IfEnd

Whle 1

Do
F⇒Break
Getkey→K
LpWhile K=0

While Getkey
F⇒Break
WhileEnd

If FS:Then
MOD(Y,Q)+1→P
StoPict P
Y-Q+2→L:Y<Q-2⇒0→L
S-1→S
While Getlkey=41
0→F:Break
WhileEnd
Break

Else If K=47:Then
ClrText
Locate 9,5,"bye!"
Retuen

Else If K=28:Then
MOD(Y,Q)+1→P
StoPict P
L→M
Y-Q+2→L:Y<Q-2⇒-→L
L<M⇒M→L
Break

Else If K=37:Then
If Y=0:Then
-1→Y:break
IfEnd
If Y≦L:Then Y+Q→Y
MOD(Y-2,Q)+1→P
Else
MOD(Y-1,Q)+1→P
IfEnd
Cls
RclPict P
Y-2→Y
Break
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd

Next
ClrText
Locate 9,5,"bye!"

⇒ ダウンロード: VW.LINE3


プログラムの動作について、簡単に紹介します。

プログラムを起動すると、

VW.Line3.1

Y-Value/V-Win top? 

と表示されますが、これは、ViewWindow 設定での 画面上端の Y座標値の入力を求めています。これまでは、63 の時の挙動を調べましたが、65, 70 など大きな数を入力してどうなるのかを調べられます。今は、65 を入力してみます。

入力して [EXE] を押すと、

VW.Line3.2 

今度は、

Max Pict# (1-20)?

と表示され、点線削除のための画面コピーの最大枚数を 1~20 の範囲の整数で入力します。
ここでは、10 を入力して [EXE] を押してください。

すると、破線が下から上へ連続的に描画されてゆきます(スキャンモード)。

ここで、異常が現れたら [(-)] キーを押して、描画を止めて下さい。

VW.Line3.3 

描画が止まり、着目している数値も表示されます。

ここで、[▼] キーを押すと、一番上の点線が消え、着目している値も変化します。

VW.Line3.4 

異常の線が一番上に来るまで [(-)] を何回か押してください。

VW.Line3.5 

着目している数値のうち、YYpix を見ると、Y=11Ypix= Round(Y/Ydot) = 10 と表示されています。YYpix が一致していないので、確かに異常です。

もう一度 [(-)] キーを押すと、

VW.Line3.6 

YYpix がともに 10 になって一致し、描画の異常も消えました。

ここで、[▲] を押すと、

VW.Line3.5 

上に点線が追加され、また異常が戻りました。

このようにして、異常の発生状況を、繰り返し確認できます。

なお、グラフィックスが描画されている時に [EXIT] を押すと、

TC10-Quit_Bye_2 

と表示して、正常終了するようにしています。
さらに、最初のフリーランによる点線の連続描画で、[(-)] を押さずに放置する時、および [▲] で最上端に点線を描画したあとさらに [▲] を押した時も、プログラム上は最上端描画の後にさらに点線を描画しようとすると正常終了するようにしています。

[▼] キーで点線を削除するために使う画面コピーの枚数は限られます。仮に 10 枚保存している場合、一番上の点線を含めて10本分の点線しか削除できないので、11本目を削除しようとすると、一番上の点線が描画された画面に一気に戻ることで、誤動作を防いでいます。

==========

ViewWindow 設定の画面上端の Y座標値を、70 など大きな数を試すと、1画面で異常が何度も発生することが分かります。例えば、65 にすると、異常が3回、70 にすると異常が8回現れます。異常がが現れる回数が多くなるほど YYpix のズレはさらに大きくなることが確認できます。

==========

ところで、万一メモリ不足でエラーになった場合は、画面コピーのデータを削除する必要があります。

エラーの出たプログラムを [AC] で強制終了し、[MENU] を押して MAIN MENU を表示します。

MENU 

ここで MEMORY アイコンを選択して [EXE] を押して、Memory Manager 画面を表示します。

MemoryManager 

続いて [F1] (F1:Main Memory) で、Main Mem を表示します。

MainMem1 

残りメモリが 17144バイト だと表示されています。


<PICTUR> があります。これは、StoPict コマンドで画面コピーした画像データが入ったフォルダです。
そこで、矢印キーで、<PICTURE> にカーソルを合わせ、

MainMem2 

[F1] (SEL) を押すと、

MainMem3 

<PICTURE> が選択され、左に  マークが付きます。

ここで、[F6] (DEL) を押すと、

MainMem4 

ポップアップ画面が現れて、選んだデータを全て削除しますか?と聞いてくるので、[F1] (Yes:[F1]) を押すと

MainMem5 

 <PICTUR> フォルダが削除され、残りメモリが 37824バイト に増えました。

[MENU]MAIN MENU に戻り、

MENU 

PRGM アイコンで Program List 画面へ移ります。

==========

座標系の座標値からピクセル座標への換算計算で、うまく割り切れない時に、意図した描画ができないケースを条件を変えて再現する目的で、このプログラムを作りました。

それだけでは面白くないので、実用的なグラフィックスプログラムを想定して、画面コピーの使いこなしを試みました。一応、構造化プログラミングになっています。ここ重要 (^_-)

PCと異なり、fx-9860GII では、画面コピーの枚数には限りがあるので、例えば、Pict 1 から Pict 10 を有効活用する方法を試しました。Pict 1 から順に画面コピーをしてゆき Pict 10 まで使った後は、Pct 1 へ戻って順に上書きするようにしています。いわゆる「リングバッファ」とか「リングメモリ」と言われる手法で、限られたリソースを有効活用するものです。

実際は、点線を1本描画するたびに、画面コピーして、Pict 1 から順に Pict 10 までコピーしてゆきます(画面コピー枚数が 10 枚の時)。Pict 10 の次は Pict 1 へ戻って上書きしてゆきます。

変数 PPict# とし、Pの初期値は1、その後10まで1つづつ増やし、11 の代わりに P を 1 に戻します。点線描画の Y座標値から、Pict # である P を割り出すのに 剰余系の考え方を使っています。 画面コピーの最大枚数を Q に入れておき、Mod(Y,Q)+1→PPict# P を計算しています。For ループの中で動作させるので、状況に応じて Y の代わりに Y-1Y-2 から P を計算しています。

このリングバッファの管理のために、変数 P を現在の Pict# を示すインデックスとして使い、保存している画面コピーの中で点線が一番少ない時に最も上にある点線位置の Y座標を 変数 L で管理し、点線を追加描画する時に L を更新します。L の更新を正しく行うために、変数 M も使っています。L より下の点線を削除しようとした時は、削除せずに 保持している画面コピーで一番上まで点線が描画されている画面を表示するので、一気に点線が植えたようになります。

リングバッファの使い方としては、あまり良いサンプルではないのですが、興味のある方は、プログラムをじっくりと見てください。プログラム DLINE3.3 に無理矢理リングバッファを実装しています。 プログラミング本でリングバッファと言えば、必ず配列を使ってインデックス管理していますが、fx-9860GII ではアクセス速度が遅い行列やリストを敢えて使わないようにして、単なる変数でインデックス管理をしています。従って、決して美しい方法では無いのですが、Casio Basic に合わせた実装方法として、試しに作ってみました。




今回のまとめ
  • F-Line x1,y1,x2,y2 は、座標 (x2, y2) から (x1, y1) へ向かって描画される。
  • SketchDot F-Line x1,y1,x2,y2 は、先ず (x2, y2) に対応するピクセルを ON にし、(x1, y1) へ向けて、ピクセルを交互に ON/OFF にしてゆく。
  • SketchDot F-Line x1,y1,x2,y2SketchBroken F-Line x1,y1,x2,y2 は、ピクセルを ON にしたい座標 (x2, y2) を指定することで、ON/OFF のパターンを制御できる。
  • 物理座標系は、物理的大きさを持つピクセル座標系から大きさの概念を取り払い、抽象化した座標系。ピクセルに1対1対応した整数のみを座標値として使え、範囲外の整数や小数を座標値に設定するとエラーになる。
  • 論理座標系では、座標値の違いが 0.1 未満の場合は小数点以下2桁目で四捨五入され、0.1 刻みに換算される。一例として、座標 (0.05, 0) と (0.1, 0) 同じピクセルを描画する。
  • ViewWindow 座標系では、設定によっては、座標 (X, Y) とピクセル位置 (Xpix, Ypix) が必ずしも1対1に対応しない。
  • ViewWindow 座標系で 座標 (X, Y) とピクセル座標 (Xpix, Ypix) が1対1に対応しない時、期待した描画結果にならないことがある。

今回使ったグラフィックス コマンド
  • F-Line
  • SketchDot
  • MOD ( )
  • StoPict / RclPict


つづく...

Casio Basic入門 G08 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ







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

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


関連記事

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

楽屋裏 - ViewWindow

楽屋裏 - Casio Basic グラフィックスでの ViewWindow
e-Gadget


2015/08/09

Casio Basic入門で、グラフィックスプログラミングについて調べて、結果を公開していますが、おそらく ViewWindow コマンドが最大の山場、逆に言えばこれを制覇すれば Casio Basicグラフィックスプログラミングの8割が理解できんじゃないか、とまで思い始めています。

ViewWindow については、当初さらっと1回分の記事で終わるかと思っていたのが、3回に渡って触れても、まだ足りないのです。

というのも、色々な描画コマンドの詳細挙動は、調べれば調べるほど ViewWindow が絡んでくるので、アッチコッッチで絡んでいる話を、どうやってスッキリと切り離して整理できるのか、探索を続けながら試行錯誤しています。

昨日投稿した Casio Basic入門G07 は、実は全面書き直し4回目の内容です。書き直せば書きすほど、分かりやすくなってきました。現在のものが一番分かりやすいという自信もありませんが、先へ進めることを優先させました。

私自身、全てのコマンドを分かっているわけではなく、探索を進めながら、明かになったことを公開しています。従って、全体の進め方や取り上げる話題の順序など、予定がいくらでも変わってゆきます。自分自身の理解を深めることと、それを分かりやすく解説することの両立も当初思っていたように簡単ではないです。

当初の予定では、グラフィックスプログラミングに不可欠なループ処理についても、丁寧な解説を入れるつもりでしたが、そんな余裕も無くなっています。プログラミング理解の山場の1つがループ処理らしいと、最近気づき始めていますので、ここは少々残念です。

==========

ViewWinidow による直交座標系設定の各パラメータは、設定や参照ができるように、それぞれ変数が用意されています。

ViewWindow Xmin,Xmax,Xscl,Ymin,Ymax,Yscl

ところが、Xmin, Xmax, Ymin, Ymax がまたクセ者で、決して min や max というわけでないところが厄介です。

これら以外にも、Xfct, Yfct Factor, ZoomAuto, StoV-Win, RclV-Win, Xdot があります。

さらに、Xdot はあるのに Ydot がない、この非対称性も、何か理由があるのでしょうが、今のところ不明です。2グラフ表示機能があって、グラフを2つ左右に並べて表示できます。それが証拠に、RightXmin, RightXmax, RightXscl, RightXdot, RightYmin, RightYmax, RightYscl が別にあります。しかし RightYdot はありません。

Ydot の計算は内部で行っていることはほぼ確実ですが、何故ないのか?この非対称性の理由が不明で、何か落とし穴があるかも知れないと、気になっています。

さらに ViewWindow 設定には、まだ扱っていない極座標系もあります。

ViewWinndow の奥深さは、まだ底が見えていませんが、ViewWindow のコマンドリファレンスが書けるようになれば、おそらく残りのコマンドのリファレンスも比較的楽に書けるようになるだろう、と思います。

=====

ClrGraph コマンドについても、ViewWindow というか座標系設定が絡みます。これまで、ClrGraphGraph はグラフィックスだと決めてかかっていましたが、これはまさにグラフなんですね。グラフ設定をクリアするコマンドと考えればスッキリします。

グラフ電卓搭載だけあって、座標系設定への気合いの入り方は半端ではありません。カシオの頑張りも垣間見えます。

Casio Basicコンパイラ作成のことを考えながら調べていると、内部処理の定式化を考えるようになって、するとまだ突っ込みが足りないことも分かってきて、面白さ倍増です。






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

人気ブログランキングへ


FC2ブログランキングへ


keywords: プログラム関数電卓、fx-5800P、fx-9860GII、Casio Basic

リンク集 | ブログ内マップ
関連記事

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

Casio fx-JP900 (その3)

  更新 2015/08/05

fx-JP900
fx-JP900 は、なかなかエポックメイキングな新製品で、高精細液晶(黒液晶)の採用と日本語表示、CPUの高速化というハードウェアの大きな進化が見られます。

実は、fx-JP900 の1つ前のモデル fx-995ES は、ソフトウェアにおいて関数電卓としての新機能搭載と重要な改善が多くなされ、関数電卓としての大きな進化を遂げたモデルと言えます。但しデザインや主要なハードウェアは fx-993ES に近いもので、fx-JP900 への移行モデルだった、と言えます。fx-995ES は、そのソフトウェア改善だけをとっても、エポックメイキングなモデルだと思っていました。

そんな fx-995ES を経て、ハードウェアが大幅に更新され1つの完成形としてJP900 が登場しました。当然ながらソフウェアについては、多くは fx-995ES を踏襲していますが、3桁区切り記号の追加など重要な改善もみられます。

fx-JP900 のソフトウェア上の新機能のなかで、統計計算での四分位数計算の追加、グラフ関数電卓には既に実装されているが関数電卓に初めて搭載された表計算機能があります。表計算については、Casio fx-JP900 (その2) で取り上げています。今回は、四分位数について、そしてCPUの高速化を見るために積分計算について取り上げます。

fx-JP900 は単なる関数電卓ですが、それまでプログラム電卓(グラフ関数電卓)に搭載されていた表計算が搭載されたこと、高精細液晶が搭載されCPUも高速化されたことから、近い将来のプログラム電卓への展開が気になるので、多くの文字数を使って取り上げています。

以下は、Casio fx-JP900(その2)の追記部分の後半の分量が多くなったので、別エントリーにしたものです。


全般的な操作系
fx-995ES、fx-993ES そして fx-5800P まで遡っても、fx-JP900 はキー配置の共通性が高いので、戸惑うこと無く操作できるのが有り難いです。ここにも、過去からのユーザーの継続利用を十分考慮したカシオらしさが現れています。


四分位数と箱ひげ図 - 統計とCLASSWIZ [2015/06/04 追記あり]
fx-995ES で初搭載され、fx-JP900/JP700/JP500 にも含まれている四分位数(第1四分位数、中央値、第3四分位数)の計算ですが、四分位数はよく知りませんでした。そこで、ネット検索してみたところ、2012年度から高校の数Iで教えるようになったとあります。不勉強なことに、これをグラフ化した箱ひげ図についても、どこかで見た気がする程度で、よく知りませんでした。

fx-JP900 の QRコード表示機能を使い、CLASSWIZ のWebサービスで箱ひげ図を表示してくれるので、興味を持ちました。
 
ざっと調べてみると、バラツキが大きいデータをざっくり分析するのに、四分位数や箱ひげ図が用いられるらしい。私自身はこれまで本格的とはいかないまでも、多くのデータを解析するのに、標準偏差、分散、二乗平均、平均、移動平均、差分、ヒストグラム、ガウス分布、ポアッソン分布、ワイブル・プロットなどの考え方を使っていますが、これで特に困ることはありませんでした。高校で必修になった四分位数や箱ひげ図は、ビッグデータ時代を反映しているのだろうか?と思い、仕事でも役に立つ可能性を感じたので、ちょっと調べてみました。

面白いことに、極めて多くの高校教科書では間違った記述がなされているらしいことが分かりました。

- 小林道正, データ分析における「「箱ひげ図」の誤解、中央大学論集, 第34号 (2013)

全く異なるヒストグラムを示すデータでも、箱ひげ図は全く同じになることが当然ありますが、箱ひげ図で示される四分位範囲が広いか狭いかで、データの散らばり具合(分散)を論じている点が、誤りだという指摘がなされていて、確かにその通りです。

教科書の著者や検定を行った人が、大きな勘違いをしていたと言うことでしょうか?だとすれば、ちょっとお粗末です。このような教科書で教えられた高校生は気の毒です。但し、現場の先生達はきっと誤りを修正して教えておられることとは思うし、2013年の教科書の誤りは、2015年版では既に改訂されていることを祈ります。

箱ひげ図と散布図を1つのグラフに書き込んで一緒に眺めたら、全体の傾向と特異的なデータを同時に把握できるので、これらの併用が良さそうだと思います。実際のデータ分析を行う時、特に箱ひげ図が役立つ局面がまだよく分からず、個人的にはもう少し勉強してみようとは思います。

但し、電卓のおかげで、良いきっかけをもらいました。プレゼンで話をうまく誘導する目的で使えそうです(但し自分で自分を騙してしまうことには要注意ですね!)。

[2015/06/04 追記]
仕事で色々な技術資料を目にしますが、今回の記事を書いた後、箱ひげ図にお目にかかりました(アメリカ人技術者が作った図です)。過去に箱ひげ図を見た記憶があまり無いのですが、そもそも知らなかったから気がつかなかったのかも知れません。
箱ひげ図 
上で、箱ひげ図は散布図と一緒に書けば、使い物になるだろうと書きましたが、まさに散布図と一緒に描かれています。少ないサンプル数の場合は、このように役立つことが分かりました。散布図だけよりも、箱ひげ図を重ねて描くことにより、中央値やデータの広がりが一目瞭然です。
=== [2015/06/04 追記] おわり ===


CLASSWIZ - グラフ表示のクラウドサービス
CLASSWIZ のWebサービスは、QRコードの表示ができる局面が限られており、主に学習用に考えられているように思います。 式情報をQRコードで渡して Web上でグラフ化するのは、クラウドサービスによる電卓の機能拡張と言え、グラフ描画機能がなくてもグラフが書けることを証明しています。面白いサービスですね。積分した結果をグラフ上の領域で表示するなどが出来れば、さらに面白くなりそうです。

また、電卓の液晶画面上の数式を、クラウドで画像ファイル化するのは、どのような用途を想定しているのでしょうか?


素因数分解

fx-995ES で素因数分解の機能が追加され、fx-JP900 にも搭載されています。fxJP900 では素因数分解が改良され、処理速度が速くなっています。幾つかの素因数分解結果を、fx-995ES、fx-JP900、fx-5800P のプログラム、カシオの高精度計算サイトKe!san で行った結果を一覧にしてみます。

整数fx-955ESfx-JP900fx-5800PKe!san
1,234,567127x(9721)127x9,721127x9721127x9721
98,765,43223x37x(333667)
(1.7秒)
23x37x333,667
(0.4秒)
23x37x333667
(27秒)
23x37x333667
9,516,208,47332x172x(3,658,673)32x172x(3,658,673)32x172x365867332x172x3658673
123,456,78932x(13717421)32x(13,717,421)32x3607x380332x3607x3803

fx-JP900 では、fx-995ES よりも計算速度が大幅に向上しています。

因数分解できない場合は ( ) 付きで表示される仕様で、そこは fx-955ES も fx-JP900 も同じ。fx-995ES は素因数が4桁以上で ( ) 付きになっていましたが、fx-JP900 では素因数の桁数制限が大幅に緩和され、上の例ですと6桁まではOK。

ところで、fx-JP900 の取扱説明書17ページを見ると、素因数が 1,018,081 以上の時は計算エラーになると書かれていますが、上の1つめ、2つめ、3つめの例では、( ) 付きで結果が表示されています。これ以上計算できないが、たまたまそれが素因数だったと解釈すれば良さそうです。( ) 付きの場合は、それが正しいかどうかの保証が無いと言うことでしょう。

4つめの例では、( ) 付きの結果は、さらに因数分解できるが、これ以上計算できないことを示しています。

fx-JP900 では計算速度が速くなったことは、積分計算の速度向上で明かなのですが、計算可能な素因数の桁数が増えた理由に興味があります。計算速度が向上したらたタイムアウト設定を変えただけとは考えにくく、使用するメモリ量を増やしたのかロジックが変更されたとも考えられます。

なお、fx-5800P は自作プログラムで計算していますが、電卓の精度が保証されている10桁以内なら、時間が多少かかっても正しい結果が得られています。精度範囲ならば桁数制限とは無関係に計算するアルゴリズムなので、当然ではありますが、それにしても時間がかかります。桁数制限があっても高速化できないだろうか?と少し考えてみています。
Casio 関数電卓の素因数分解


積分計算
遠藤先生による関数電卓マニア のページで、以下の積分計算をさせてみると、fx-955ES に比べて fx-JP500 で非常に速くなったとの記載があります。
積分1 
そこで、実際に fx-995ES、fx-JP900、fx-5800Pfx-9860GII (ノーマルクロック、29MHz) で、実行時間を比較してみます。
さらに時間のかかる別の積分(下記)も測定してみます。
積分2 
この積分区間の下限は、0 としたいところですが、数値計算をするとき x = 0 の場合に ln x がエラーになるので、電卓の仕様上精度が得られる範囲での最小値(1x10-10)を使っています。

ちなみに積分の式は、fx-JP900 で入力してQRコードを取得し、CLASSWIZのサイトから得た画像です。

機 種積分1
積分1
積分2
積分2
計算結果0.5
fx-995ES25.6秒4.7
241秒
4.9
fx-JP9005.5秒48.7秒
fx-5800P10.1秒1.856.7秒1.2
fx-9860GII1.5秒0.278.4秒0.17

fx-995ES に対して  fx-JP900 は、両方の積分ももぼ同じ比率で高速化されています。
一方、fx-JP900 に対して、fx-5800P と fx-9860GII は、積分1と2で処理時間の比率に差が出ています。積分1では、fx-5800P に比べて、fx-JP900 が大いに健闘していますが、積分2では差が少なくなっています。

この差が何によるのか? 興味はありますが、まだよく分かりません。



関連ページ:
- Casio fx-JP900
- Casio fx-JP900(その2)
- Casio fx-5800P や他の電卓の数値積分
- fx-JP900 と fx-5800P 後継機への期待




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

人気ブログランキングへ





keywords: fx-JP900fx-5800Pfx-9860GII関数電卓

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門G06

Casio Basic入門
<目次>

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

修正更新 2015/08/02



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


前回: Casio Basic入門G05


Chapter G06
F-Line と 線のスタイル設定

今回は、F-Line  コマンドと線のスタイル設定コマンドを調べます。
これらコマンドについては、fx-9860GII の取扱説明書(fx-9860GII_Soft_J_2.04.pdf)の 8-24 ページには、

F-Line <X座標値1>,<Y座標値1>,<X座標値2>,<Y座標値2>

SketchThick <Sketch文またはGraph文>

SketchBroken <Sketch文またはGraph文>

SketchDot <Sketch文またはGraph文>

SketchNormal <Sketch文またはGraph文>

Sketch...... は、線のスタイル設定コマンド.


と記載があるだけなので、実際にプログラムを作りながら細かい点を確認してゆきます。



最初に、軽くおさらい。以下のプログラム FLINE0.1 を作ります。

ファイル名: DLINE1.0
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0
F-Line 0,31,126,31

⇒ ダウンロード: DLINE1.0

後で使うので、入力/保存しておいてください。


F-Line コマンド

・書式F-Line <X1>,<Y1>,<X2>,<Y2>
  • 座標 (X1, Y1) と (X2, Y2) を端点として直線を描画する。
  • 座標は、論理座標あるいはViewWindow座標系に従う。
・入力方法[SHIFT] [F4] (Skeetch) [F6] (▷) [F2] {LINE) [F2] (F・Line)

これを実行すると、以下のようになります。

DLINR1.0 

グラフィックス描画エリアは、127ピクセル x 63 ピクセルなので、値1が1ピクセルに相当するように座標指定するのが、グラフィックス描画のポイントでした。
ViewWindow 0,126,0,0,62,0,0

F-Line コマンドで、画面中央に横線を引くには、座標 (X1, Y1) = (0, 31) と (X2, Y2) = (126, 31) の間に線を描画するように設定。
F-Line 0,31,126,31

プログラム冒頭の5行は、おまじないように設定しておくと良い。
但し ClrGraphCls でも良い。ClrGraph は、座標系を論理座標系に自動指定し、もし座標軸を描画すれば目盛間隔が1 になるように自動設定されるので、ある意味きちんと初期化されることから GlrGraph はおまじないに使えます。設定を変えたくない場合は Cls を使えば良のですが、今の設定が何かは不明なのでプログラム冒頭での Cls 使用の場面は限られると思います。



次に、画面中央に点線を描画しましょう。

ファイル名: DLINE1.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0
SketchDot F-Line 0,31,126,31

直線描画のプログラム DLINE1.0  に赤文字部分を追加しています。
⇒ ダウンロード: DLINE1.1

後で使うので、入力/保存しておいてください。


SketchDot コマンド

・書式SketchDot [描画(スケッチ)コマンド]
  • 1行で記述しないとエラーになる
  • 点線として線を描画
  • 有効な描画(スケッチ)コマンドには、F-LineLineVerticalHorizontalCircle が使える。
・入力方法[SHIFT] [F4] (SKTCH) [F6] (▷) [F6] (▷) [F5] (STYL) [F4] (・・・・・・)


上記を実行すると以下のようになります。

DLINE1.1 

なお、SketchDot を入力する時、他にも線のスタイル設定コマンドがあります。

DLINE1.1_スタイル設定 

これらを全て使ってみましょう。


ファイル名: DLINE1.2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0
F-Line 0,0,126,0
SketchThick F-Line 0,4,126,4
SketchBroken F-Line 0,8,126,8
SketchDot F-Line 0,12,126,12
SketchNormal F-Line 0,16,126,16

⇒ ダウンロード: DLINE1.2


最初に普通の線、続いて、太線 (SketchThick)、破線 (SketchBroken)、点線 (SketchDot)、そして 普通の線 (SketchNormal)を、4ピクセルおきに、下から上へ順に描画しています。
  • 太い = Thick (シック) ⇒ 太線
  • 破 = Broken (ブロークン) ⇒ 破線、コマンドを実行すると太い破線になります
  • 点 = Dot (ドット) ⇒ 点線
  • 普通 = Normal (ノーマル) ⇒ 普通の線、コマンドを実行すると線の装飾指定を付けない時と同じになります

SketchThick コマンド

・書式SketchThick [描画(スケッチ)コマンド]
  • 1行で記述しないとエラーになる
  • 太線として線を描画
  • 有効な描画(スケッチ)コマンドには、F-LineLineVerticalHorizontalCircle が使える。
・入力方法[SHIFT] [F4] (SKTCH) [F6] (▷) [F6] (▷) [F5] (STYL) [F2] ()

SketchBroken コマンド

・書式SketchBroken [描画(スケッチ)コマンド]
  • 1行で記述しないとエラーになる
  • 点線として線を描画
  • 有効な描画(スケッチ)コマンドには、F-LineLineVerticalHorizontalCircle が使える。
・入力方法[SHIFT] [F4] (SKTCH) [F6] (▷) [F6] (▷) [F5] (STYL) [F3] (----)

SketchDot コマンド

・書式SketchDot [描画(スケッチ)コマンド]
  • 1行で記述しないとエラーになる
  • 点線として線を描画
  • 有効な描画(スケッチ)コマンドには、F-LineLineVerticalHorizontalCircle が使える。
・入力方法[SHIFT] [F4] (SKTCH) [F6] (▷) [F6] (▷) [F5] (STYL) [F4] (・・・・・・)

SketchNormal コマンド

・書式SketchNormal [描画(スケッチ)コマンド]
  • 1行で記述しないとエラーになる
  • 点線として線を描画
  • 有効な描画(スケッチ)コマンドには、F-LineLineVerticalorizontalCircle が使える。
・入力方法[SHIFT] [F4] (SKTCH) [F6] (▷) [F6] (▷) [F5] (STYL) [F1] (―)


これを実行すると以下のようになります。

DLINE1.3 

==========

同じことを、別のコマンドを使って実現できます。

ファイル名: DLINE1.3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0

F-Line 0,0,126,0

S-L-Thick
F-Line 0,4,126,4

S-L-Broken
F-Line 0,8,126,8

S-L-Dot
F-Line 0,12,126,12

S-L-Normal
F-Line 0,16,126,16

⇒ ダウンロード: DLINE1.3

赤文字で示したコマンドは、線のスタイル設定を行います。


これらのスタイル設定後、普通の線を描画すれば、設定したスタイルが反映されます。

DLINE1.3 

S-L-Thick コマンド

・書式S-L-Thick
  • パラメータは無い。
  • これが設定されていると、描画する線が太線になる
  • F-LineLineVerticalHorizontalCircle などの描画(スケッチ)コマンドに使える。
  • 次に S-L-xxxx で設定されるまで、線のスタイル設定は保持される。
・入力方法[SHIFT] [MENU] [F6] (▷) [F2] (S/L) [F2] ()

S-L-Broken コマンド

・書式S-L-Broken
  • パラメータは無い。パラメータを付けるとエラーになる。
  • これが設定されていると、描画する線が破線になる
  • F-LineLineVerticalHorizontalCircle などの描画(スケッチ)コマンドに使える。
  • 次に S-L-xxxx で設定されるまで、線のスタイル設定は保持される。
・入力方法[SHIFT] [MENU] [F6] (▷) [F2] (S/L) [F3] (----)

S-L-Dot コマンド

・書式S-L-Dot
  • パラメータは無い。パラメータを付けるとエラーになる。
  • これが設定されていると、描画する線が点線になる
  • F-LineLineVerticalHorizontalCircle などの描画(スケッチ)コマンドに使える。
  • 次に S-L-xxxx で設定されるまで、線のスタイル設定は保持される。
・入力方法[SHIFT] [MENU] [F6] (▷) [F2] (S/L) [F2] (・・・・・・)

S-L-Normal コマンド

・書式S-L-Normal
  • パラメータは無い。パラメータを付けるとエラーになる。
  • これが設定されていると、描画する線が普通の線になる
  • F-LineLineVerticalHorizontalCircle などの描画(スケッチ)コマンドに使える。
  • 次に S-L-xxxx で設定されるまで、線のスタイル設定は保持される。
・入力方法[SHIFT] [MENU] [F6] (▷) [F2] (S/L) [F1] ()

これらの線のスタイル設定コマンド S-L-xxxx は、一旦設定されると、次に設定を変えない限り、その設定が維持されます。
これに対して、既に調べた Sketchxxxx コマンドは、その場限りのスタイル設定です。描画の効果は同じですが、設定の有効性が異なる点に注意が必要です。

==========

S-L-xxxx コマンドによる設定の有効範囲を確認するプログラムを作ってみます。

ファイル名: DLINE1.4
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0

" 0:No"
" 1:Thick"
" 2:Broken"
" 3:Dot"
" 4:Normal"
"Input menu#"?→M  (入力待ちして、入力されたテンキーの数字を変数 M に代入)

M=0⇒""           (何もせずテキスト画面で改行するだけ)
M=1⇒S-L-Thick
M=2⇒S-L-Broken
M-3⇒S-L-Dot
M=4⇒S-L-Normal
M≥5⇒Return

Prog "DLINE1.0"

⇒ダウンロード: DLINE1.4

このプログラムは、線のスタイル設定をするだけで、最後に既に作った普通の 直線を引くプログラム DLINE1.0 を呼び出して実行しています。このように直線描画を敢えて別プログラムで行わせているのは、スタイル設定 S-L-xxxx コマンドの有効範囲が、他のプログラムにまで及ぶのかどうかを確認するためです。
  • 出力命令" "入力命令?を使ったメニュー選択のコードを使っています。⇒ コマンドリファレンス 出力命令" "入力命令?参照
  • 別のプログラム呼び出しコマンド Prog を使っています。⇒ コマンドリファレンス Prog 参照
  • 条件分岐命令 ⇒ を使っています。⇒ コマンドリファレンス 条件分岐命令 ⇒ 参照
  • プログラム終了コマンド Return を使っています。⇒ コマンドリファレンス Return 参照
fx-9860GII での上記の各命令やコマンド類の入力方法;

・入力命令?[SHIFT] [VARS] [F4] (?)
・比較演算 = [SHIFT] [VARS] [F6] (▷) [F3] (REL) [F1] (=)
・条件分岐 ⇒[SHIFT] [VARS] [F3] (JUMP) [F3] (⇒)
・比較演算 ≥[SHIFT] [VARS] [F6] (▷) [F3] (REL) [F5] (≥)
・Return
[SHIFT] [VARS] [F2] (CTL) [F2] (Rtrn)

ここで使った命令やコマンドについての詳細な使い方については、Casio Basic入門38 を参照してください(但し、これは fx-5800P を前提にしているので、上の fx-9860GII での入力方法を参考にして読んで下さい)。


で、このプログラムを起動します;
DLINE1.4 

[1] (1:Thick) を押し、続いて [EXE] を押すと、

DLINE1.4 Thick 

太線が描画されます。つまり、描画(スケッチ)のスタイル設定が保持されていて、別のプログラムにも効果を与えることが分かります。

[EXE] を2回押して、Program List 画面へ戻ります。

再び、[EXE] か[F1] を押して、同じ DLINE.1.4 を起動します。

DLINE1.4 

ここで、[0] (0:No) 、続いて [EXE] を押すと、

DLINE1.4 Thick 

このように、S-L-xxxx を設定していないにもかかわらず、太線が描画されます。これで、一旦、線のスタイル設定を行うと、設定は保持されままであることが確認できます。

さて、このプログラムで、[1] (1:Thick) を選び、太線を描画させてから、[AC] で強制終了します。続いて、破線を描画するプログラム DLINE1.1 (既に作っています)を実行してみます。

DLINE1.1 

すると、太線にならず破線が描画されます。つまり、S-L-Thick よりも SketchThick が優先されることが分かります。

==========

このプログラムは、1つのスタイルを試したらプログラムが終了するので、他のスタイルを試すにはプログラムをもう一度起動する必要があります。繰り返しスタイルを試せる方が分かりやすいので、プログラムを改良します。

繰り返し実行させるには、ループを使えば良いので、以下のようにプログラムを変更してみます。

ファイル名: DLINE1.5
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0

While 1

ClrText

" 0:No"
" 1:Thick"
" 2:Broken"
" 3:Dot"
" 4:Normal"
"Input menu#"?→M

M=0⇒""
M=1⇒S-L-Thick
M=2⇒S-L-Broken
M-3⇒S-L-Dot
M=4⇒S-L-Normal
M≥5⇒Return

Prog "DLINE1.0"

WhileEnd

(今回追加部分を赤文字で示す)

⇒ダウンロード: DLINE1.5


グラフィックスコマンドを調べるにあたり、このようにループによる繰り返し処理を使った方が、分かりやすいことが多いので、ループコマンドに抵抗のある方は、このタイミングで、その使い方に慣れて下さい。

今回は、While ループを使って、無限ループにしています。
 ⇒ Casio Basic コマンドリファレンス While

While ループの書式

While
[ループ継続条件] 
 ループ内の処理
WhileEnd

[ループ継続条件] に 1 を指定すると、常に「真」 となって、常にループが継続されるので、無限ループになり、上のプログラムではこれを利用しています。ループから抜けるには、[AC] キーでプログラムを強制終了させます。

DLINE1.5 

[1] (1:Thick)、[2] (2:Broken)、[3] (3:Dot)、[4] (4:Normal) を選んで [EXE] を押すと、選んだスタイルで線が描画されます。
ところが、[0] (No) を選んだ場合は、直線に選んだスタイルで線が描画されることを確かめて下さい。

==========

上のプログラムでは、メニューの入力待ちのところで、うっかりテンキー以外を押すと異常動作します。これは、入力命令?を使う限りしかたありません。グラフィックスコマンドの確認の目的では、これで十分ですが、実用プログラムでは誤動作の原因になったり、、操作上の問題になることもあります。

そこで、入力命令? の代わりに Getkey コマンドを使って、必要な [0][4] 以外には反応せず、さらに[AC] で強制終了させる代わりに [EXIT] で正常終了させるようにプログラムを改造してみます。今回のテーマには直接必要のない改造ですが、グラフィックスを利用した実用プログラムの練習・準備のために、作ってみました。

ちなみに、以下の Doループでのキーコード取得と、それに続く If / Else If  / Else / IfEnd によるキーコード別の条件分岐、ならびにそれらを 無限ループ内に入れて、[EXIT] などの特定キーで正常終了させるのは、Casio Basic での構造化プログラミングの定石といって良いコードだと思います。
Casio Basic入門43 参照


ファイル名: DLINE1.6
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

VewWindow 0,126,0,0,62,0

While 1

ClrText
" 0:No"
" 1:Thick 2:Broken"
" 3:Dot   4:Normal"
"Input menu#"
Locate 16,7,"<EXIT>"

Do
Getkey→K
LpWhile K=0

If K=71:Then
Else If K=72:Then
S-L-Thick
Else If K=62:Then
S-L-Broken
Else If K=52:Then
S-L-Dot
Else If K=73:Then
S-L-Normal
Else If K=47:Then
Break
Else 0→K
IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd

K⇒Prog "DLINE1.0"◢

WhileEnd
ClrText
Locate 9,5,"bye!"

⇒ ダウンロード: DLINE1.6

DLINE1.6 





今回のまとめ
  • 線のスタイル設定コマンド SketchThick / SketchBroken / SketchDot / SketchNormal は、パラメータに描画コマンド (Line, F-Line, Horizontal, Vertical, Circle) を指定すると、描画コマンドで書かれる図形は指定された線のスタイルで描画される。これらのスタイル設定コマンドは、その場限りの設定になる。
  • 線のスタイル設定コマンド S-L-Thick / S-L-Broken / S-L-Dot / S-L-Normal は、パラメータを設定しない。設定するとエラーになる。これらのコマンドは、次に設定するまで、その設定は保持され、他のプログラムにも影響を及ぼす。これらのスタイル設定コマンドは、描画コマンド (Line, F-Line, Horizontal, Vertical, Circle) で書かれる図形の線のスタイルに反映される。
  • 設定が保持される S-L-xxxx コマンドよりも、その場限りの設定を行う Sketchxxxx コマンドが優先される。


今回使ったグラフィックス コマンド
  • F-Line
  • SketchDot
  • SketchBroken
  • SketchThick
  • SketchNormal
  • S-L-Dot
  • S-L-Broken
  • S-L-Thick
  • S-L-Normal


つづく...

Casio Basic入門 G07 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ







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

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


関連記事

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

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

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR