• 検索結果がありません。

反復組みかえ可能な立体グラフ表示法: 沖縄地域学リポジトリ

N/A
N/A
Protected

Academic year: 2021

シェア "反復組みかえ可能な立体グラフ表示法: 沖縄地域学リポジトリ"

Copied!
54
0
0

読み込み中.... (全文を見る)

全文

(1)

Title

反復組みかえ可能な立体グラフ表示法

Author(s)

阿部, 亮一

Citation

沖大経済論叢 = OKIDAI KEIZAI RONSO, 13(2): 1-53

Issue Date

1989-03-31

URL

http://hdl.handle.net/20.500.12001/6781

(2)

反復組みかえ可能な立体グラフ表示法

阿部亮 I立体グラフ表示の得失と基本的仕様 はじめに 1数値データのグラフ化の利点 2立体グラフの得失 3基本構想 4用語 4.1データ関係4.2グラフ関係 5基本仕様

aグラフ形式b軸成分の反復選択化

c軸割当項目の反復選択化dFunctionkeyによるパラメータ設定

e原データfile構成 、プログラムの詳細 1基本構成 2#0頭記部(リスト1,1000-1220) 3#1初期設定(リスト1,1240-1400) 4#2メイン・ルーチン(リスト2,1420-1550) 5#3項目切り替え(リスト3,1570-2010) 5.1グラフ・パラメータ設定 6#4表示成分選択(リスト4,2030-2670) 6.1Z項成分選択6.2XY軸表示成分選択 6.3全表示 7#5基準線引き(リスト5,2690-2930) 8#6軸名・番号記入(リスト6,2950-3480) 8.1成分番号表示8.2,SUM,表示 1

(3)

9#7棒描画(リスト7,3490-4330) 9.1高さ別色づけ9.2描棒 9.3等高線再描9.4大数値棒の分割 10#8ファンクション・キー設定(リスト8,4380-5460) 10.1f・KEYリセット10.2簡易説明文 10.3棒幅10.4棒高さ 10.5棒間隔10.6棒色彩 10.7項目順10.8行消去 10.9テキスト画面消去10.10グラフィック画面消去 1o・11ファンクション・キー設定変更 11#9初期化作業(リスト9,5480-5680) 11.1タイトル表示11.2棒模様データ 12#10原データ入力(リスト10,5700-6040) 12.1データ格納 13#11終端処理(リスト11,6060-6190) Ⅲ実行例 1初期画面 2諸事項設定 2.1項目変更2.2棒幅変更 2.3成分変更2.4表示系選択が 3実行結果I 3.1既定値実行結果 〔中略〕 3.8図表14の実行結果 4実行結果Ⅱ 4.1Bljデータの既定値実行結果 4.2図表16の項目、棒高変更結果 Ⅳ成果 2

(4)

I立体グラフ表示の得失と基本的仕様 はじめに 報告者はこれまで、パソコンによるアンケート調査の集計、分析をBASIC およびアセンブリ言語をもちいて行った3つの報告を本誌に発表してきた〔文 献1~4参照〕。そのなかで集計結果を棒グラフで表示し、「視覚によるチェ ックが容易に」(文献3,34頁)なり、きりの良い数値に丸めて回答されている

例など具体的な「データの偏りを発見」(同35頁)する効用があったことを報告

してグラフ化の意義を強調し、「クロス集計表をそのまま立体化してみること ができる3次元グラフ化」を「今後の課題」の1つにあげ(同36頁)、発表を 予告していた(同注4.1)。本論は、その実行報告である。 1数値データのグラフ化の利点 数値データの分析において、数値をそのまま厳密に処理して傾向なり法則性 なりをみいだすことは多変量解析ほかで多くおこなわれている有効な方法であ る。しかし、グラフに表示するという視覚に直接訴える方法も、周知のように 第三者への説明手段としてきわめて有効であるばかりか、分析作業そのものに おいてもおおいに役立つものである。 数値の羅列からその特徴やデータそのものの問題点を見いだすことは可能で あるが、注意力の集中を要し、見落としも発生しやすい。グラフ化すれば直感 的に把握されやすくなることは論をまつまい。数値解析とて、なんらかの理論 を背景におくことが多いとはいえ、その説明変数を無数にありうる要因から抽 出しさらにその組み合せを選定する段階では、直感ないし主観が大きな役割を はたしいろ。結論も、決定的な役割をする要因や組み合せが捨象されていると きには二次的な要素で事象が説明されてしまうように、その主観の絡んだ選択 に影響を受けざるを得ないのである。この傾向は、複雑な要因が絡み合う社会 科学分野で著しい。グラフはそのチェックに役立つ重要な手段なのである。 また、数値解析手法は処理対象のデータの精度や確度について通常問うこと

はできない。つまり原データの偏りや信頼性は別な手段で調べるしかないので

あるが、グラフ表示は上記のように有益な情報を提供しうる。さらに回帰を求 3

(5)

めろ際に「説明変数間に強い直線性がある場合、得られた回帰式は非常に不安

定であり、信頼性に欠けろ」ことになり、AIC規準などによるチェックが必

要になる(文献5,214頁~)が、この多重共線性の検出には、回帰線のまわり

にデータが集中して存在するためグラフを用いるのがきわめて有効となる。

したがって、できるだけ多くのデータがグラフに表示されるのが望まれるの であるが、従来はグラフ化するための労力等から、とくに必要なものに限定さ

れる傾向があった。この技術的な制約は、パソコンが普及して簡単にグラフを

表示できる専用ソフトやそのルーチンを組み込んだソフトが普及するに及んで、

急速に減少していろ。専用ソフトには、MicrosoftChart(マイクロソフト社)

やTheGRAPH(アスキー社)などがある。またLotusl-2-3(ロータス社)

に代表される表計算やデータ・ベースでは、専用のChartを別売しているMul

tipan(マイクロソフト社)を例外として、ほとんどのソフトがこの機能をも

ち、その機能等がいわゆるセールス・ポイントの一つになっていろ。原データ

の入力、加工からその表示まで連続的に容易な操作で実行できるため、広く使

われているようである。ワードプロセッサでも簡易型ながらとの機能を持って

いるものが多い。これは数値型情報の表示法として、グラフがいかに有効であ

り、その需要があるかを示していろといえよう。 2立体グラフの得失

単純な1次元のグラフでも、その要因(変数)の最頻値modeを中心に平均

値、分散の度合や歪度などの情報を与えうるが、表示されない他の要因との相

関関係などは当然与ええない。それを実現するには多次元での表示が必要とな

る。多次元のグラフであれば、各軸の要因の特徴を一時に把握できるばかりか、

各要因間の相関の程度等も見ることができ、法則性の発見を含め上記の役割を

よりよく果たすことができる。 ただ、3次元を越えた空間把握が困難な分析主体(人間)の制約と、2次元

の平面にほぼ限られる表示手段(紙、画面)の制約とから、直感に訴える役割

を良くはたしうるのは、一般的には3次元の表示までである。他方で、顔形グ

ラフなどからはじまって星座クラブ、木形クラブなど、3次元を越える多変量

を図示する手法が近年開発されつつあり、対象によっては十分に利用しうるが

(6)

〔文献6第6章参照〕、変量や表示内容上の制約が付きまとうのはその本性上

避けられず、まだ広範に活用されるまでにいたっていない。

ここでは多次元変量表示の第一歩でもあり、伝統的な表示法を採用すること

にする。すると、表示可能なのは3次元までとなり、数値の表示に距離(長さ)

を用いるのでこれに1次元分使われるから、データとしては自由度が2、ある

いは制限付で3のもの、つまり2ないし3次元までとなる。3次元データが扱

えるのは、3次元目の要素が、性別や産業大分類別のように数個以下のごく

少数で、かつそれらを2次元の要素の間隔内に並列表示できる場合であって、そ

の個数がふえれば急速に見にくくなることはさけられない。つまり多次元とい

っても、実用的にはその入口の2次元と一部の3次元にほぼ限定されてしまう

のである。

そこでわれわれは、2次元データを対象とし、これを立体的に鳥撤する方法

を採用し、他の要因との関係は2要因ずつ、組み合せを替えながら分析して

いくことで対応することにした。

しかし、立体グラフは、平面的グラフにくらべはるかに煩雑な処理を要する。

各点の位置の算定や棒グラフであればその斜視表示、背後に隠れる場合の隠線

処理、折り返し表示などで、プログラムは複雑になり、操作も煩雑になるのを

避けられない。

また次のような独自の問題も生ずる。一つは、正規分布に当てはめうる例の

多いことが示すように、データはある値の周囲に集中することが多く、そこに

大きな数値を示す棒や線分が密集して判読しにくくなる一万、周辺には空白部

分が生じて空間利用率が悪く見にくいグラフとなる場合が多いことである。二

つには、位置関係を明かにし立体感をだすために棒や壁面を用い背後を隠線処

理をするのが普通だが、これにより背後の数値が見えなくなってしまう場合が

頻発することである。三つには、原点や軸の傾斜のとり方から、基点の算定、

表示手段(点か線か棒か面か)、その高さの縮尺や色模様の選定など多くのパ

ラメータを調整しながら決定する必要があることである。

汎用性の高いものを作れば、プログラムはさらに複雑巨大になり、メモリも

多く占有することになる。市販する場合には一般的な効果にたいし価格の急上

昇は避けられないであろう。立体グラフをメニュー加えているソフトが少ない

(7)

(MSChart,にはなく、,theGRAPH,にあるのを知る程度である)のは、こ うした理由からであろう。 3基本構想 われわれは、上記をふまえ、つぎのような基本的構成を定めた。 まず、入力データの構造(3次元配列)と表示形式(2次元数値の立体棒グ ラフ)を限定する。ついで、各軸に割り当てる要因(変数)そのものと、要因 を構成する成分の組み合せおよび表示順序を繰り返し選択可能とする。そして、 パラメータ群は初期条件に対応した初期値を与えておき、その主なものはFun‐

ctionkeyに設定routineを割り付けてほぼ自動的な表示が可能であるととも

に設定の変更も簡便にできるようにすることにした。 使用するパーソナル・コンピュータは、従来使用したNEC社製の16bit機 PC-9801Eの後継機、PC9801VM21型機を使用し、言語は速度を要する部分が ないためまた変更箇所も多いため、MS-DOS上のBASIC〔N88-日本語BASIC (86)Version3.0〕を用いることにした。 以下、その概要を見ていこう。 4用語 プログラムの基本仕様を説明する前に、本論で使う用語の意味を明らかにし ておこう。頭記のようにこれまで発表した研究をデータを含め引き継ぐので、 独自の用語を用いているところがあるので注意されたい。 4.1データ関係 本プログラムでは5で述べるように、これまで発表した研究で作成された3 次元fileをそのまま使う。そこで、本プログラムに読み込まれる3次元fileに収 められた加工対象のデータを、従来と同様に、原データとよぶ。それは読み込 まれて配列にそのまま転送されるので、配列中のデータも同じ名でよぶことに する。 3つの次元に割り当てられた要因(変数)を、項目itemとよぶ。さらに、各 項目(変数)を構成する要素(連続数値の階級classと不連続の序数的または

質的区分を含む)をく項目の>成分component、個々のデータを元素element、

(8)

その格納場所をセルcellとよぶ。(注1) なお、データは通常の2次元集計表の横手方向におかれた項目を第1軸(X)、

縦方向の項目を第2軸(Y)、表示の際にあらかじめ固定される項目を第3軸

(Z)として、この順序(後方軸を固定して前方の軸から増加させていく形)

で、書き込まれているものとする。 4.2グラフ関係

表示グラフは5で述べるように、第一象限を烏撤する形とするので、その横

軸をX軸、縦軸(奥行き方向)をY軸と呼ぶことにし、両軸に割り当てられなか

った3番目の項目をZ項と呼ぶことにする。Z項の成分(数値あるいは範囑)

があらかじめ選定され、それに対応してXY軸に割り当てられた項目間のクロ

ス集計が図示されることになる。原データは3次元のクロス集計,体,を示して

いろと見なせるから、Z項の成分はいわば切り口で、XY平面はその断面とい

える。通常、立体図の上下方向の軸をZ軸と呼ぶが、本論ではその意味でZを

用いないので、注意を要する。(注2)

データの大きさは立体棒の高さであらわすが、これはDISPLAY画面上

の点dotの数(度数ともよぶ)で表示する。

(注1)データを特定する要因(あるいは関数関係とみて変数)に相当するも

のを、項目とよぶのは、若干奇異にとれるが、アンケートデータのように多数

の調査項目を成分としているときには項目を中心に分析していくため、選択さ

れた各項目を構成する回答番号等が項目の項目という形になり不明確になるの

で、連続・不連続の包括の意図にくわえて、成分とよぶことにしたのである。

なお、,MSChart,では、平面グラフにおいて横軸の変数を項目、縦軸のを数値

とよんでいるが、横軸にも数値の階級が置かれることがあるので、汎用性を損 なう〔文献7,174頁ほか〕。,Lotus1-2-3,では、横軸も変数のときは、XY Chartとよんで、別扱いしていろ〔文献8,2-103頁ほか〕。

(注2)このようになったのは、3つの項目のうち、2つを任意に選択して表

示するようにしたため、表示しない項目が切り口の場所を定める役割になった からである。 7

(9)

5基本仕様 aグラフ形式 a-1第一象限の烏睡

グラフは第一象限を左手前上から斜視(鳥勵)する形とする。

従来の立体グラフは、理由は不明だが、第二あるいは第四象限に展開される

ものが多かった。原点のとり方や数値きざみの場合増加方向が第一象限に展開

する通常の平面グラフと異なり、読み取りにくいものであった。ここでは、訓通

常の平面グラフの数値をそのまま立体視するイメージをうろため、第一象限に

展開し、これを左手前上方から斜視(鳥撒)する形式とする。 a-2棒グラフ グラフ形式は棒グラフとする。

立体グラフで数値を表示するには、折れ線と棒の2種類が考えられるが、折

れ線は変化量を見やすいものの、数値の集中する部分では線が錯綜してかえっ

て見にくくなり、高さを明示するため基準線から色や模様で壁をつけろと背後

に隠れる部分が多くなり好ましくないうえ、不連続な成分には不適であるので、

ここでは汎用性のある棒で表示することにする。

なお棒の高さは、汎用性を考えて主対象となる千分比のとき見やすくなるよ

う調整していろ(むろん実数でも差し支えないが合計が1000程度になるように

スケールを調整する必要がある)。また図の収まりから、上限を10Odotsとし、

これを越えるものは1OOdotsの棒を手前方向に並べ最後に残度数の棒を描くこ

とにする〔図表7参照〕。また高さの分別と棒の所属成分の判定が容易にでき

るように、高さに応じて(既定では20度数ごとに)色を分け、XまたはY(既 定)の成分に応じて模様をつけろ。 a-3外壁状合計欄

合計欄はXY軸の端末成分として外壁状に表示するα

数値を記載した集計表では通常縦横の合計欄が下端と右端に記載され、検算

や全体の分布状況を見るのに役だっているが、本例でもこれにしたがって、各

成分の合計値を両軸最後の成分として表示することにする。合計値がグラフを

外壁のように外側から囲む形となり、見やすくなるとともに単純集計も同時に

観察できることになる。ただ、合計値のためその値が一般の集計値より大きく

(10)

なり表示上バランスがとれなくなりがちなので、棒の高さは一般の場合の5分 の1に縮尺して表示することにする。 この配置は、通常の集計表を合計欄・合計行を含めほぼそのままデータfile 化したものを、そのまま配列に入れるだけで実現できるので、fileとの整合性 がよく処理手続きも簡単になる。 b軸成分の反復選択化 各軸上の成分とその位置を反復して選択可能とする。 各軸に割り当てられた要因(変数)の成分(数値階級や選択肢等)のうち必

要な組み合せを繰り返し選択できるようにし、同時にそれらの軸上の位置(順

序)も繰り返し自由に選択できるようにする。これにより過密な状態を緩和し て十分観察できるだけでなく、隠蔽された部分を見やすい位置に移動して観察 できることになる。 c軸割当項目の反復選択化 各軸への要因(変数)の割当も反復して変更可能とする。柱) これに加えて、各軸に展開される要因全体を繰り返し自由に交替できるよう にする。これにより異なった角度から組み合せの状況を視察できるようになり、 新たな傾向や法則性の発見機会が増加することが期待されるd

dFunctionkeyによるパラメータ設定

グラフ諸パラメータの設定をFunctionkeyに割り当てて随時変更可能とする。

立体グラフは、軸の角度ないし烏撤の位置、棒の高さや幅や色・模様など多 (注)初期のverSionでは、表示項目の位置(軸)が任意に入れ換えられる ことによって軸と項目との直接的な関係が切れ、プログラムに誤りが発生しや すくなると同時に解読しにくくなると考えられたので、データ配列を保存用と 表示・加工用との2つを用いることにしていた。軸を入れ換えるときには前者 から後者へ新たな順序でデータを転送し、作業は専ら後者で行うようにすれば、 XYZ各軸の順序は固定しているので表示が明示的にでき混乱を防ぎうると期

待したからである。しかし、軸を固定したまま成分(選択肢等)を入れ換える

ことも多いため一括して関数化しても実際上の見通しはあまり悪化しないため、

データを格納する配列は1つのみとした。 9

(11)

数のパラメータを指定しなければ表示できないうえ、その適否が分析に大きく 影響するので、各軸の成分の数その他に応じた一般的に妥当な諸パラメータを 既定値としてまず算定しておき、とくに指定しなくても外観はつかめるように する。また、多数の設定を毎回行うのは面倒であり、操作の途中で変更すべき

項目が出てくることもあるので、Functionkeyに主要なパラメータを変更する

機能を付与し、それらキーの割り込みによってさまざまな段階から変更を行え るようにする。変更しなかったパラメータの値はできるだけ記憶しておき再利 用できるようにする。これにより操作が簡略化される。 なお、Functionkeyの番号は、キーボードの表示を借用して、,f・3,等と略 記することにする。また、RETURNキーも画面表示等では,CR,と略記するこ ともある。 e原データfile構成

原データfileは3次元配列のSequentialdatafileとする。

原データのfile形式は、既往のアンケート調査で作成されたfileをそのまま 表示するため、また処理を簡素化するため、3次元配列に限定し、先頭部にそ

の名称や略称、要因番号を付加したSequentialdatafileとする。つまり、ア

ンケート・データ分析のリスト9〔文献3,99-100頁〕に示されたように、 3次元のクロス集計結果を先頭の項目XがOからその合計欄まで増加していき、 それがつぎのY、Zに波及する方向で、データが並べられることになる。そし て先頭部に、3つの次元に割り当てられた各項目(例X)の項目番号(XN)、

英数字略号(X1$)、日本語略称(X2$)、成分数(Xs)がX項目から

順に記載されていろ。これらを読み出せばグラフ上の項目名や配列のdimen‐ sionを自動的に設定できろ。 なお、1,2次元のデータは、高次の変数が単一の成分しかない配列として 同等に扱えろ。4次以上の表示を要するデータはあまり多く見あたらないので、 必要なときには要因(変数)を3つずつ組み合せて1組ごとに処理することを 繰り返せば、全体をカバーすることもできるので、本例の3次元形式で一応満 足できよう。 以上の基本仕様を実現すべく作成したプログラムを次にみていこう。 -10-

(12)

Ⅱプログラムの詳細 1基本構成 複雑な処理を見通しよく誤謬のすぐないプログラムとするため、構造化をめ ざした。ただ、ここで用いたNEC社製の言語BASICは行番号に縛られ構造化 のための命令体系も不備であるため、作業を内容に応じてSubroutine群に分 割し、その内部もできるだけ機能ごとにSubroutineに分割するなどして、 MODULE化をこころがけた。そして、構造化プログラムで構成を明確にするた めに一般的に行われているように、冒頭部分で全体を集約する形式とした。リ

スト1に見るように、頭記部〔#OHeadings,1000-1220〕と初期設定部〔#1

1nitialwork,1240-1400〕についで、MAIN部〔#2Mainroutine,1420

1550〕で作業Subroutine群を順次コールして処理を進めている。

なお、このような独立性の強いSubroutine群でプログラムを構成する場合、 それらの間の関係が不明瞭になりやすいので、ここではそれらの関係(主従な ど)を明示しかつその展開箇所を容易に見いだせるように、一般書籍における 章節構成を取り入れ、#記号を先頭に数字と-記号で順次下位の項目を表示し ている。また目次に相当する部分を冒頭に設けている〔1090-1220〕・主たる Subroutine群の名称と機能はリストにも簡単な説明があるが、もうすこし詳 しい説明を次に掲げろ。各行の*で始まる部分はSubroutine名である。 #O*D3Dタイトルと目次部分だけの部分。

#1システムや主要変数、Functionkeyの設定を行う。

#2*MAINSubroutineを順次呼んで作業を行っていくMain routineである。 #3*POSISW3つの項目(変数)の表示位置(軸、項)を切り かえ指定する。 #4*NUM・SEL

表示するbase(第3次元)と成分component(1,

2次元)を指定する。ここにラベル*REDOがつ けられており、繰り返し表示はここから再開する。 #5*GROUNDLINEグラフの経緯線、高度線を引く。 #6*NUMBER 項目名、基盤面2軸の項目番号や度数凡例を書く。 11

(13)

78 ## *BARDRAW立体棒を描く(経緯で模様分け、度数で色分け)。 *INIT.FKEY

諸設定変更のSubroutine群をFunctionkeyに

も割り当てる。

*TITLEDSP、*TILESTR冒頭にタイトル表示と棒模様の設定を

行う。 *DATAIN 原データをFileから読み込み、原データ配列に転 送する。 *ENDORREDO終了か再開かを指定する。 #9 #10 #11

以下、各機能の概要をリストに沿いながらより詳しくみていこう。各節の表

題は順に、プログラム上での節番号(#印)、日本語表題、ラベル名、リスト

番号、その行番号を意味していろ。 リスト1 ,-L-----ニーーーーー-----==----ニーーーーー------------=__二-二------=---=-------■ ̄■ ̄■-----■--------■ ̄ ̄■ ̄---亡==_~=--_ ̄=~_ニー____ニーーニーゥ----== ̄==■ ̄■- ,〈〈#O〉〉 Headmgs l-Q---__=--ニーーーーーーーーーー--=----==-ニーーーーーー=圭一一一一で===-==--------------■ ̄---■ ̄■--------------F=-- ̄ ̄ ̄= ̄= ̄==-- ̄~ローーーーー「--- ̄ ̄ *D3D DATA,,**********************************************,, DATA,,*3-DBarGraphDisplay*,, DATA,,*Copyright(C)l989byR.Abe*,, DATA,,**********************************************,’ lOOO lO10 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 ,****************TableofContents***************** ,#0Headin8s ,#11nitialwork ,#2Nainroutine ,#3Switchpositionsofltems ,MSelectComponentsofltemstodisplay ,#5DraWGroundlines ,#6Numbering ,#7DraWBars ,#8SubroutinesonPunctionkeys

,#9Initialsub-routines(DispTitle&tilestrings)

12

(14)

1200’#l0Getdata l210,#l1Endin8operation

l220,***********************************************************

1230, 1240,============================================ 1250,〈〈#1- lnitialwork l260,========================================== 1270, 1280CLEAR&H1000,,,&H2000:SCREEN3 1290DEF1NTA-Z

l300DEFFNYES=lNSTR(,,Yyン,,+CHR$(13),INPUT$(1)),checkYes

l310D1NX(15),Y(15),tostoreorderofAns・no・ l3201X=l:1V=2:1Z=3,lteIIIs,No.assignedforX,Y,Z

1330XO=216:YO=348’1ocationoftheOri8inofGraph

l340VB(1)二80:IIB(2)=60:V8(3)=40:VB(4)=20:W(5)=0

,borderheightfor8ar-color赤黄緑水青

1350F=&HFF,assi8ntilecolor l360’ 1370,‐‐‐-.Initialsub-routines‐‐‐‐‐‐‐ l380GOSUB*T1TLE・DSP,Il9-1displayTitle l390GOSUB*TILE・STR,#9-2set8artilestrin8s l400GOSU8*lNlT.FKEY,#8initializeFunctionkeys l410, 2#0頭記部*D3D(リスト1,1000-1220) 〔1000〕他のプログラムに連結MERGEした際に、このプログラム部分への ENTRYPOINTとするラベル。ただし、実際にMERGEさせるには行番号や 配列・変数名の重複指定のチェックのほか、環境設定の重複や矛盾にも配慮す る必要がある。またこのプログラムからの脱出先(*EXIT〔1550〕)を相手プ ログラムにあわせる必要もある。 〔1040-1070〕プログムラの見出し部画面へのタイトル表示〔#9-1〕に も流用するため、DATA文としてある。 〔1090-1220〕上記のように、プログラムの目次である。 13

(15)

3#1初期設定(リスト1,1240-1400)

〔1280〕環境設定。機械語領域に64kbytes、RAMDiskへの転送などを行う

CHILD命令の作業用にl28kytesを割り当てておく。

〔1300〕ユーザ関数FNYESは、,Yes,,NC,を使用者にたずねる場面が多い

ため、これを簡単確実に処理するため設定した(Y,y,ン,RETURNkeyの

いずれかの入力でINSTR関数により1以上の値が返されることになり、これを

調べることで分岐の手続きが簡単に行えろ)。

〔1310-1350〕初期値設定。プログラム全体を通して使われる変数等の明示を

企図したが、実際に使用する場でしか設定できない原データ配列D(X,Y,Z)

のようなものもあり、また使用する場所近くで設定した方が理解しやすいこと

もあって、このように半端な展開となってしまった。

X()とY()は、繰り返し入れ換えられうるX、Y軸の成分(変量階級、回答

肢)の現在の順序を入れておく表示用の配列である。

IX、IY、IZは、XY軸、Z項に原データのどの項目番号(当初の順は123)が割

り当てられたかを示す変数で、この組み合せをかえることで6通りの表示が可

能となる。

XOとYOは表示画面上のグラフの原点の位置を示す(第一象限であるため下

方中央部になる)。

WB()は、表示棒の高さを示す色分けの限界値(ここではdot数)をいれる

配列である。対象に応じて、ここをかえれば見やすい色分けが可能となる。

Fは、棒の模様を定めるSTRING関数の3原色ごとの指定を簡便に表示する

ために定義した。

〔1380〕Subroutine*TITLEDSP〔#9-1〕をよんで、上記のタイトル

を表示する。

〔1390〕Subroutine*TILESTR〔#9-2〕をよんで、棒の模様パター

ン6種を定義する。

〔1400〕Subroutine*INITFKEY〔#8〕をよんで、諸設定の変更を

割り込みで処理するSubroutineをよびだすFunctionkeyの設定を行う。

14

(16)

4#2メイン・ルーチン*MAIN(リスト2,1420-1550)

本プログラムの中枢部分である。リストにあるとおり、7つのSubroutine

を次々によびだして、処理を進めていく。

はじめに、#10*DATAINで、Disk中の原データを、データ配列に読み

込む。

ついで、#3*POSLSWで、3つの項目(変数)の役割(X軸、Y軸、Z

項)を切りかえ指定する。

3番目に、#4*NUM・SELで、上記3項目の役割一Z項の切り口、XY

軸の表示成分component-を具体的に規定する。なお、この前にラベル*REDO

があり、再実行の際はここから再開することになる。

4番目の#5*GROUNDLINEから、グラフの描画準備がはじまる。こ

こでは、基盤上の経緯線と等高線を引く。

5番目の#6*NUMBERでは、項目の役割表示、基盤面2軸の項目番号や

度数凡例を書く。6番目の#7*BARDRAWで、実際に立体棒を、経緯で

模様分け、度数で色分けしながら、順次描いていく。

最後の#11*ENDORREDOでは、作業の終了か再実行かを決定し、前

者の場合は1550行でプログラムを終え、後者では1490行の*REDOにもどって

表示作業を再開することになる。 リスト2 --■■■--■■■----■■■■■■ ̄■■■--■■■ ̄■■■----■■■D--■■■'------■■■-------===--ニニニニーー ,------------------------------======三三二二ニーーーーーニ ,〈〈#2〉〉 lvlainroutine ----■■■ ̄■■■■■■■■■--■■■------'■■■■■●----■■■----■■■--■■■■■■■■■----=-----_ニーニーー ,---------.----------------------ニーー==ニーーーーーー---= *NAlN

GOSU8*DATA、1N,#10get&transferdata(onendpart)

GOSUB*POSI・SV,#3switchpartsofltems&setspecs. *REDO GOSUB*NUN・SEL,II4seIectAns・no・ GOSU8*GROUNDLlNE,#5draWgroudlines GOSU8*NUMBER,#6drawAns・no.&hei8htindex GOSU8*BARDRAV,#7draW8ar 1420 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530 15

(17)

GOSUB*END・OR・REDO,#l1endin80peration *EX1TEND 1540 1550 1560 5#3項目切り替え*POSLSW(リスト3,1570-2010) 原データを構成する3つの項目(これを順に123とよぶことにする)の役 割(次元、軸)を指定するroutineである。 1.4.1で説明したように、3つの項目はXY軸とZ項に割り当てられる が、X軸に割り当てられる原項目番号をIXに、Y軸のをIYに、Z項のをIZ にいれておく(#1初期設定で初期値を設定済み)。 〔1630-1660〕画面0行目に各項目の現在の役割を表示する。*CLRLINEx は、添字のx行目をClearしてその行頭にCursorを移動させるSubroutineで ある。 〔1680-1710〕1行目で現役割を変更するかどうかを尋ねろ。しないときは、 #31にとぶ。1700行で変数FKにOをいれ、キー入力をさせてから、その FKが非Oならこのブロックを再実行するようにしているのは、キー入力待ち

の間に、既定の入力以外の諸設定を変更すべ<Functionkeyをおして割込処理

をしても、プログラムの流れを乱さずにキー入力処理を再開するためであ る。柱) (注)N88-BASICに限らず多くの言語で、割込処理後の復帰は、割込時点の 状態にではなく、次のSTEPに戻るようになっている。これは、割込時の状態 がきわめて多様でありうるので、その状態の保存と再設定が保障できないから

であろう。そこでここでは、割込がなされたか否かを示すflag変数FKを設

け、これを割込発生の前にRESETし、割込時にはSETして、割込処理 対象のSTEPの直後にこれをチェックし、RESET状態ならば割込なしとして つぎのSTEPに進み、変化あればもとのキー入力処理ルーチンを必要なところ までさかのぼって再開するようにしていろ。 16

(18)

〔1720-1780〕変更する場合、1行目で新たなXYZに割り付ける番号列(例

231)を入力させ、再確認した〔1740-1750〕のち、IX等の変数を変更する。

〔18001810〕上記の変更にしたがって、諸変数等に既定値を入れるSubrou‐

tine*SPECINITをよび、RETURNする。

5.1#3-1グラフ・パラメータ設定*SPECINIT(1840-1920)

新たな軸。項の割り当てに基づいて、グラフのパラメータ(諸元)を設定す

る〔図表1参照〕。

〔1860-1870〕新たな軸・項の成分総数をNXO外に入れ、表示用の成分総数を

示すNX外に転写しておく。表示成分の組み合せは自由に変更させるのでもと

の総数は別に記憶しておく必要があるのである。

〔1880〕HS(HSO)はデータ表示のスケールで、棒の高さ(100dots)

に対するデータの度数(数値)を示し、既定値は200とする。BWIDは棒の

横幅の指標(軸目盛の間隔の何分の1か)で、初期値を3分の1としておく。

〔1890〕XY両軸の成分列X(),Y()を原データの順をそのまま表示できる

ように自然序数で初期化しておく。 〔1900-1910〕*BARWIDTHをよんで棒の幅を決めてから、*SPECINIT をよんで他の諸設定事項を自動設定して、復帰する。 *SPECAUTO〔1930-2010〕 #3-1-1グラフ諸事項の自動設定 図表1に示されたグラフの基図表1 盤描画の割付に必要な諸項目を、 画面をいつぱいに利用して表示 する方向で自動的に設定する routineである。 〔1950-1960〕XP,YPは、XY 軸の成分の間隔intervalで、XP は後の間隔自由設定の際の上限 を示すためにXRDに記憶させ ておく。 「-コ め いる) 芯図では訂E明0 】I ユ 17

(19)

〔1970〕DXは、縦Y軸の画面上の傾斜を定めるもので、ここでは試行の結

果背後を隠す割合が低く見栄えも良い-4/3の傾き(約130度)とした。

〔1980-2000〕FWは、棒のX軸側の幅で、*BARWIDTHで指定されたB

WIDで決められる。SWとSHは、棒のY軸側の幅の横と縦の成分で、長さはX軸

側の5/9にしてある(ただし棒の形状を保つためSWは3dotsを下限として

いろ)。 リスト3 フーー=============--------ニーーー--------------------■---------■--■--■-[====---------■--■----■---■---------------

,〈〈#3〉〉Switcl1positionsofltems

,==========ニーーーーニーーーーー------------==--====--==ニーーーーーー ̄■ ̄-----===========--------------■-■---------------- *POSI・SV

AX$(lX)="X(10,8.),':AX$(1V)=,,Y(Iat.)',:ハX$(|Z)=,,Z(base),,

GOSU8*CLR・LlNEO PRlNT,,ItemsParts,,;

FOR|=lTO3:PR1NTSTR$(1)”:,,;V2$(1);”as,,AX$(1);:NEXT

PRlNT *POSI.S・l GOSU8*CLRLlNE1

PRlNT,,Tochangetheorder,hit[C].,,;

FK=O:K二lNSTR(,,Ccソ,,,INPUT$(1)):IFFKTHEⅢ680

GOSUB*CLR・LINE1:lFKTHENELSE1790

PRlNT,,Inputnewltems,Partsfor[XYZ],eo8.[231].”;

FK=O:lNPUTA$:lFPKTHEN1710 PRlNT'’0K?”; IFFNYESTHENELSE*POSI.S、l lX=VAL(HID$(A$,1,1)) 1V=VAL(HID$(A$,2,1)) |Z二VAL(HID$(A$,3,1))

GOSUB*CLR・L1NEO:'GOSUB*CLR・LlNE1:GOSU8*CLR・LlNE2

GOSUB*SPEC・lN1T RETURN '570 1580 1590 1600 1610 1620 1630 1640 1650 1660 1670 1680 1690 1700 1710 1720 1730 1740 1750 1760 1770 1780 1790 1800 1810 1820 1830

'--<#3‐l〉InitializingVariabIes

18

(20)

00000000000000 45678901234567 88888899999999 11111111111111 *SPECblN1Tグ….Lノル ,~…,scaleofBar:FV=frontwidth,HS二H8t・Scaie NXO=S(IX)+1:NVO=S(|Y)+1:NZO二s(lZ)+l NX=NXO:NY=NYO:NZ=NZO HS二200:ⅡS、0=HS:B、v106.0=3己 FORK二OTO15:X(K)二K:Y(K>二K:NEXT~ GOSU8*BAR・NlDTH J, GOSU8*SPEC・AUTO (・ RETURNiL- ,-<#3-1:F1> *SPEOAUTO XP=INT((632-XO-l6)/NX):XPD=XP YP二INT((YO-ll4)/NY) DX=INT(VP*3/4)a, lF(XO-8*3)<NY*DXTHENDX=lNT((XO-8*3)/NY) Ⅳ二lNT(XP/8.VID) W=INT(FW3):|PSV<3THENSW二3 SH二C1NT(SV*4/3) へRETURN-‘ 1980 1990 2000 2010 2020 6#4表示成分選択*NUMSEL(リスト4,2030-2670) 〔2070-2200〕第3次元(Z項)の表示成分やXY軸の表示成分を指定する。 *REDOでここから再開することになるd表示の実質上のMAINrotineの先 頭といえよう。L まず、メニューがでて、表示されるグラフを背後で規定する第3次元(Z項) の成分を変更するのか〔Z〕、表示中のXY軸の成分を変更するのか〔A〕、 それ以外か〔RETURN〕をたずねる。 ZのときはSubroutine*NUM.SBASE(#4-1)が、Aのときは同じ く*NUMSCHANGE(#4-2)がよばれ、処理後に戻ってくる。T 〔RETURN〕のときは、さらに質問がでて既定値で<全図を>、見るか

〔P;#4-3がよばれる〕、直前のグラフを繰り返してみるか,〔CRorR;た

だ戻る〕を決めて〔2150-2200入処理後に戻ってくる。い~」 19

(21)

6.1#4-1Z項成分選択*NUMSBASE(2210-2330)・

〔2220-2270〕Z項の切り口(成分)の最大値(合計欄)NZOを表示し{そ

れ以下の数値を入力するよう求めろ。

〔1180-2330〕ついでXY軸の項目の全成分を表示するか否かをきき、すると

きには*NUMSALL〔#4-3〕を呼んで戻り、否のときは次に説明する

*NUMSCHANGEを呼んでから戻る。

6.2#4-2xY軸表示成分選択*NuMscHANGE(2340-2480)

X軸、Y軸の順に、新たな表示成分の組み合せの入力が順次求められる。終

端は、99の入力で判断し、そこまでの入力回数をNX,NYとし、最後の番号に

合計欄番号を記入する〔2410,2440〕。

*NUM・WK〔#4-2-1,2490-2610〕はその作業roUtineである。

ついで既述の*BAR・WIDや*SPECAUTOを呼んで、他のパラメータを

設定しなおして戻る。 6.3#4-3全表示*NUM.SALL(2620-2670)

XY軸とも全成分を表示するためのroutineで、表示成分番号を格納する2

配列X()、Y()に1から順に合計欄の番号まで入れ、諸パラメータを*SPEC

AUTOで設定しなおして、戻る。 リスト4 ,===ニーニニニーニニーーニー-----ニーーニーー--‐---------=二一一一一一一二二一一三==----===--- ̄------= ̄==--‐ニニーニーーーーニニーニー三一一-一一一一三一= ̄-=ニニーーー

,〈〈#4〉〉SelectComponentsofltemstodisplay

,=ニニニニニニニーニニーーーーーーー------===一二-一二一ニニーーーー ̄===ニーーーー---- ̄ ̄=-- ̄----二一一==ニーーーーーー== ̄ ̄==== ̄ ̄-三二三一一= 2030 2040 2050 2060 2070 2080 2090 *NUN・SEL GOSUB*CLRLlNEO

PR1NT,,IlitKeytochan8e;[Z]Baseofchartor[A]ns・no.,,,;

,,else[CR],,; FK=O:A$二INPUT$(1):lFFKTHEN2080 GOSUB*CLR・L1NEO IFlNSTR(,,Zz".A$)THENGOSU8*NUMS、8ASE:RETURN IFINSTR(,,Aa,,,A$)THENGOSU8*NUN.S・CHANGE:RETURN lFlNSTR(CHR$(13),A$)THENELSE*NUN・SEL 2100 2110 2120 2130 2140 20

(22)

2150

PRINT "Hit Ke:y to show [P]rearrangedl:y or [CR,R]epeatedl:y.";

2160

FK=O: BS=INPUT$(l): IF FK THEN 2110

2170

GOSUB*CLR~LINEO

2180

IF INSTR("Pp",BS) THEN GOSUB *NUM.S.ALL ; RETURN

2190

IF' INSTR("Rr"+CHR$(13),B$) THEN RETURN

2200 GOTO *NUM.SEL

2210

'---<#4-1>---2220

*NUM.S.BASE·

2230

GOSUB *CLR.LINEO

2240

PR

I

NT

"I nput the Base of Chart

=

No. of Z

«=";

NZO: ")";

2250

fK=O: INPUT Z$: IF FK THEN *NUM.S.BASE

2260

IF Z$="" THEN *NUM. S. B. NX

2270

IF VAL(Z$)<=NZO THEN NZ=VAL(Z$) ELSE *NUM.S.BASE

2280

*NUM.S.B.NX

2290

GOSUB *CLR.LINEO

2300

PRINT "To show AI

I

ans.,

hit

[A] else any

key. ";

2310

FK=O: K=INSTR("Aa",INPUT$(I»: IF FK THEN *NUM.S.B.NX

2320

IF

K

THEN GOSUB *NUM.S.ALL

ELSE GOSUB *NUM.S.CHANGE

2330

RETURN

2340

'---<#4-2>---2350

*NUM.S.CHANGE

2360

LOCATE 0,3 : PRINT

"1

nput New Order.

[tai

1=99] "

2370

GOSUB *CLR.LINEO:

2380

PRINT "Order:

0

1

2

3

4

5

6 7

8

9 10

11

12 13 14"

2390

XV=l: MAX=NXO

2400

GOSUB

*CLR~LINE1:

PRINT USING

"X

<##";MAX;

2410

GOSUB *NUM.WK: NX=R-l: X(NX)=NXO

2420

XV=2: MAX=NYO

2430

GOSUB *CLR.LINE2: PRINT USING

"V

<##";MAX;

2440

GOSUB

*NUM.WK:

NY=R·l: Y(NY)=NYO

2450

GOSUB *SAR.WIDTH: GOSUB *SPEC.AUTO

2460

GOSUB *CLR.LINEO: GOSUB *CLR.LINEl: GOSUB *CLR.LINE2

2470

LOCATE

0,3:

PRINT SPC(30)

2480

RETURN

2490

'---<#4-2-1>

2500

*NU~1.

WK

2510

R=O: E$=''''

2520

WHILE E$<>"99"

AND

R<=MAX

2530

LOCATE R*3+7,XY

(23)

-INPUT,,,,,E$ IFE$=,,,,THEN2570 1FXY=lTHENX(R)=VAL(E$)ELSEV(R)二VAL(E$) R=R+1 VEND LOCATER*3+8,XY:PRINT’'0K?,,; IFFNYESTHENELSE*NUN・VK RETURN '‐-<#4-3〉Selectall---‐‐ *NUM.S・ALL NX=NXO:NY=NYO FnRK=OTOl5:X(K)二K:Y(K)二K:NEXT (;U5UB*SPEC、AUTO RETURN 2540 2550 2560 2570 2580 2590 2600 2610 2620 2630 2640 2650 2660 2670 2680 7#5基準線引き*GROUNDLINE(リスト5,2690-2930) グラフの経緯線、高度線を引く。 12740〕SX,SYは、Y軸端の原点からの相対位置、SCXは、X軸端の相対位 置のX成分(Y成分の水平なので不変)である。 〔27502800〕縦方向の線をNX件分引く。まずY軸方向に相対位置(SX, SY)まで、細かい緑色の点線を〔2780〕、ついでその端末から垂直にス ケール用の柱をl00dots分青色点線を〔2790〕引いていく。配色と線種は、目 的の棒が見にくくなるのを防ぐものにしたが、地味すぎて多少見にくい面もある。 〔2810-2860〕横方向の線を、上と全く同様の方法で引いていろ。 〔2870-2930〕最後に棒の高さを示す等高線を、XY両軸端から立ち上がった 柱で構成される外壁の横方向にl0dotsおきに10本ひく。 リスト5 フーーーーーーーーーーーーーーーーーーーーーー...-0..----------------.------------- ̄------■■■------- ̄---0---ご ̄、---------■■■--■■■■---- ,〈〈#5〉〉 DrawGroundLiI1es 2690 2700 22

(24)

2710,==========ニニーニニ========================== 27202 2730*GROUND・L1NE:CLS2 2740SX=-NY*、X:SY=-NY*VP:SCX=XP*NX’ 2750,-‐‐‐-Lengthwise‐‐‐---‐-, 2760FOR|=OTONX,タテホウコウ 2770POINT(XO+I*XP,YO) 2780L1ND-STEP(SX,SY),4,,&HAAAA、~ 2790LINE‐STEP(0,;-100),1,,&H8888 2800NEXTl 2810,‐‐‐-‐Horizontally‐‐‐‐‐‐‐‐

2820FORJ=0TONY⑲ヨコホウコウ

2830八POINT(XO-J*DX,YO-J*VP) 2840LlNE‐STEP(SCX,0),4,,&H8888~ 2850LINE‐STEP(0,‐100),1,,&H8888 2860NEXTJ 2870,‐‐‐‐‐‐HeightScale‐‐-- 2880FORK=lTO10 2890POINT(XO+SX,YO+SV-K*10)1 2900LINE‐STEP(SCX.O),1,,&H8888 2910LlNE-STEP(-sX’9sY),川&HAAAA 2920NEXT 2930RETURN 2940, 8#6軸名p番号記入*NUMBER(リスト6,2950-3480)

〔3000-3050〕図示される切り口z項やxY両軸の名称(w2$())とZ項

の成分番号を画面底辺に書く。」

〔3060-3120〕X軸の成分番号(時に度数階級)を、軸線の下側にグラフィッ

ク文T2として記入する。番号X()はJJに代入され、*PUTIDX〔#6-1〕に 渡されて表′j〈が行われろ。また終端の成分を合計欄に固定しているため、そこ に,SUM,を表示する*PUT、SUM〔#6-2〕をよぶ。 、? ̄ 〔3130-3190〕Y軸について、その左側に上と同様の表示を行う。

〔3200-3340〕Y軸端上部の棒高さを示す等高線の中間(5本目)に、その大

23

(25)

きさを4分の1角文字で小さく表示する。この等高線に直接接する合計欄の数 値は、一般の要素の5分の1にしてあるので、合計欄用の数値を()にいれて併 記する。ここで用いる文字はPC-9801シリーズにJIS外で組み込まれている4分 の1角グラフィック文字(CODE、16進数で0130から0139)である。 8.1#6-1成分番号表示*PUTIDX(3350-3390) 表示するXY両軸成分の番号をグラフィック画面に半角文字で表示する。そ のCODE番号は16進数で0030から0039である。 8.2#6-2,SUM,表示*PUTSUM(3400-3470) ,SUM'の半角文字を上記と同様にグラフィック表示するd文字のASCIICO‐ DEをそのままKANJI関数に渡せば良いのは上と同様である。 リスト6 ,-,---‐_~---====--=_二一ニーニーニーー----===-=二-----と=- -== ̄ ̄二----====---=--‐ニニーーーーー---------------------- ,〈〈II6〉〉 Numberlines l-------=_-ニーーーー===_-.--ニーーニーーーーーーーーー---==--=_ニーー〒---~_-=ニーニー---- ̄====----=-------------------------- 2950 2960 2970 2980 2990 3000 3010 3020 3030 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 *NUNBER’0-〉NX,NYmaxl5,15 -‐‐‐‐Title CLS LOCATEq22:PRINT,,Z:',;V2$(IZ) PRINT,,#,,NZ;,,<=',NZO; LOCATE13,23:PRINT,,Y:,,;112$(1V);,,latitude LOCATE35,23:PRINT,'X:,,;V2$(|X); ,Iongitude -‐--ヨコXシ塵クーー‐‐‐‐-‐‐‐‐ Y=22*16,XシークNo.line:CINT(YO/16) FORJ=OTONX-1 X=XO+XP*J-4:JJ=X(D GOSU8*PUmlDX NEXT X=XO+XP*NX-4:GOSUB*PUTSUN ---タテYシリ---FORJ=OTONY-l V=YO-YP*J-8:X二XO-DX*J-18:JJ二V(J) -24

(26)

3160

GOSUB *PUT.IOX

3170

NEXT

3180

Y=YO-YP*NY-8 : X=XO-OX*NY-18

3190

GOSUB *PUT.SUM

3200

,---

~T

Scale

[1/4 b?

~~~]

3210

UP.S$=STR$(INT( 5*HS/I0»: UP.L=LEN(UP.S$)-l

3220

LW.S$=STR$(INT(2S*HS/IO»: LW.L=LEN(LW.S$)-l

3230

VX=XO+SX-8*LW.L-12: VY=YO+SY-46

3240

FOR J=l TO

UP.L:

vxo=J*a

3250

CODE=&HIOO+ASC(MIO$(UP.S$,J+l,l))

3260

PUT(VX+VXO,VY-I0),KANJI(CODE)

3270

NEXT

3280

FOR

J=l TO

LW.L:

VXO=J*7

3290

CODE=&HI00+ASC(MID$(LW.S$~J+1,1»

3300

PUT(VX+VXO,VY

),KANJI(COOE)

3310

NEXT

3320

IF VX>=O THEN

PUT(VX,VV),KANJI(&H128)

'(

3330

PUT(VX+VXO+7.VY),KANJI(&H129)

')

3340

RETURN

3350

'---<#6-1>---3360

*PUT. lOX

3370

IF JJ>9 THEN PUT(X-8,V),KANJI(ASC("1"»: JJ=JJ-IO

3380

PUT(X,Y),KANJI(&H30+JJ)

3390

RETURN

3400

'---<#6-2>---~

3410

*PUT.SUM

3420

X=X-12

'to arrange tail to

numbers

3430

FOR K=O TO 2

3440

COOE=ASC(MID$("SUM",K+l,l»

3450

PUT(X ,V) , KAN .

.1

,I

(CODE): X=X +8

3460

NEXT

3470

RETURN

3480 '

(27)

-9#7棒描画*BARDRAW(リスト7,3490-4350) 立体棒を描く中枢部分である。狭義の*BARDRAW〔3530-3670〕をMAIN として、ここから下請けのSubroutine群を呼び出して、複雑な作業を遂行し ていろ。 〔3540-3550〕棒グラフは、Y軸外側(合計欄)から手前へ(変数B)、X軸 を原点から右外側へ移動させながら(変数A)、描いていく〔ループ端は、 3650〕。 このように、後方の棒から描くことで、手前の棒がこれに重なる場合にはそ の部分を隠すことができる。すなわち隠線処理がなされるのである。 〔3560-3570〕初期設定#1で指摘したように、項目の配置によって引き出す データの順序が当然異なってくるため、その指定の仕方が複雑にならざるをえ ない。そこで、配列vOを設け、これをパラメータとして、固定した原データ 配列,(,,)から指定された項目割当と成分配列に応じた要素を指定するこ とにした。 そのアルゴリズムはつぎのとおりである。D(,,)の第i次元(i<=3) の成分を指す変数をV(1)とし、各項目のX,Y,Zへの割り当てを示す変

数Ⅸ,IY,IZをV()の配列番号にすれば、そのV(IX)はX(XYZのいずれか)軸.

項に割り当てた項目の成分を指すことになる。さらに、これにXY軸の成分配

列X(A),Y(B)を代入(V(Ⅸ)=X(A),V(IY)=Y(B))し、Z項の固定成

分を代入(V(IZ)=NZ)すれば、V(Ix)はxに割り当てられた各項目の指定さ

れた成分番号を指すことになる。そこで、データ配列,(,,)の配列番号を

順にV(1),V(2),V(3)と指定すれば、原データ配列のままで任意に割り 当てられた軸・項の指定された成分番号に対応する要素(元)が引き出されて くることになる。 たとえば、X軸に第3項目が割り当てられた(Ⅸ=3)とすれば、V(Ⅸ)- V(3)となり、このV(3)にX軸の成分X(A)が代入されることになるから、 D(V(1),V(2),V(3))は,(V(1),V(2),X(A))ということにな り、X軸に位置づけられた第3項目(次元)がX(A)の値に応じて変化してい くことになる。こうして、V(Ix)をパラメータにすることによって、原データ 配列,(,,)1つだけで、表示軸等の割り当てを自由に変更しても、X軸、Y 26

(28)

軸の順に固定したループの中で処理できるのである。柱) そして、ここで引き出された要素,(,,)の値に、高さのScaleをあてて (*100/HS)、棒の高さT(単位dot)が算出された。 〔3580-3600〕つぎに、高さTがOのときはバイパスさせたのち、手前隅の位 置WX、WYを定め、合計欄のときは棒高さを5分の1にする。 〔3610〕Subroutine*BARCOLR〔#7-1〕を呼びだして、棒の高さ に応じて色を定める。 〔3620-3630〕棒の高さが100度数をこえるときは、*TALL〔#7-3〕をよ んで処理し、他は*BARSET〔#7-2〕をよんで実際に棒を表示する。 〔3640-3650〕以上の過程を繰り返す。 〔3660〕*H・SCALE2〔#7-3〕をよんで、棒群で一部隠された外壁部の等 高線を再び描き、高さを読みやすくする。 9.1#7-1高さ別色づけ*BARCOLR(3690-3760) 棒の色COLを定めろ。WB()で定められた値に応じて高い順に、赤、黄、緑、 水、青色が与えられる。初期値は、#1の1340行で与えられている。

同時に模様の色もこれと同一にするため3原色のnag変数BLU,RED,GRN

に0(これと論理積ANDをとる全bitがOとなりマスクされることになる)か F(16進でFF、同様に相手の全bitがそのままでてくる)を指定する。 9.2#7-2描棒*BARSET(3770-4160) 棒を描く。まず色を設定する変数Cに棒の色に使用しない紫(code3)を指定 して、*FRAMEOUTER〔#7-2-1〕をよびだし棒の外輪郭を描き、*FR AMESWEEP〔同-2〕で枠内を無色にする。つぎに色Cに白(cobe7)を指定 して外輪郭を白くし、*FRAMEINNER〔同-3〕で外輪部内にある3本の稜 線を同色で引く。そして*BARTILING〔同-4〕で模様を描いて1本の棒を (注)このように多層化した処理をせずに、表示のためのデータ配列を別に 設定し、項目の軸割り当てを変えるたびに書換える方法もあるし、XY軸に割 り当てる項目の組み合せに応じた処理系を並設して選択させる方法もある。い ずれも論理構成は単純になるが、処理系が6種も必要になり、分岐や合流の処 理などもでてきて、かえって複雑になり冗長化するのを避けられない。 27

(29)

描き終る。外枠を2回引くような面倒なことをするのは、手前のものが背後を 隠す隠線処理をするためで、一度通常の模様や線に使わない色で囲い中を無色 (DISPLAY上では黒)にしてから本来の線の色で囲いなおし、線と模様を新た に描くことでそれが実現されるからである。 以下、これら下請けrOutineを説明する。 #7-2-1*FRAMEOUTER〔3830-3910〕棒の基準点(WX、WY)から 左廻りに相対移動6STEPで棒の図上の外郭線を描いていく。 *7-2-2*FRAMESWEEP〔3920-3950〕上記で描かれた外輪郭線内部 をCOLOR番号O、黒(実は無色)で塗りつぶす。背後に書かれていた画像は すべて消え、新たな棒が前面にでて描かれろ。つまり陰線処理が行われるので あるが、後から描かれるものがそれ以前のものを隠すので、手前のものほど後 から描く必要がある。*BARDRAWのY軸方向の描画順が番号の大きいもの から0番までと逆順になっているのはそのためである。 #7-2-3*FRAMEINNER〔3960-4010〕外輪郭内に棒の上面手前角に 集まる3本の稜線があるが、これを描く。外輪郭と分けて描くのは、内部の清 掃を一括して行った方が簡便だからである。

#7-2-4*BARTILING〔4020-4160〕まず、STRING変数TILE$で模

様1byte分のdotパターンを数値で示す変数Kと、#7-1で指定された原色と

のANDをとって色付きの模様を定めろ。そして後半で、棒の頂面に色(ここ では黒)を塗り、その大きさによって定められる色Cを左側面は全面に、正面 は上記で定めた模様パターンを描く。 9.3#7-3等高線再描*HSCALE2(4170-4240) 等高線ははじめに引かれ、棒によって消されてしまうため、棒の高さが測り にくくなってしまうので、棒の上から再び描くことで見えやすくした。なお、 50と100の線は水色にして多少目立つようにしている6 9.4#7-4大数値棒の分割*TALL(4250-4330) 要素の度数が大きく、棒が100dotsを越える場合、画面のはみ出しや他部分 の隠蔽等を防ぎ見やすくするために、高さ100の棒を順次手前に並べて描き、 残った分を最手前に描く。描くのは上記の*BAR・SETである。4本以上並ぶと手

前の棒の領域にはいって見苦しくなるので、Heightscale〔f・3キー〕老調

28

(30)

'draw height scale again

'---<#7-1>

assign bar color

---*BAR.~OLR

'Ranging with 5 color

#Ji~]J<1f

IF T>WB(I) THEN COL=2: BLU=O: RED=F: GRN=O: RETURN

IF T>WB(2) THEN COL=6: BLU=O: RED=F: GRN=F: RETURN

IF T>WB(3) THEN COL=4: BLU=O: RED=O: GRN=F: RETURN

IF T>WB(4) THEN COL=5: BLU=F: RED=O: GRN=F: RETURN

IF T>WB(5) THEN COL=1: BLU=F: RED=O: GRN=O: RETURN

RETURN

'---<#7-2>

set

&

draw Bar

----*BAR.SET

'BAR.FRAME

C=3: GOSUB *FRAME.OUTER: GOSUB *FRAME.SWEEP

C=7: GDSUB *FRAME.OUTER: GOSUB *FRAME.INNER

GOSUB *BAR.TILING

RETURN

t)

A

~

7

3490 '===============================================

3500'

«#7»

Draw Bars

3510 '===============================================

3520· ,

3530 *BAR.DRAW

3540

FOR B=NY TO 0 STEP -I

'#

V-axis

"3550

FOR A=O TO NX

'#

X-axis

3560

V(IX)=X(A): V(IY)=V(B): V(IZ)=NZ

3570

T=CINT(D(V(I),V(2),V(3))*100/HS)

3580

IF T=O THEN *B. OX

'case: nu II -> pass

3590

WX=XO+A*XP-B*DX: WY=YO-B*VP

'position of Bar

3600

IF B=NY OR A=NX THEN

T=CINT(T/5)

'sum colslrows are

1/5

3610

GOSUB *BAR.COLR

'sellect "Bar color

3620

IF T>100 THEN GOSUB *TALL: GOTD *B.DX 'folding tall ba5

3630

GOSUB *BAR.SET

'set Bar frame

&

draw

3640

*B.DX

NEXT

3650

NEXT

3660 GOSUB *H.SCALE2

3670 RETURN

3680 '

3690

3700

3710

3720

3730

3740

3750

3760

3770

3780

3790

3800

3810

3820

- 29

(31)

-'side

botm

'side I

'top back#

'side

r '

'front r

'f

ront botm

3830

3840

3850

3860

3870

3880

3890

3900

3910

3920

3930

3940

3950

3960

3970

3980

3990

4000

4010

4020

4030

4040

4050

4060

4070

4080

4090

4100

4110

4120

4130

4140

4150

4160

4170

4180

4190

4200

'--<17-2-1>

*FRAME.OUTER

'OUT.F

LINE(WX,WV)-STEP(-SW,-SH),C

LINE -STEP( O,-T),C

LINE -STEP(FW,O),C

LINE -STEP(SW,SH),C

LINE -STEP(

0,

T),C

LINE

~STEP(-FW,O),C

RETURN

'--<#7-2-2>

*F'RAME.SWEEP

PAINT'STEP(l,-I),O,C

'paint black inside of frame

RETURN

'--<#7-2-3>

*FRAME'. INNER

LINE

-STEP(

O,-T),C

'front I

"LINE' -STEP(FW,O),C

'front top'#

LINE(WX,WV'-T)-STEP(-SW,-SH),C

'top I

RETURN

, '- -<#7 -

'2 -

4>

*BAR.TILING

'-- set ti Ie patterns

: TI

LE$="": VPAT=B

MOD

6

I.MAX=VAL(LEFT$(PAT$(YPAT),I»

FOR I=1 TO I .MAX

K=VAL("&H"+MIO$(PAT$(VPAT),3*1,2»

'piece

of

pat.

TILE$=TILE$'+CH'R$(K

AND

BLU)+CHR$(K

AND RED)

+CHR$(K

AND

GRN)

'select

colors

NEXT

"- - draw

patterns

PAINT

(WX,WV-T-l),O,C

'top

color

IF' T<2 THEN RETURN

PAINT STEP(-2, O),COL,C

'side

color

PAINT (WX+2,WY-l),TILES,C

'front

ti

Ie

RETURN

'---<#7-3~

Height Scale

2

----*H.SCALE2

FOR

K=l

TO

10 : SC=I:

IF K MOO 5 THEN

ELSE

SC=5

POINT

(XO+SX,YO+SY-K*lO)

(32)

-4210LINE‐STEP(SCX,O),SC,,&H8888 4220LlNE‐STEP(-SX,-sY),SC,,&HAAAA 4230NEXT 4240RETURN 4250’--<#7-4>Tallbar‐‐‐‐---‐‐ 4260*TALL 4270、=T¥100:R=TN0DlOO 4280FORT1=lTOD,drawlongbarsinarow 4290T=100:COL=2:GOSU8*BAR・SET’ 4300WX=VX+SMW=W+SH,towardsfore8round 4310NEXT 4320T=R:COL=2:GOSU8*BAR・SET,draHresiduaIbar 4330RETURN 4340’ 4350,********Tailof3D8arDraHin8*********** 4360, 10#8ファンクション・キー設定*INlTFKEY(リスト8,4370-5460)

諸設定変更のSubroutine群をFunctionkeyにも割り当てる。

BASICでのFunctionkeyによる割り込みはく1行分の処理が終了すること

にチェックされ、そのキーに割り当てられたRoutineにとんでその機能が実行 されるので、頻緊にあるいは不時に使用される機能群を割り付ければ、プログ

ラムを簡潔にして見通しをよくすると同時に決りきった入力を減らすなど操作

性と融通性も向上できる性質を持っていろ。本件のように設定事項が多くその

変更機会も多い場合には、きわめて高い効果をあげうる。途中の段階から抜け

出て最初から設定しなおすことも前に戻ることもできるなど分析上の使い勝手

も大幅に向上する。本プログラムでは、この機能を広く活用している。

〔4410-4480〕*INITFKEY本体各キーに割り当てた機能の名称を表示し

た後、ONKEYGOSUB.、で各機能のSubroutine名を指定し〔4460〕、この

割り込みを有効にして、キー指定変更'のflagKEY・CHGKをたてろ〔4460〕。

またSTOPkeyで、既定の機能に戻すSubroutine*FKRESET〔#8-0〕に

飛ぶようにしておく(これはf・10で復旧する)。 31

参照

関連したドキュメント

※1・2 アクティブラーナー制度など により、場の有⽤性を活⽤し なくても学びを管理できる学

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

ヒュームがこのような表現をとるのは当然の ことながら、「人間は理性によって感情を支配

共通点が多い 2 。そのようなことを考えあわせ ると、リードの因果論は結局、・ヒュームの因果

我々は何故、このようなタイプの行き方をする 人を高貴な人とみなさないのだろうか。利害得

このような情念の側面を取り扱わないことには それなりの理由がある。しかし、リードもまた

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本

“〇~□までの数字を表示する”というプログラムを組み、micro:bit