ここでは、前回扱ったライブラリ以外で、よく用いるライブラリについて扱います。
標準ライブラリは、前回扱ったものが全部ではありません。 前回扱ったライブラリは、VCSSL 2.0 の頃から存在し、言語として最低限必要になる基板機能を提供しているものです。
そして VCSSL 3.0 以降では、より幅広い機能を提供するライブラリも順次増えていっています。 それらは、最初は標準ライブラリとは別扱いの位置づけでしたが、 VCSSL 3.4 の時点で多くが標準ライブラリに統合されました(旧 Open VCSSL Library など)。
以下では、実際にそららの内のいくつかを使用してみます。
まずは、「スタック」や「キュー」などのデータ構造を扱うライブラリです。
スタクとキューは、値を出し入れして、溜めておくための仕組みです。 両者で異なるのはデータ の取り出し順序で、 キューは入れた順に、スタックは逆順に取り出します。 つまりスタックでは、最後 に入れたデータが最初に取り出されます。
データ構造を扱うための機能は、一般にジェネリクスを用いた構造体と関数によって提供されます。 そのため、任意型の値(自作の構造体を含む)を扱う事ができます。
以下に使用例を掲載します:
import data.Stack; // スタクの機能を提供するライブラリ
import data.Queue; // キューの機能を提供するライブラリ
Stack s; // 整数値のスタックを扱う構造体
push<int>(s, 1); // スタック s に値「1」を入れる
push<int>(s, 2); // スタック s に「2」を入れる
println("スタックから値を取り出します:");
println( pop<int>(s) ); //スタック s から値を 1 つ取り出す
println( pop<int>(s) ); //スタック s から値を 1 つ取り出す
Queue<int> q; //整数値のキューを扱う構造体
enqueue<int>(q, 1) ; // キュー q に値「1」を入れる
enqueue<int>(q, 2) ; // キュー q に「2」を入れる
println("キューから値を取り出します:");
println( dequeue<int>(q) ); //キュー q から値を 1 つ取り出す
println( dequeue<int>(q) ); //キュー q から値を 1 つ取り出す
StackSample.vcssl
上のプログラムを実行すると、VCSSL コンソールに以下のように表示されます:
上の通り、スタックでは入れたのと逆順に、キューでは入れた順に、値が取り出された事が分かります。
data.Stack/Queueはスタックとキューを扱うライブラリで、詳細情報は以下のURLで参照できます。
描画やアニメーションなど、特別な処理を記述する必要があるものの、 頻繁に用いられるような用途に関しては、毎回同じような内容を記述しなくても済むように、 軽量フレームワークが用意され ています。
用途に応じたフレームワークを用いる事で、ゼロからプログラムを開発しなくても、 最低限 必要な部分だけを記述すれば済むようになります。
実際に3D描画を扱うためのフレームワークを使用してみましょう:
import Math;
import Color;
import Graphics3D;
import graphics3d.Graphics3DFramework; // 3D 描画用フレームワーク
// モデルの ID 格納変数や時刻変数など
int axis, box, sphere, cone;
float time=0.0;
/*
* 初期化を行う関数(プログラムの最初に一度だけ呼び出される)
* ここには、3D モデルの生成や配置など、
* プログラムの最初に行いたい準備処理を記述する
*/
void initialize(int rendererID){
// フレームワークのパラメータ設定
setBackgroundColor(Color.BLACK); //背景色の設定
setWindowSize(800, 600); //ウィンドウ幅,高さの設定
// 座標軸モデルを配置
axis = newAxisModel(3.0, 3.0, 3.0); //生成
mountModel(axis, rendererID); //配置
// 箱モデルを配置
box = newBoxModel(1.0, 1.0, 1.0); //生成
setModelColor(box, 255, 0, 0, 255); //色設定(赤,緑,青,α)
mountModel(box, rendererID); //配置
// 球モデルを配置
sphere = newSphereModel(0.5, 0.5, 0.5, 38, 24); //生成
moveModel(sphere, 1.5, 1.5, 0.0);
//移動(dX,dY,dZ)
setModelColor(sphere, 0, 0, 255, 255); //色設定(赤,緑,青,α)
mountModel(sphere, rendererID); //配置
// 円錐モデルを配置
cone = newConeModel(0.5, 0.5, 1.0, 38, 2); //生成
moveModel(cone, 0.0, 0.0, 1.0); //移動(dX,dY,dZ)
setModelColor(cone, 0, 255, 0, 255); //色設置(赤,緑,青,α)
mountModel(cone, rendererID); //配置
}
/*
* 更新処理を行う関数(繰り返し呼び出される)
* ここには、3D モデルの移動など、
* 毎ループ行いたい任意の処理を記述する
*/
void update(int rendererID){
rotXModel(box, 0.08); //箱モデルを X 軸まわり回転
rotZModel(sphere, 0.01); //球モデルを Z 軸まわり回転
//円錐モデルを適当に移動(dX,dY,dZ)
moveModel(cone, 0.1*sin(time), 0.1*sin(3.0*time), 0.0);
time += 0.1; // 時刻を少し進める
}
FrameworkSample3D.vcssl
上のプログラムを実行すると、下図のような3Dアニメーション映像が表示されます。
上で用いた graphics3d.Graphics3DFramework は、3D描画用途をサポートする、 アニメーション対応のフレームワークです。 詳細情報は以下の URL で参照できます。
VCSSLには、3D描画を扱うための標準ライブラリ「 Graphics3D 」が存在します。 しかし、それだけで現実的な3Dプログラムを開発するには、表示画面や描画エンジンの生成や、 アニメーションループの制御、ライトの設定など、面倒な処理を自分で記述する必要があり、 簡易用途ではやや不便です(逆に、細かい部分まで自分で調整したい場合には便利です)。
そこでgraphics3d.Graphics3DFrameworkを使用すると、 そういった面倒な部分はフレームワークが自動で行ってくれます。 そして、準備が完了したタイミングでonStart関数、 アニメーション中の画面更新タイミングでonUpdate関数を呼んでくれます。 なので、これらの関数内に目的の処理を記述するだけで、手軽に3Dアニメーションプログラムを開発できます。
なお、このフレームワークでは、あくまで面倒な部分を自動化してくれるだけなので、 独自に記述する部分に関しては標準ライブラリ「 Graphics3D 」の関数を使用する必要があります。 上のプログラムでも、モデルの生成や配置、移動などにGraphics3Dライブラリの関数を使用しています。 標準ライブラリ「 Graphics3D 」に関する詳細情報は以下のURLで参照できます。
なお、3D同様、2D描画用のフレームワークも用意されています。使用例を以下に掲載します:
import Graphics2D;
import graphics2d.Graphics2DFramework; // 2D描画用フレームワーク
/*
* 初期化処理を行う関数(プログラムの最初に一度だけ呼び出される)
* ここには、プログラムの最初に行いたい準備処理を記述する
*/
void initialize (int rendererID) {
// フレームワークのパラメータ設定
setAnimationState(false); //アニメーションはしないので無効化
setWindowSize(300, 300); //ウィンドウサイズの設定
}
/*
* 描画処理を行う関数(繰り返し呼び出される)
* ここには、2DCGの描画処理などを記述する
*/
void paint(int rendererID) {
string imageFilePath = "fighter.png"; //画像ファイル
// 青色で直線を描画
setDrawColor(rendererID, 0, 0, 255, 255); //赤,緑,青,α
drawLine(rendererID, 0, 0, 100, 100); //x,y,w,h
// 緑色で長方形を描画
setDrawColor(rendererID, 0, 255, 0, 255); //赤,緑,青,α
drawRect(rendererID, 0, 100, 100, 100, true); //x,y,幅,高さ,塗りつぶし
// 赤色で楕円を描画
setDrawColor(rendererID, 255, 0, 0, 255); //赤,緑,青,α
drawOval(rendererID, 50, 0, 150, 100, false); //x,y,幅,高さ,塗りつぶし
}
FrameworkSample2D.vcssl
上のプログラムを実行すると、ウィンドウに線、長方形、楕円が表示されます。
上で用いたgraphics2d.Graphics2DFrameworkは、2D描画用途をサポートする、 アニメーション対応のフレームワークです。詳細情報は以下のURLで参照できます。
描画関数などに関しては、標準ライブラリ「 Graphics2D 」を使用する必要があります。詳細情報は以下のURLで参照できます。
独立したソフトウェアのようなツールとやり取りするAPIライブラリも存在します。 例えば、グラフソフトと通信し、グラフをプロットする機能を提供するライブラリなどが挙げられます。 ただし、そうした機能は実装規模が比較的が大きいため、サポートされるかどうかは、処理系開発元の判断によります。 グラフソフト関連の機能などは、数値計算分野に向けた処理系ではサポートされるかもしれませんし、 全く必要の無い用途に向けてはサポートされないかもしれません。
以上のような事を前提とした上で、 数値計算用の2D/3Dグラフソフトを制御するためのライブラリ仕様が、以下のURLの通りに用意されています。
上の「 tool.Graph2D/Graph3D 」ライブラリがサポートされている処理系においては、 上記仕様の通りに、2D/3Dグラフをプロットする事ができます。
実際の使用例は、細かい部分は処理系依存ですが、大まかに以下のようになります。まずは、2Dグラフの場合です:
import tool.Graph2D; // 2Dグラフソフト制御用ライブラリ
// ファイル「data2d.tsv」にデータを書き出す
int fileID = open("data2d.tsv", "wtsv"); // wtsvはTSV形式の書き込みモード
float dx = 0.1;
float x;
float y;
for(int i=0; i<10; i++) {
x = i * dx;
y = x * x;
writeln(fileID, x, y); // ファイル書き込み
}
close(fileID); // ファイルを閉じる(忘れると書き込みが完了しないので注意)
// 2次元グラフソフトを起動
int graph2D = newGraph2D();
// ファイル「data2d.tsv」をグラフにプロット
setGraph2DFile(graph2D, "data2d.tsv");
Graph2DSample.vcssl
実行すると、以下のようなグラフが表示されます:
座標軸の目盛りやラベルがどのように表示されるかは処理系依存です。
続いて、3Dグラフの場合です:
import tool.Graph3D; // 3Dグラフソフト制御用ライブラリ
// ファイル「data3d.tsv」にデータを書き出す
int fileID = open("data3d.tsv", "wtsv"); // wtsvはTSV形式の書き込みモード
float dx = 0.1;
float dy = 0.1;
float x, y, z;
for(int i=0; i<=30; i++) {
for(int j=0; j<=30; j++) {
x = i * dx;
y = j * dy;
z = x * x + y * y;
writeln(fileID, x, y, z); // ファイル書き込み
}
writeln(fileID, "");
}
close(fileID); // ファイルを閉じる(忘れると書き込みが完了しないので注意)
// 3次元グラフソフトウェアを起動
int graph3D = newGraph3D();
// ファイル「data3d.tsv」をグラフにプロット
setGraph3DFile(graph3D, "data3d.tsv");
Graph3DSample.vcssl
実行すると、以下のようなグラフが表示されます:
座標軸の目盛りやラベルがどのように表示されるかは処理系依存です。