2Dグラフィックス


 

2Dグラフィックスの基本は点や線を描くことから始まります。 ここでは、モンテカル

ロ法を使って円周率を計算するプログラムを例に説明します。

 

1.点の描画

 

座標(X、Y)に点を描画したい時には、以下のように記述します。 点の種類や色は

SET文を使って指定できます。

 

PLOT POINTS : 数値式 , 数値式

SET POINT STYLE 数値式

SET POINT COLOR 数値式

 

 

2.線の描画

 

座標(X1、Y1)から座標(X2、Y2)まで線を描画したい時には、 以下のように記述

します。線の種類や色はSET文を使って指定できます。

 

PLOT LINES : 数値式 , 数値式 ; 数値式 , 数値式

SET LINE STYLE 数値式

SET LINE COLOR 数値式

 

 

それでは、モンテカルロ法を使った円周率の計算手順を説明します。円とそれに

接する正方形を考えてください。この正方形内でランダムに点を発生させます。 こ

れらの点のうち円周上と円内で発生した点の数をカウントします。  この数を発生し

た点の総数と比較することで円周率を計算できます(点のカウント数が図形の面積

に比例する)。よって、

 

円周率=4X(円周上と円内の点の数)/(点の総数)

 

以下に、モンテカルロ法を使った円周率の計算プログラムを示します。 十進BASI

を使っています。

 

PROGRAM-ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD.GIF - 7,232BYTES

PROGRAM-ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD-2.GIF - 8,828BYTES

PROGRAM-ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD-3.GIF - 3,803BYTES

 

次に、シミュレーションの結果を示します。点の総数を100個、1000個、そして10

000個とした場合の円周率は、  それぞれ3.00003.07303.1512となり

ます(図1、図2、図3参照)。RANDOMIZEという命令文をプログラム内に挿入し

ているので、シミュレーションをするたびに円周率の値は違ってきます。

 

<点の総数が100個の場合>

ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD-100.GIF - 5,198BYTES

(図1、十進BASICによる2Dグラフィックス)

 

<点の総数が1000個の場合>

ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD-1000.GIF - 10,457BYTES

(図2、十進BASICによる2Dグラフィックス)

 

<点の総数が10000個の場合>

ENSHUURITSU-KEISAN-MONTE-CARLO-METHOD-10000.GIF - 18,117BYTES

(図3、十進BASICによる2Dグラフィックス)

 

モンテカルロ法の計算を球とそれに外接する正六面体に適用しても、円周率を計

算できると思います。3Dグラフィックスを使って点を表示させてみてください。

 

 

点や線については ある程度描けるようになってきたので、 次のステップとして図形

移動について考えてみます。 平行移動回転移動そして対称移動が基本です

が、それらを組み合わせれば複雑な移動の操作も可能となります。加えて、図形の

拡大縮小の方法も検討します。

 

 

3.図形の平行移動・回転移動・対称移動

 

移動したい図形の座標点の一つを(X、Y)としましょう。  平行移動をしたい場合は、

平行移動する方向の座標に移動する距離を単純に加えます。 例えば、X方向にa、

Y方向にbだけ平行移動したいときには、移動後の座標点の値を

 

(X+a、Y+b)

 

にします。次に、回転移動を考えてみましょう。  既に、遠心力のところで簡単に説明

したので、ここではそこでの式を使って説明します。 回転前の座標点(X、Y)と回

転後の座標点(X、Y)との関係は、回転角をθとして(原点が回転の中心

 

=XCOSθ+YSINθ

=−XSINθ+YCOSθ

 

となります。ただし、この場合の回転方向は時計方向となります。 したがって、回転

後の座標点の値は

 

(X COSθ+Y SINθ、−X SINθ+Y COSθ)

 

となります。最後に、対称移動を考えてみましょう。 直線cX+dY=eに対して線対

な点(X、Y)は、 移動する前の点(X、Y)から上記の直線に垂線を引いたと

きの交点の座標を(X、Y)とすると、次のような関係があります。

 

=(X+X)/ 2

=(Y+Y)/ 2

 

したがって、交点の座標が判れば、以下の式から線対称な点の座標を計算できるこ

とになります。

 

=2X−X

=2Y−Y

 

交点を求めて線対称な点を計算してみます。直線上の点を(X、Y)とすると、この

点から交点に向かうベクトルと移動する前の点から交点に向かうベクトルは互いに

直交するので、

 

(X−X)(X−X)+(Y−Y)(Y−Y)=0

 

という関係が得られます。また、交点(X、Y)は直線上にあるので、

 

cX+dY=e

 

という関係も得られます。これらの二式を解くと、

 

=(d−cdY+ce)/(c+d

=(−cdX+c+de)/(c+d

 

が得られます。ゆえに、線対称な点の座標(X、Y)は最終的に、

 

=2(d−cdY+ce)/(c+d)−X

=2(−cdX+c+de)/(c+d)−Y

 

となります。

 

 

4.図形の拡大・縮小

 

図形を拡大・縮小する基準点を(X、Y)とします。この基準点を原点へ移してから

図形を拡大または縮小し、その後、基準点を元の位置に戻します。 よって、拡大す

る前の点の座標を(X、Y)とし、拡大後の座標を(X、Y)とすると、

 

=K(X−X)+X

=K(Y−Y)+Y

 

という関係が得られます。縮小する場合も上の関係式を使えます。ここで、Kは拡大

または縮小率です。

 

 

上記で説明した移動や拡大・縮小を順番に行うプログラムを考えてみます。  勿論、

十進BASICを使ってプログラムを作成しています。

 

原点を中心とする正五角形を最初に描画し、平行移動、 回転移動そして対称移動

という順に図形を移動し描画し、最後に、 元の図形を1.5倍に拡大し描画します。

プログラムを若干修正して正多角形の角数を無限に増やして行けば、 最終的に

を描くことになります。したがって、2Dグラフィックスにおいて正多角形の描画も円の

描画もプログラム自体において大差はありませんメインプログラムには、汎用性

を持たせるために、正多角形の各頂点の座標を計算するコードを置き、正多角形の

元の図形の描画、 平行移動後の図形の描画、 回転移動後の図形の描画、対称移

動後の図形の描画、 拡大後の図形の描画などは、 メインプログラムから外部副プ

ログラムをそれぞれ呼び出して行っています。 実引数仮引数の使い分けに注意

してください。 また、正多角形の各頂点の座標値は配列で表現しています。 ゆえに

、配列も引数として副プログラムの方へ渡されています(別ページを参照)。

 

正多角形の移動・拡大のプログラム

 

プログラムの実行結果を以下に示します(図4参照)。  が元の正五角形、 がX

軸の+方向に50移動した後の図形、 が時計方向に60度回転した後の図形、

ンクが直線(X−Y=0)に対して線対称な図形、 そして、 最後にピンク(点線)が原

点を基準にして1.5倍に拡大した図形です。

 

ZUKEI-IDOU-KAKUDAI.GIF - 8,395BYTES

(図4、十進BASICによる2Dグラフィックス)

 

図形の描画に時間差を付けたいときは、 図形を描画するためのCALL文CALL

の間に次の一文を入れてください。

 

WAIT DELAY 秒数

 

 

課題(その1)

 

原点が最小値(または最大値)になる二次曲線を描いて、 原点を含めてそれぞれ

等間隔(曲線の長さで測って)にある点群に正三角形を描画してください。ただし

各正三角形の重心を上記の点群の座標値と一致させてください。 また、 正三角形

の頂点の一つが点群の座標値で取った法線の方向を向くようにしてください。 その

向きは外向きとします。

 

 

5.フリードローイング

 

マウスを使ったフリードローイングの方法を説明します。 マウスを左クリックして点

を拾って多角形を描画したり、  マウスを左クリックしドラッグして曲線を引いたりでき

ます。まず、 複数の点を画面上でクリックして その座標値を配列に読み込むには、

次のようにします。

 

DIM X座標の配列名(1 TO 要素数)

DIM Y座標の配列名(1 TO 要素数)

LET I=1

DO

IF 条件式 THEN EXIT DO

GET POINT:変数名1,変数名2

LET X座標の配列名( I )=変数名1

LET Y座標の配列名( I )=変数名2

LET I = I +1

LOOP

 

条件式を満足すれば、座標値の読み込みは終了します。 また、クリックしドラッグし

フリーハンドで曲線を描くためには、以下のようにします。

 

DIM X座標の配列名(1 TO 要素数)

DIM Y座標の配列名(1 TO 要素数)

MAT GET POINT:X座標の配列名(?),Y座標の配列名(?)

MAT PLOT LINES:X座標の配列名,Y座標の配列名

 

上記において、要素数は十分に大きくとってください。以下に、上記の方法で描いた

多角形と曲線の図を示します(図5参照)。

 

<多角形や曲線のフリードローイング>

FREE-DRAWING.GIF - 2,841BYTES

(図5、十進BASICによる2Dグラフィックス)

 

フリードローイングのプログラム

 

 

課題(その2)

 

上記のプログラムにおいて、多角形や曲線をフリードローイングすると同時にそれら

の線分の長さや面積を計算して表示する機能を追加してください。

 

多角形の分割法

 

 

6.コピー&ペースト

 

ドローイング( お絵描き )ソフトの基本的な機能であるコピー&ペーストをプログラ

ム的に実現してみましょう。  図6は三角形と四角形を一つずつフリードローイングし

たものです。 各図形の頂点座標のデータは二次元配列に格納しています。第一次

元の添え字は頂点番号を表し、第二次元の添え字は図形番号を表しています。

 

COPY-PASTE-1.GIF - 2,461BYTES

(図6、十進BASICによる2Dグラフィックス)

 

図7は、左側の三角形をコ―ピーしてペーストするためにコピーする範囲を設定した

ものです。この範囲内に完全に含まれない図形はコピーの対象になりません。

 

<点線内がコピーする範囲>

COPY-PASTE-2.GIF - 2,767BYTES

(図7、十進BASICによる2Dグラフィックス)

 

図8は、左側の三角形が選定された後の状態を示しています(三角形の色が変化)

 

COPY-PASTE-3.GIF - 2,534BYTES

(図8、十進BASICによる2Dグラフィックス)

 

図9は、元の三角形を三か所にコピー&ペーストした後の図です。

 

COPY-PASTE-4.GIF - 3,422BYTES

(図9、十進BASICによる2Dグラフィックス)

 

市販のドローイング用ソフトが持つ機能を全て実現しようとすると、 相当大規模なプ

ログラムになることが以下のプログラム例からも実感できると思います。

 

コピー&ペーストのプログラム

 

課題(その3)

 

図形を選定した後、  その図形をドラッグして徐々に移動する機能をプログラム的に

実現できるか検討してください。 また、図形内の辺や頂点を選定して特定の方向に

引き伸ばしたり、縮めたりする機能をプログラム化してください。

 

 

7.文字・記号の作成と利用

 

自分自身で新しい文字記号を作成して 2Dグラフィックスで利用したいと思ってい

る方も少なくないと考えます。 そういう方のために、 文字や記号をデータ化してプロ

グラム内で使う方法を検討してみます。 図10は20X20のビットマップです。作りた

いパターン形状に合わせて 特定のビットの色を変えることで 文字と記号を作成しま

す。

 

BITMAP-1.GIF - 2,669BYTES

(図10、十進BASICによる2Dグラフィックス)

 

図11は将棋の駒に使われるの文字をビットマップを使って表したものです。

 

BITMAP-2.GIF - 3,091BYTES

(図11、十進BASICによる2Dグラフィックス)

 

上図のビットマップをデータ化するためには、二次元配列を使い黒い部分のビットに

対応する配列の要素を1とし、緑のビットに対応する要素を0とすれば良いでしょう。

 

ビットマップ作成のプログラム

二次元バーコード

 

課題(その4)

 

将棋の駒に書かれている表・裏の文字をビットマップを使って作成し、 二次元配列を

用いてデータ化してください。 よりリアルな文字を作るためには、ビットマップのビット

数を大幅に増やす必要があるかもしれません。

 

 

8.スクロール機能

 

 

 


 

Topへ