第 2 章 Visual C# によるグラフィックス処理と CAD 入門~ アルゴリズム入門 ~
|
近年、CG の発展により、CAD は、様々な用途で活用されるようになりました。CAD とは、Computer Aided Design の略であり、コンピュータ設計支援と直訳できます。CAD は、グラフィックス処理を利用して設計を支援します。グラフィックス処理とは、プログラムの中で画像や図形に対し、表示や加工などの処理を行うことです。手書き図面より修正が容易なため、CAD は、より一般的なものになってきました。例えば、家を建築する場合の間取り図や設計図、自動車やテレビなどの機械・電化製品の設計図、TVCM や TV ゲームなどで多用される CG の基礎データの作成などにも CAD が利用されています。
グラフィックス処理では、回転・移動・拡大縮小などの幾何アルゴリズムが非常に重要です。現在、.NET Framework には、Web 関連のライブラリだけでなく、Windows 環境で蓄積されたグラフィックス処理のライブラリが豊富に用意されており、Visual C# からも利用できます。そのため、Visual C# は、図形描画システムや画像処理を利用したシステムなど、グラフィックス処理を用いた様々なシステムの開発が可能です。
そこで、本章では、Visual C# を利用して CAD を作成し、グラフィックス処理と幾何処理について説明します。
グラフィックスとは、一般的に画像や図形などのことを指します。そして、グラフィックス処理とは、プログラムの中で画像や図形に対し、表示や加工などの処理を行うことです。本節では、描画において必要となるクラスについて説明します。
グラフィックス処理において、四角形や楕円といった図形を描画することは、欠かすことのできない要素です。Visual C# では、Graphics クラスを利用することで、図形の描画、図形の塗りつぶし、色を設定することなどができます。Graphics クラスは、System.Drawing.Graphics 名前空間に存在します。そして、ユーザが図形を描画するには、Graphics クラスと Pen クラスからインスタンスを生成する必要があります。 Graphics インスタンスの生成には、CreateGraphics メソッドを利用します。Graphics インスタンスを生成することにより、PictureBox コントロールや Form などに図形を描画できるように設定します。Graphics インスタンスを生成する構文を次に示します。
| Graphics オブジェクト名 = コントロール名.CreateGraphics(); |
Visual C# では、描画する図形の線の色や太さを Pen クラスの利用により、ユーザは、変更することが可能です。Pen クラスは、System.Drawing.Pen 名前空間に存在し、直線および曲線などを描画する場合の線の色や太さなどを設定するメソッドが用意されています。また、 Graphics クラスを利用して図形を描画するためには、Pen クラスからインスタンスを生成することが必要です。 Pen インスタンスを生成する構文を次に示します。
| Pen オブジェクト名 = new Pen (Color カラー, float 線の太さ); |
Visual C# では、ユーザは、線で描画された図形だけではなく、SolidBrush クラスと Graphics クラスを利用することで図形を塗りつぶすことができます。SolidBrush クラスは、System.Drawing.SolidBrush 名前空間に存在し、四角形や楕円を塗りつぶすメソッドやその色を設定するプロパティが用意されています。SolidBrush クラスを利用して、特定の色で塗りつぶされた図形を描画するには、SolidBrush クラスからインスタンスを生成する必要があります。 SolidBrush インスタンスを生成する構文を次に示します。
| SolidBrush オブジェクト名 = new SolidBrush (Colorカラー); |
幾何処理とは、図形や空間の座標などに対して、座標変換などの処理を行うことです。本章では、平行移動や回転変換といった基本的な幾何処理について解説します。
現在、グラフィックス処理や幾何処理などのアルゴリズムをプログラム化する場合には、多数の数学の関数を用いることがあります。特に幾何処理を行うには、sin や cos などの三角関数が必要になります。Visual C# には、三角関数等を扱うために Math クラスが用意されています。Math クラスは、System.Math 名前空間に存在し、円周率の定数 (PI) や、三角関数や対数関数を扱うメソッド等が用意されています。
通常、幾何処理を扱うプログラムにおいては、行列の複雑な計算や変換を行う処理を開発者が作成する必要がありました。このことは、開発者に大きな負担を与えるだけでなく、プログラムのバグの要因にもなっていました。一方、Visual C# では、Matrix クラスという行列を扱うクラスが用意されており、このクラスを利用することで幾何処理を扱うプログラムを従来に比べて非常に短いコードで記述できます。Matrix クラスは、System.Drawing.Drawing2D.Matrix 名前空間に存在し、行列の乗算や、平行移動や回転変換などの幾何処理を行う行列を生成するメソッド等が用意されています。
CAD では、四角形、楕円、曲線などの基本図形を組み合わせて図面を作成します。そこで、本節では、Visual C# のグラフィックス処理を用いて、四角形、楕円、ベジエスプラインの描画方法、および作成するシステムのデータ構造について解説します。
四角形の描画には、Graphics クラスの DrawRectancle メソッドを使用します。DrawRectancle メソッドを使用するには、Graphics インスタンスと Pen インスタンスが必要です。四角形は、Pen インスタンスで設定された色、幅、スタイルで描画されます。DrawRectancle メソッドの構文を次に示します。
| Graphics インスタンス名.DrawRectancle (Pen Pen インスタンス名, int 始点の x 座標, int 始点の y 座標、int 描画四角形の幅, int 描画四角形の高さ); |
.gif)
図 1 : 四角形の描画
楕円の描画には、Graphics クラスの DrawEllipse メソッドを使用します。DrawEllipse メソッドを使用するには、四角形の描画と同様に、Graphics インスタンスと Pen インスタンスが必要です。楕円は、Pen インスタンスで設定された色、幅、スタイルで描画されます。DrawEllipse メソッドの構文を次に示します。
| Graphics インスタンス名. DrawEllipse (Pen Pen インスタンス名, int 始点の x 座標, int 始点の y 座標, int 外接四角形の幅, int 外接四角形の高さ); |
.gif)
図 2 : 楕円の描画
Visual C# では、円や楕円の弧として表現できない複雑な曲線の形式を表現するために、ベジエスプラインとカーディナルスプラインの 2 種類があります。本章では、より一般的なベジエスプラインについて解説します。
ベジエスプラインは、開始点、2 つの制御点、終了点の 4 つの座標で指定される曲線です。曲線は、制御点を通りませんが、制御点の方向に引かれます。つまり、ベジエスプラインは、開始点と制御点 1 を結ぶ架空の線によって示される方向で始まり、制御点 2 と終了点を結ぶ架空の線で示される方向で終わります。図 3 に、ベジエスプライン例を示します。
ベジエスプラインの描画には、Graphics クラスの DrawBezier メソッドを使用します。DrawBezier メソッドを使用するには、四角形の描画と同様に、Graphics インスタンスと Pen インスタンスが必要です。ベジエスプラインは、Pen インスタンスで設定された色、幅、スタイルで描画されます。DrawBezier メソッドの構文を次に示します。
| Graphics インスタンス名. DrawBezier (Pen Pen インスタンス名, Point 曲線の開始点, Point 曲線の制御点1, Point 曲線の制御点, Point 曲線の終了点); |
.gif)
図 3 : ベジエスプラインの描画
本システムでは、座標や高さ、幅などの図形を構成するために必要なデータは、GraphicsData クラスのプロパティとして保持されます。そのため、すべての図形の再描画を行う場合には、このクラスのプロパティを参照します。表 1 に、このクラスのプロパティを示します。
表 1 : GraphicsData クラスのプロパティ
| プロパティ名 | 型 | 説明 |
| Width | int | 図形の幅 |
| Height | int | 図形の高さ |
| PlaceType | int | 図形の種類 |
| SolidBrushFlag | int | 塗りつぶしの判断フラグ |
| FirstPoint | Point | 描画の原点もしくは始点 |
| SecondPoint | Point | 終点 |
| ControlPoint1 | Point | 1点目の制御点 |
| ControlPoint2 | Point | 2点目の制御点 |
| Pen | Pen | 使用した Pen オブジェクト |
| SolidBrush | SolidBrush | 使用した SolidBrush オブジェクト |
また、GraphicsData クラスでは、図形の操作に関する処理をカプセル化しており、4 つのメソッドが存在します。これらのメソッドにより、重心などのその図形における情報を取得することができます。表 2 に、このクラスのメソッドを示します。
表 2 : GraphicsData クラスのメソッド
| メソッド名 | アクセス | 説明 |
| FindSide | public | 座標値が指示された辺の判断 |
| GetCenterOfGravity | public | 座標値から図形の重心を算出 |
| SearchPointInGraphics | public | 座標値が内包されるかの判断 |
| GetMainAndMin | private | 最大、最小を算出 |
CAD には、コピーや消去、検索、属性付加といった図形の編集処理を行う機能があります。このような図形編集を行うためには、図形の選択処理が必要になります。そこで、本節では、図形の選択処理と本システムの編集機能について解説します。
ある図形に編集を行う場合には、マウスクリックにより編集対象の図形を選択する必要があります。一般的な図形の選択処理として、内包処理が挙げられます。
内包処理は、指定した座標が図形の内部に含まれているかを判断します。例えば、以下の図 4 の点 1 は、四角形に内包されており、楕円形に内包されていません。また、点 2 は、四角形と楕円形の両方に内包されています。つまり、内包処理を用いてマウスクリックした点が図形に内包されている場合は、図形を選択したことになります。
.gif)
図 4 : 内包処理
例えば、楕円形の方程式に指定した座標を入力し、その値が1以下ならばその点は内包されています。次に楕円形の内包式を示します。
(2a:長軸の長さ、2b:短軸の長さ)
public bool SearchPointInGraphics(int iX, int iY)
{
int iMaxX, iMinX; // iMaxX:最大x座標 iMinX:最小x座標
int iMaxY, iMinY; // iMaxY:最大y座標 iMinY:最小y座標
int[] iArrayX = new int[4]; // x座標配列
int[] iArrayY = new int[4]; // y座標配列
double dEllipseTemp; // 楕円情報
// 楕円の場合
if(this.PlaceType == ELLIPSE)
{
dEllipseTemp = Math.Pow((iX - (this.FirstPoint.X + this.Width / 2)), 2) /
Math.Pow((this.Width / 2), 2) + Math.Pow((iY -
(this.FirstPoint.Y + this.Height / 2)), 2) /
Math.Pow((this.Height / 2) , 2) - 1;// 楕円情報取得
if( dEllipseTemp <= 0) // 指示点が楕円内にある場合
return true; // 成功
}
// 楕円以外の場合
else
{
// 四角形の場合
if(this.PlaceType == RECTANGLE)
{
iArrayX[0] = this.FirstPoint.X; // 座標値の設定
iArrayY[0] = this.FirstPoint.Y; // 座標値の設定
iArrayX[1] = this.FirstPoint.X + this.Width; // 座標値の設定
iArrayY[1] = this.FirstPoint.Y + this.Height; // 座標値の設定
}
// ベジエスプラインの場合
else if(this.PlaceType == BEZIER)
{
iArrayX[0] = this.FirstPoint.X; // 座標値の設定
iArrayY[0] = this.FirstPoint.Y; // 座標値の設定
iArrayX[1] = this.SecondPoint.X; // 座標値の設定
iArrayY[1] = this.SecondPoint.Y; // 座標値の設定
iArrayX[2] = this.ControlPoint1.X; // 座標値の設定
iArrayY[2] = this.ControlPoint1.Y; // 座標値の設定
iArrayX[3] = this.ControlPoint2.X; // 座標値の設定
iArrayY[3] = this.ControlPoint2.Y; // 座標値の設定
iMaxX = 0; // 初期化
iMaxY = 0; // 初期化
iMinX = 0; // 初期化
iMinY = 0; // 初期化
// 最大,最小値の算出
this.GetMainAndMin(ref iMaxX,
ref iMinX, iArrayX, 4);// 最大x座標と最大x座標の取得
this.GetMainAndMin(ref iMaxY,
ref iMinY, iArrayY, 4);// 最大y座標と最大y座標の取得
iArrayX[0] = iMinX;// 座標値の設定
iArrayY[0] = iMinY; // 座標値の設定
iArrayX[1] = iMaxX; // 座標値の設定
iArrayY[1] = iMaxY; // 座標値の設定
}
// 図形内に指示点がある場合
if(iArrayX[0] <= iX && iX <= iArrayX[1]
&& iArrayY[0] <= iY && iY <= iArrayY[1])
return true; // 成功
}
return false; // 失敗
}本システムでは、図形の選択処理を利用した図形のコピーと、図形の全消去の機能を実装しています。
図形のコピー機能は、図形データの配列の最後に、選択された図形データのコピーを付け加えます。次に図形コピーのプログラムを示します。
private void CopyGraphics()
{
GraphicsData gGraphicsData = new GraphicsData();// インスタンス生成
// ベジエスプライン以外の場合
if(((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).PlaceType != BEZIER)
{
(中略)
aGraphicsList.Add(gGraphicsData);// グラフィックスデータをリストの追加
// 図形の再描画
gGraphics.Clear (Color.White); // 初期化
MakeAllGraphics(); // 全グラフィックスの再描画
}
}図形を消去するには、Graphic クラスの Clear メソッドを利用します。Clear メソッドは、背景色を指定した色に変更できます。つまり、描画した後に背景色を元の色に変更することによって、図形を消去できます。次に図形の消去のプログラムを示します。
private void button7_Click(object sender, System.EventArgs e)
{
gGraphics.Clear(Color.White); // 初期化
aGraphicsList.Clear(); // リスト内要素の削除
}図 5 に図形の消去の実行結果を示します。
.gif)
図 5 : 図形の消去
CAD を用いた設計図作成は、四角形、楕円、曲線などの基本図形の描画や図形の編集処理の他に、図形の幾何処理を行います。そこで、本節では、幾何処理の基本となる平行移動と回転変換ついて解説します。
平行移動とは、平面上で図形を一定の方向に一定の長さだけ、その図形を移動させることです。平行移動の公式を次に示します。
(x,y) → (x+a,y+b)
a:xの増加量,b:yの増加量Visual C# では、Matrix クラスに平行移動を行う Translate メソッドが用意されています。Translate メソッドの構文を次に示します。
| Matrix インスタンス名. Translate (float x の増加量, float y の増加量, MatrixOrder 適用順序) |
回転変換とは、特定の点を角度 θ 回転させることです。一般的には、原点の周りに回転させます。回転変換の公式を次に示します。
θ:回転角、 (x、y) :変換前の座標
(x´、y´) :変換後の座標
従来、回転変換には上記のような複雑な計算を行う必要がありましたが、Matrix クラスには、回転変換を行う非常に便利な Rotate メソッドが用意されています。Rotate メソッドの構文を次に示します。
| Matrix インスタンス名. Rotate (float 回転角, MatrixOrder 適用順序) |
本システムでは、図形の幾何処理を利用した図形の移動、図形の拡大・縮小、図形の回転の機能を実装します。
図形の移動は、図形の選択処理で選ばれた図形を平行移動させます。次に図形の移動のプログラムを示します。
private void MoveGraphics(int iX, int iY)
{
Matrix mMatrix = new Matrix(); // 変換マトリックス
Point[] pTempPoint = new Point[4]; // 変換する点座標
// 点座標値の設定
pTempPoint[0] = pTempOriginPoint; // 点座標の設定
pTempPoint[1] = pTempPointForBezier[0]; // 点座標の設定
pTempPoint[2] = pTempPointForBezier[1]; // 点座標の設定
pTempPoint[3] = pTempPointForBezier[2]; // 点座標の設定
mMatrix.Translate(iX - pTempFirstClickPoint.X, iY - pTempFirstClickPoint.Y,
MatrixOrder.Append);// 平行移動マトリックス
// グラフィックスの移動の場合
if(iMoveGraphicsFlag == MOVEGRAPHICS)
{
(中略)
}
mMatrix.TransformPoints(pTempPoint); // 座標の変換
// ベジエスプラインでない場合
if(((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).PlaceType != BEZIER)
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).FirstPoint =
pTempPoint[0];// 座標の平行移動
// ベジエスプラインの場合
else
{
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).FirstPoint =
pTempPoint[0];// 座標の平行移動
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).SecondPoint =
pTempPoint[1];// 座標の平行移動
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).ControlPoint1 =
pTempPoint[2];// 座標の平行移動
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).ControlPoint2 =
pTempPoint[3];// 座標の平行移動
}
gGraphics.Clear (Color.White); // 初期化
MakeAllGraphics(); // 全グラフィックスの再描画
}図形の拡大・縮小は、図形の選択処理で選ばれた図形の一部を平行移動させます。次に図形の拡大・縮小のプログラムを示します。
private void ChangeGraphicsShape(int iX, int iY)
{
switch (iSideFlag)
{
case LEFTSIDE: // 左辺
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Width =
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Width +
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint.X - iX;// グラフィックスの幅の設定
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).FirstPoint.X =
iX; // 座標の設定
break;
case RIGHTSIDE: // 右辺
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Width =
iX - ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint.X;// グラフィックスの幅の設定
break;
case TOPSIDE: // 上辺
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Height =
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Height +
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint.Y - iY;// グラフィックスの高さの設定
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint.Y = iY;// 座標の設定
break;
case BOTTOMSIDE: // 下辺
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).Height =
iY - ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint.Y; // グラフィックスの高さの設定
break;
default:
break;
}
aGraphicsList.Insert(iSelectGraphicsIndex,
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]));
// リストにグラフィックスデータの追加
gGraphics.Clear (Color.White); // 初期化
MakeAllGraphics(); // 全グラフィックスの描画
}図形の回転を行う場合は、まず、回転対象図形の中心を原点となるように Translate メソッドを用いて平行移動します。次に、Rotate メソッドを用いてその図形を回転変換します。最後に、Translate メソッドを用いて、原点を回転対象図形の中心から元の原点に戻します。イメージフローを図 6 に示します。
.gif)
図 6 : 回転変換のイメージフロー
次に図形の回転のプログラムを示します。
private void RotateGraphics(int iX, int iY)
{
double dCos; // コサイン値
double dAngle; // 角度
Matrix mMatrix = new Matrix(); // 変換マトリックス
Matrix mBezierMatrix = new Matrix();// ベジエスプラインに用いる変換マトリックス
Matrix mBezierMatrix2 = new Matrix();// ベジエスプラインに用いる変換マトリックス
Point[] pTempPoint = new Point[2]; // テンプ用点配列
Point[] pTargetPoint = new Point[4]; // 変換座標
// 座標の設定
pTempPoint[0].X = iX; // 座標の設定
pTempPoint[0].Y = iY; // 座標の設定
pTempPoint[1] = pTempFirstClickPoint; // 点座標の設定
// 座標の変換
mMatrix.Translate(-pOriginPoint.X, -pOriginPoint.Y,
MatrixOrder.Append); // 平行移動マトリックスの取得
mMatrix.TransformPoints(pTempPoint); // 座標の変換
// 角度の算出
dCos = (pTempPoint[0].X * pTempPoint[1].X + pTempPoint[0].Y * pTempPoint[1].Y) /
(Math.Sqrt(Math.Pow(pTempPoint[0].X, 2) + Math.Pow(pTempPoint[0].Y, 2)) *
Math.Sqrt(Math.Pow(pTempPoint[1].X, 2) + Math.Pow(pTempPoint[1].Y, 2))); // コサイン値の算出
dAngle = Math.Acos(dCos); // ラジアンの算出
dAngle = 180 / Math.PI * dAngle; // 度数への変換
// 角度が180°を超える場合
if(iY > pOriginPoint.Y)
dAngle = dAngle + 180; // 角度の修正
InitializeGraphics(); // グラフィックスの初期化
// ベジエスプラインでない場合
if(((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).PlaceType != BEZIER)
{
(中略)
// ベジエスプラインの場合
else
{
pTargetPoint[0] = ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
FirstPoint;// 点座標の設定
pTargetPoint[1] = ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
SecondPoint;// 点座標の設定
pTargetPoint[2] = ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
ControlPoint1;// 点座標の設定
pTargetPoint[3] = ((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).
ControlPoint2;// 点座標の設定
mBezierMatrix.Translate(-pOriginPoint.X, -pOriginPoint.Y,
MatrixOrder.Append);// 平行移動マトリックスの取得
mBezierMatrix.Rotate((float)dAngle, MatrixOrder.
Append);// 回転マトリックスの取得
mBezierMatrix.TransformPoints(pTargetPoint);// 座標の変換
mBezierMatrix2.Translate(pOriginPoint.X, pOriginPoint.Y,
MatrixOrder.Append);// 平行移動マトリックスの取得
mBezierMatrix2.TransformPoints(pTargetPoint);// 座標の変換
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).FirstPoint =
pTargetPoint[0];// 点座標の設定
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).SecondPoint =
pTargetPoint[1];// 点座標の設定
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).ControlPoint1 =
pTargetPoint[2];// 点座標の設定
((GraphicsData)aGraphicsList[iSelectGraphicsIndex]).ControlPoint2 =
pTargetPoint[3];// 点座標の設定
}
gGraphics.Clear (Color.White); // 初期化
MakeAllGraphics(); // 全グラフィックスの再描画
}図 7 に図形の回転の実行結果を示します。
.gif)
図 7 : 図形の回転
本章では、Visual C# のグラフィックス処理と幾何処理について解説すると同時に、Visual C# による簡易 CAD システムの作成手順を紹介しました。Visual C# には、グラフィックス処理や幾何処理を行う便利なクラスやメソッドが存在するため、様々なシステム開発の生産性および信頼性が向上することは言うまでもなく、より高度なシステムを開発することが可能になります。次回の連載では、グラフィックス処理と幾何処理の応用として、画像処理を 2 回の連載に分けて説明します。
本連載は、テキスト処理、グラフィック処理、画像処理、知識情報処理などのアルゴリズムを Visual C# を用いて解説します。
| 1986 年 | 関西大学工学部土木工学科卒業 |
| 1988 年 | 関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了 |
| 1996 年 | 博士 (工学) 授与,関西大学 |
| 1997 年 | 関西大学総合情報学部助教授 (現在に至る) |
| 主な著書: | やさしい C のはじめかた,オーム社,1993 年 |
| 建設技術者のための知識情報処理の実践,関西大学出版部,1999 年 | |
| DirectX8,工学社,2001 年 | |
| ステップアップ XML,工学社,2002 年 | |
| Linux アプリケーション入門,森北出版,2002年 ほか |
| 2001 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
| 主な著書: | Web 工房シリーズ Perl の達人,森北出版,1999 年 |
| 決定版 Visual Basic,共立出版,2000年 | |
| DirectX8,工学社,2001 年 | |
| Linux アプリケーション入門,森北出版,2002 年 | |
| ステップアップ Visual C# .NET 入門,工学社,2002 年 ほか |
| 2000 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 主な著書: | DirectX8 & VC++ 3D の基礎とゲームの作り方,工学社,2002年 |
| 2000 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2002 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
| 2002 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
| 主な著書: | Web 工房シリーズ Java の達人,森北出版,1999 年 |
| デジカメ活用によるデジタル写真測量入門,森北出版,2000 年 | |
| ステップアップ XML 活用法,工学社,2002 年 |
| 2002 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |
| 2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
| 2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |