本項では値を保持する為のデータクラスを作成します。小さなデータからだんだんと大きなデータの塊になるように順に作成していきましょう。
STLデータでは三角形1つを表すには法線ベクトルの3個の実数値と3頂点の9個の実数値が必要です。全て実数値ですので double 型の配列や double 型の 多次元配列のデータとして扱うことも可能ですが、プログラムする際にとても扱い難いものとなってしまいます。そこで小さなデータの塊(構造体やクラス)を定義して適切な名前をつけて管理します。構造体やクラスは入れ子構造にすることも可能ですのでこれを繰り返してだんだんと大きなデータの塊としていけばデータの管理が行いやすくなるはずです。
4. ベクトル値を保持する為のメンバー変数を追加します。
【CgsVector.h】
#pragma once
class CgsVector
{
private:
double m_dX;
double m_dY;
double m_dZ;
};
5. メンバー変数にベクトル値を与えるコンストラクタとベクトル値を取得するメンバー関数を追加します。
【CgsVector.h】
#pragma once
class CgsVector
{
public:
CgsVector(const double& x = 0.0, const double& y = 0.0, const double& z = 0.0)
: m_dX(x), m_dY(y), m_dZ(z)
{
}
const double& GetX() const { return m_dX; }
const double& GetY() const { return m_dY; }
const double& GetZ() const { return m_dZ; }
private:
double m_dX;
double m_dY;
double m_dZ;
};
ここでは三角形の頂点座標を扱うクラスを作成していきます。ベクトル値クラスも座標値クラスのどちらも似たような (x, y, z) の値を扱いますが、機能を追加していくうちにその性質の違いが出てくるので別のクラスとして取り扱います。
1. メニューの [プロジェクト(P)]-[クラスの追加(C)...] を選択し、『クラスの追加』ダイアログを開きます。
2. 「クラス名(L)」エディットボックスに "CgsPoint" を入力します。
3. 「OK」ボタンを押下すると CgsPoint.h ファイルと CgsPoint.cpp ファイルが追加されます。
4. 座標値を保持する為のメンバー変数を追加します。
【CgsPoint.h】
#pragma once
class CgsPoint
{
private:
double m_dX;
double m_dY;
double m_dZ;
};
5. メンバー変数に座標値を与えるコンストラクタと座標値を取得するメンバー関数を追加します。
【CgsPoint.h】
#pragma once
class CgsPoint
{
public:
CgsPoint(const double& x = 0.0, const double& y = 0.0, const double& z = 0.0)
: m_dX(x), m_dY(y), m_dZ(z)
{
}
const double& GetX() const { return m_dX; }
const double& GetY() const { return m_dY; }
const double& GetZ() const { return m_dZ; }
private:
double m_dX;
double m_dY;
double m_dZ;
};
法線ベクトル値と3つの座標値を持つ三角形クラスを作成します。
1. メニューの [プロジェクト(P)]-[クラスの追加(C)...] を選択し、『クラスの追加』ダイアログを開きます。
2. 「クラス名(L)」エディットボックスに "CgsTriangle" を入力します。
3. 「OK」ボタンを押下すると CgsTriangle.h ファイルと CgsTriangle.cpp ファイルが追加されます。
4. 法線ベクトル値と座標値を保持する為のメンバー変数を追加します。
【CgsTriangle.h】
#pragma once
#include "CgsVector.h"
#include "CgsPoint.h"
class CgsTriangle
{
private:
CgsVector m_cvNormal;
CgsPoint m_cpPoints[3];
};
5. コンストラクタと法線ベクトル値と座標値を取得するメンバー関数を追加します。
【CgsTriangle.h】
#pragma once
#include "CgsVector.h"
#include "CgsPoint.h"
class CgsTriangle
{
public:
CgsTriangle() {}
const CgsVector& GetNormal() const { return m_cvNormal; }
const CgsPoint& GetPoint(const unsigned int n) const { return m_cpPoints[n]; }
private:
CgsVector m_cvNormal;
CgsPoint m_cpPoints[3];
};
STLは三角形データの集合体なので CgsTriangle クラスを要素とするベクタを使った可変長配列のクラスを作成します。【補足:vector】
【CgsTriangle.cpp】
#pragma once
#include <vector>
#include "CgsVector.h"
#include "CgsPoint.h"
class CgsTriangle
{
/* 長くなるので一部省略、CgsTriangleは変更なし */
};
class CgsTriangles : public std::vector<CgsTriangle>
{
};