一般座標系に強くする
-2004年10月1日改訂-


・PCの座標配列
・一般の座標配列へ変える
・右下を原点としてみる
・座標変換プログラムの実行
・中央を原点としてみる(極座標)
・関数グラフを作る


PCの座標配列

 PCの座標は左上がX=0,Y=0の原点でXは右にいくに従って増え、Yは下にいくに従って増える。
Windowsの場合は800×600モードならば右下がX=800(正確には799)、Y=600(正確には599)になる。
 MSXのSCREEN5の場合は256×212になる。MSXパソコンの解像度は精密な図面をひくことには適さない。

一般の座標配列へ変える

 右下が原点でXは左にいくに従って増え、Yは上にいくに従って増える場合、極座標などは十字になってプラスマイナスと 増えていく。
そういう場合もある。また、これとは限らず上から下へ左から右という場合もないわけでもない。

MSX-POS

これは画面の左上の一部だ。X=0,Y=0(星の点)は左上になっている。
ではX=8,Y=6(丸い点)に点を打ってみましょう。
ここを原点とするならば0の領域はブルーのラインになる。
PCでなんだか極座標が描けそうな気がしないか?
Xは右へいくとプラスに増え、左へいくとマイナスへ減る
これは教科書どおりだ。
Yは上へいくとマイナスへ減り、下へ行くとプラスに増える
これが
Yは上へ行くとプラスに増え、下へ行くとマイナスに減る
にしたい。
ならば符号変換を行えばよい。
教科書で使う実数を前提に考えよう。
+1を-1にしたいならば-(+1)=-1
-1を+1にしたいならば-(-1)=+1
これを踏まえて

簡単な変換方法:右下を原点としてみる

 簡単な変換方法は計算式を出さずに答えだけを配列変数にする方法がある。
メモリは使いますが計算結果が出ているので高速になる。

・Xは0から255
X(0)からX(255)を宣言すればいい。

・Yは0からY(211)
Y(0)からY(211)を宣言すればいい。

DIM X(255),X(211)となる。

・変数に代入された数を配列変数の数のデータを参照させる、右下を原点の場合

FORI=0TO255
X(I)=-(I-255)
NEXT

FORI=0TO211
Y(I)=−(I-211)
NEXT

 −(I−255)は-255という座標が存在しないから-(-255)で+に変換している。
実行してみると

X=2:Y=3の場合は
PSET(X(2),Y(3)):CIRCLE(X(2),Y(3)),3,15


点を打って、半径3の中心円を描く。

座標変換プログラムの実行

 メモリに入れているために少し時間がかかる。
表示されるとかなり、右下になっている。画面いっぱいでは見えにくいが、こんなところかな。
 見えやすいようにやってみる。多少は中央よりになってきた。

X=2:Y=3:PSET(X(X*10),Y(Y*10):CIRCLE(X (X*10),Y(Y*10)),3,15


10 SCREEN5
20 DIMX(255),Y(211)
30 FORI=0TO255:X(I)=-(I-255):NEXT
40 FORI=0TO211:Y(I)=-(I-211):NEXT
50 BEEP:X=2:Y=3
60 PSET(X(X*10),Y(Y*10)):CIRCLE(X(X*10),Y(Y*10)),3,15
70 A$=INPUT$(1)

簡単な変換方法:中央を原点としてみる
 次に関数グラフをやってみたい、
中央の座標は256×212の場合、128,106になる。
 単なる十字の線ですが、おおお!と思う。
黒板の線がみごとパソコンに表示される感動か。


10 SCREEN5
20 LINE(0,105)-(255,105),15
30 LINE(127,0)-(127,211),15

 ここまでは誰でもできる、ここからがプログラミングの知恵になる。
X軸が最大で±128、Y軸が最大で±106まで表示が可能になった。

・極軸の場合

 Xは127を境にして、左がマイナス、右がプラスになる。
Yは105を境にして、下がマイナス、上がプラスになる。
Y軸の増え方は上下がりではなく下がり上になる。その為、負号変換する。

X+127
-Y-105

 となる。これの方がシンプルだったかな。
基本リストを作ってみた

10 SCREEN5
20 LINE(0,105)-(255,105),15
30 LINE(127,0)-(127,211),15
35 PSET(X+127,-Y+105),15:CIRCLE(X+127,-Y+105),4,15
40 A$=INPUT$(1)

 これで極に○がキターと思う。
ここからは自由に正比例、反比例、導関数などやってみるといい。

・XとYの要素を加えてみる

35 X=-3:Y=2:PSET(X+127,-Y+105),15:CIRCLE(X+127,-Y+105),4,15

 35行に要素を加えてみるだけで、このとおり可能。

・さらに数列を加えてみる

 1つの点では迫力がない、そこで数列でもっともっとやってみたい。

PSET(X+127,-Y+105),15:CIRCLE(X+127,-Y+105),4,15

  このモジュールは点がわかるようにCIRCLE命令を施したのでそれを削除。
1回以上の点を指定したい場合はサブルーチンを使う。
 とりあえず、100行においてみた。

100 PSET(X+127,-Y+105),15:RETURN
99 END

その方法はX=2:Y=3:GOSUB100で100へ行ってRETURNでまた戻るわけだ。
 プログラムは99行でおわり。この2行を加える

関数グラフをつくる

・y=2x

 では実際にこの関数をグラフ化して求めてみる。
先ほどの35行を書き換え範囲をx=-100から、x=100までやってみる。
 言うまでもないが、Xが3の時にY=6になる。ということはYは1¥2

35 FORX=-100TO100:Y=2*X:GOSUB100:NEXT

・y=150/x

35 FORX=-80TO-1:Y=150/X:GOSUB100:NEXT:FORX=1TO80:Y=150/X:GOSUB100:NEXT

 反比例。かなり描画に苦労させられた。どうしても数が小さいと点になってしまう。
数を大きくするとこのようになめらかな線になってきた。

・y=1/2x

35 FORX=-100TO100:Y=INT(1/2)*X:GOSUB100:NEXT

 二分の1エックスはこのようになる。INTは整数化するために使用。
こうしないとゼロ割りが発生してしまう。最後に+をやってみたい

・y=2x+3

35 FORX=-100TO100:Y=2*X+3:GOSUB100:NEXT

・y=2x^2

35 FORX=-4TO4STEP.01:Y=2*(X^2):GOSUB100:NEXT
100 PSET((X*10)+127,-(Y*10)+105),15:RETURN

 極を通らない線になる、次のXの2乗はかなり急な曲線になるので、
原点を10倍拡大と精度アップしたので時間がかかる。.
 この関数になってくるとたしか、高等レベルになってしまう。
35 FORX=-4TO4STEP.01:Y=2*(X-2^2):GOSUB100:NEXT

最後に数式を入れてみるか

X=1、y=-1にy=2x^2としてみる

15 OPEN"grp:"AS#1
35 FORX=-4TO4STEP.01:Y=2*(X^2):GOSUB100:NEXT:X=1:Y=-1:GOSUB100:PRINT#1,"y=2x^2"