Caso Basic入門G14

Casio Basic入門
<目次>

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

2015/11/03
修正 2016/11/03

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

前回: Casio Basic入門G13

Chapter G14
PxlTest コマンド


前回 ViewWindow による座標系設定で動作確認した以下のグラフィックス描画を行うコマンドは、[SHIFT] [F4] (Sketch) に続くメニューの中にあり、これらをSketch描画コマンドと呼ぶことにします。
  • Plot
  • PlotOn
  • PlotOff
  • PlotChg
  • Line
  • F-Line
  • Circle
  • Vertical
  • Horizontal
  • Text
  • PxlOn
  • PxlOff
  • PxlChg
  • PxlTest( )
今回は、PxlTest() について、詳細動作を調べます。


PxlTest( ) コマンド

fx-9860GII Ver 2.04 のソフトウェアマニュアル の 8-24 ページには、以下の PxlTest( ) コマンドの説明があります。

PxlTest(<行番号>,<列番号>[)]

説明はこれだけです。

何をするコマンドか分かりません。行番号は縦方向、列番号は横方向ですが、これだけでは、原点がどこにあるか分かりません。

PxlTest() コマンドは、物理座標系で位置を設定し、その位置のピクセルが On なら 1 を返し、Off なら 0 を返します。値を返すとは、PxlTest() がその値を持つと考えて良いでしょう。
座標系とピクセル位置2 
原点は、左上で (1, 1) です。このコマンドを記述すると、例えば、

PxlTest(x,y)

となり、x は縦方向、 y は横方向の位置です。

殆どのコマンドでは、x を横方向の座標値、y を縦方向の座標値にするので、違和感があり、要注意です。多くのコマンドでは 横方向の座標置が1つめのパラメータに来るのですが、PxlTest() の1つめのパラメータは縦方向の座標置であり、2つめのパラメータが横方向の座標置なので、違和感があります。仕様なので、しかたありません。

Casio Basic の物理座標系で使うコマンドは全てこのように、縦と横が逆転します。

物理座標系で位置を設定するコマンドは、PxlTest() 以外も全てこのようになります。既に使ってきている Text コマンドも同様です。

さて実際に

PxlTest(X,Y) 

と、1行だけのプログラムを書いて、実行するとエラーになります。

PxlTest( の入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F6] (▷) [F4] (Test)

Argument_ERROR  

変数 Y に 1 ~ 63 以外の整数、変数 X に 1 ~ 127 以外の整数が格納されていると、Argument ERROR となります。
PxlTest() を使う際には、変数 X と Y の初期値に留意する必要があり、必要に応じてエラーが出ないように初期化する必要があります。


PxlTest() コマンドを使う時、変数 XY は、描画した点の位置をデフォルトの論理座標系に換算した座標 (X, Y) の値に自動的に更新されることが確認できます。

例えは、PxlTest(A,B) を実行すると、物理座標系での点(B, A) のピクセルが On か Off をを調べ 、この位置がデフォルトの論理座標系へ変換された座標 (X, Y) へ自動計算され、X と Y がその値で自動的に更新されるわけです。そして、変数 X と Y は使う際には要注意の予約変数とになります。バグ回避のために使わないほうが無難かも知れません。

PxlTest() の動作を確認するため、以下のように点線を3本描いて、ピクセルが交互に On と Off になる状態を作り、それぞれのピクセル位置で PxlTest() を実行して、ピクセルが On なら PxlOff でピクセルを消し、Off なら PxlOn でピクセルを描くようにしてみます。動作の結果は PxlChg と同じになるはずです。

PxlChg_2 

この準備には、PxlOn を使うことにします。PxlChg の動作確認で全く同じ準備をしています。
Casio Basic入門G13 - PxlChg コマンド

ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

Text 1,1,"PxlOn"
For 31→A To 33
For 1→B To 127
MOD(A+B,2)⇒PxlOn A,B
Next
Next


ここで MOD 関数は A+B を 2 で割った時の余りが 1 の時のみ PxlOn A,B を実行するように使います。こうすることで、交互にピクセルを On にできます。

F-Line コマンドを使ってピクセルを交互に On にする方法は、以下で紹介しています。
Casio Basic入門G07

この方法でも良いのですが、今回は別の方法を紹介しました。

For 文が2重になっていますが、内側のFor 文では、A 行を左から右へ (B が 1 から 127 まで) 交互に点を描いています。外側は、A 行の A を 31 から 33 まで順に変化させています。
先ず、A が 31 になって、内側の For 文(内側の For と Next の間) が B が 1 から 127 になるまで、B の値を 1 づつ増やしながら繰り返します。内側の For 文が終わったら、外側の For 文で A を 1 増やして (A=32)、もう一度内側の For 文が繰り返しを行い、これが終わったら再度外側の For 文で A を 1 増やして (A=33) さらに内側の For 文が同じように繰り返しを行います。これが終わって外側の For 文に戻るわけですが、A が 33 まで繰り返すように書いてあるので、これ以上の繰り返しを行わずに、外側の Next へジャンプし、プログラムが終わります。

Casio Basicコマンドリファレンス: For 文



これで、準備が終わったので、PxlTest() の動作を確認するために以下のプログラムに仕上げます。

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

Text 1,1,"PxlOn"
For 31→A To 33
For 1→B To 127
MOD(A+B,2)⇒PxlOn A,B
Next
Next

Text 1,1,"PxlTest()=1 =⇒ PxlOff"
Text 7,1,"PxlTest()=0 =⇒ PxlOn"
Text 13,1,"X="
Text 19,1,"Y="
Text 45,1,"Hit Any Key: Do PxlTest()"

0→X:0→Y
For 31→A To 33
For 1→B To 127
If PxlTest(A,B)
Then PxlOff A,B
Else PxlOn A,B
IfEnd
Text 13,10,X
Text 19,10,Y

While Getkey=0
WhileEnd

Text 13,10,"  " (スペース4個)
Text 19,10,"  " (スペース4個)
Next
Next 

ダウンロード: PXLTEST1 


青文字で示した2行の While ループは、何かキーが入力されるまでプログラムを一旦停止する働きをします。
よく使う方法なので、逆引き Casio Basic にも掲載しました。
キー押下でプログラムをコントロールしたい - 逆引き Casio Basic

プログラムを一旦停止するには、 命令を使う方法もあり、これは簡単な方法です。一旦停止を解除するには [EXE] キーを押します。但し、今回のプログラムでは、プログラムを進めるには [EXE} キーを連打し続ける必要があり大変です。一方、上の方法だと 何かキー([AC] キー以外)を押し続けるだけでプログラムは進むので格段に操作が楽になるので、この方法を紹介しています。

For 文については、準備で PxlOn による点描画を行ったのと全く同じなので、ここでは割愛します。


赤文字で示したこのプログラムの肝心な部分では、PxlTest() を実行し、1 を返す(PxlTest() の値が 1)の時、If 文で分岐して PxlOff を実行し、そうでない(PxlTest() が 0を返す場合は、PxlOff を実行します。その後に 変数 X と Y の値を確認しています。

PxlTest(A,B) が物理座標のピクセル(A, B) の On か Off かを調べると同時に、この物理座標をデフォルトの論理座標系に変換した座標 (X, Y) を、変数 X と Y に自動的に代入します。つまり、物理座標系の (A, B) がデフォルトの論理座標系の (X, Y) に自動変換されるわけです。

座標系とピクセル位置4 

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

このプログラムを起動すると、先ずは PxlOn でピクセルが交互に On になるように点線を3行描画します。

PxlChg_1 


これは2行目を描画しているところです。描画は続きます。

PxlChg_2 

3行目の描画がほぼ終わったところです。3行の範囲でピクセルが交互に On になっているのが分かります。

準備が完全に終わると、以下の表示でプログラムが一旦停止します。

PxlTest1_3 

1行目の左端は、既に PxlTest() で Off だったピクセルが On になっているのがわかります。上のプログラムでは、PxlTest() を1回実行して、0 を返して PxlOn を実行した直後、プログラムが While ループに入って、それが回り続けるため、そこから先へプログラムが進みません(止まっているように見えます)。

では、何かキー(但し [AC] キー以外)を短く押すと PxlTest() が1回づつ実行され、同時に X と Y の値が表示されます。

1行目の中央まで進んだところが下の画面です。

PxlTest1_4 

交互に On になっていたピクセルの On と Off が切り替わっていることが一目瞭然です。そして、X=0、Y=0.1 となっていて、デフォルトの論理座標系での値になっていることが確認できます。

座標系とピクセル位置4 

さらに、何かキーを押します。押し続けるとプログラムは進むので、しばらく押し続けてみてください。

PxlTest1_5 

3行目まで進みました。X と Y の値もデフォルトの論理座標系に従っていることが分かります。

PxlTest1_6 

3行目の右端のピクセルで PxlTest() が実行され、そのときの X と Y の値が表示されたところです。


このプログラムを実行することで、PxlTest(A,B) では、パラメータに物理座標系の位置を示す A と B を使っていますが、Xデフォルトの論理座標系での座標値 (X, Y) の値が自動的に更新されることが確認できました。

PxlTest() を使う時は、変数 X と Y の値が勝手に変更されることに留意し、プログラムを書く必要があります。

ピクセルの On / Off を調べるコマンドは、物理座標系で使う PxlTest() しかありません。従って、ピクセルの On / Off を調べたい時は、物理座標系からデフォルトの論理座標系への自動変換をする機能を正しく理解して、利用する必要があります。



次に、PxlTest() は、ピクセルの On / Off を調べた結果、1 か 0 の値を返すことを確認してみる。値を返すというのは、そのコマンドがその値を持つと考えても良いでしょう。

この機能を確かめるために、次のようなプログラムを作ってみます。

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

SketchDot Horizontal 0
Text 1,1,"PxlTest()="
Text 45,1,"EXE: Check next value."

32→A
For 1→B To 127
B-1⇒PxlOff 34,B-1
PxlOn 34,B
Text 1,45,PxlTest(A,B)◢
Next


ダウンロード: PXLTEST2


このプログラムの1つ目のブロックはフラフィックス設定で、特に説明は不要でしょう。

2つ目のブロックで、水平の点線を描いて、画面への文字表示を行っています。
SketchDotHiorizontal コマンドの使い方は、以下を参照。
Casio Basic入門G07

3つ目のブロックが、今回の確認のための主要部分です。既に描かれた点線を左から1ピクセルごとに PxlTest(A,B) でピクセルの On/Off をテストします。Text コマンドの3つ目のパラメータに、直接 PxlTest(A,B) を記述しています。PxlTest() が値を返すので、このような記述が可能になります。

Text 1,45,PxlTest(A,B)◢

これを表示したら、一旦停止させるため、 命令を使っています。
点線の水平線は、物理座標系で上から32ピクセルにあるので、A は常に 32 です。従って、32→A としています。
横方向は、変数 B を 1 から 127 まで1づつ増やして、For 文で繰り返し処理を行っています。
つまり、上の Text コマンドの3つめのパラメータの PxlTest(A,B) は、PxlTest(32,B) と全く同じです。

ところで、赤文字出示した2行は、今どのピクセルをテストしているのかを示すために追加しています。
今テストしているピクセル (32, B) の2ピクセル下に、点を描画するので、

PxlOn 34,B

となります。

但し、この点を描画する前に、1つ前の点を PxlOff で消します。

PxlOff 34,B-1

と書けば良いのですが、1つ問題があります。

一番最初は、B が 1 です。この時 B-1 は 0 になります。すると、PxlOff 34,B-1 の2つめのパラメータが 0 になりますが、PxlOff の仕様上、パラメータが 1 ~ 127 以外だとエラーになります。そこで、最初だけは PxlOff を実行させないため、

B-1⇒PxlOff 34,B-1

としています。

B-1 が 0 以外なら「真」なので、⇒ 命令の右を実行します。
一番最初は、B = 1 なので、B-1 は 0 となり「偽」となるので、⇒命令は、すぐ次のコマンドを実行せず飛ばします。

Casio Basic コマンドリファレンス: ⇒命令


従って、

B-1⇒PxlOff 34,B-1
PxlOn 34,B
Text 1,45,PxlTest(A,B)◢


となります。

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


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

PxlTest2_1 

点線の水平線が描画され、1つめのピクセルがテストされ、テスト結果が 1 と表示されています (PxlTest()= 1 と表示)。テストしている一番左のピクセルの下に、点が1個表示されていることも確認できます。

[EXE] を何回か押すと、

PxlTest2_2 

今テストしているピクセルは、Off になっていて、テスト結果は、0 になっています。

[EXE] を1回押すと、

PxlTest2_3 

点は1ピクセル右へ移動してテストしているピクセルを示し、それは On になっていて、テスト結果も 1 (Pxltest() =  1) になっています。

さらに、[EXE] を何回か押して、

PxlTest2_4 

ピクセルが Off のところのテスト結果は、0 になっています。

[EXE] を1回押して、テストするピクセルを1つ右へ移動すると、

PxlTest2_5 

ピクセルが On になっていて、テスト結果が 1 になっています。

これで、PxlTest() は、ピクセルのテスト結果を 1 か 0 で示す、その値を返すことが確認されました。この「値を返す」機能を使えば、PxlTest() コマンドを変数のように使えることも分かりました。



PxlTest( )

書式PxlTest(A,B)
  • パラメータ A と B で指定された位置のピクセルが On か Off かをテストする。
  • パラメータ A と B は、物理座標系でのピクセルの位置を示す。変数 X と Y を使う時は、その値に留意する。
  • このコマンドが実行されると、消去した点の物理座標系での位置をデフォルトの論理座標系での座標 (X, Y) に換算し、その座標値が変数 X と Y に自動的に代入・更新される。
  • A には、1 から 63 までの整数値を用い、それ以外の値を設定すると Argument ERROR になる。
  • B には、1 から 127 までの整数値を用い、それ以外の値を設定すると、Argument ERROR になる。

PxlTest( の入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F6] (▷) [F4] (Test)





今回のまとめ
  • PxlTest(A,B) は、物理座標系で位置を設定し、その位置のピクセルの On / Off を調べ、On なら 1 を Off なら 0 を返す。
  • A = 1 ~ 63、B = 1 ~ 127 の整数値に限定去れ、それ以外を設定すると Argument ERROR になる。
  • PxlTest() のパラメータに、変数 X と Y を使う時は、その値に留意する。
  • 変数 X と Y は、描画した点をデフォルト論理座標系に変換した座標値 (X, Y) が自動的に代入・更新される。PxlTest() コマンド使用時には、変数 X と Y の利用には注意が必要である。


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

  • PxlTest()



つづく...

⇒ Casio Basic入門 G13 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



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

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



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR