グラフを描くクラスを作ります。
クラスの継承を使っていきます。 スーパークラスは青い部分です。
#pragma once
// MyCurve クラス(スーパークラス)
class MyCurve{
public:
// x座標を返す
virtual double fx(double t){
return t;
}
// y座標を返す
virtual double fy(double t){
return t;
}
};
// x軸
class MyCurveX : public MyCurve{
public:
double fx(double t){
return t;
}
double fy(double t){
return 0;
}
};
// y軸
class MyCurveY : public MyCurve{
public:
double fx(double t){
return 0;
}
double fy(double t){
return t;
}
};
グラフを描くためのメソッドは、"MyDC.h" へ書きます。 青い部分です。
#pragma once
//
// MyDC クラス(デバイスコンテキスト)
// MyDC.h
//
#include <MyCurve.h>
class MyDC{
public:
HDC hdc;
public:
// MyCurve を描く
void draw(MyCurve &mc, double min, double max){
double t; // 変数用意
t = min;
MoveTo(mc.fx(t), mc.fy(t));
while(t < max){
t = t + 0.1;
LineTo(mc.fx(t), mc.fy(t));
}
}
};
曲線を描く方法は、曲線上の点を線で結んでいくだけです。
曲線上の点を、x = fx(t)、y = fy(t) とします。 これをメソッドとするクラスを作ります。
// MyCurve クラス(スーパークラス)
class MyCurve{
public:
virtual double fx(double t){ // x座標を返す
return t;
}
virtual double fy(double t){ // y座標を返す
return t;
}
};
このまま使えば、直線 y = x となります。 しかし、fx と fy を変えることで、別の曲線になります。
そうするために、これを継承します。 例えば、放物線 y = x2の場合、次のようになります。
class MyCurve2 : public MyCurve{ public: double fx(double t){ // x座標を返す return t; } double fy(double t){ // y座標を返す return t * t; } };
クラスを継承する際、この2つのメソッドの中身を変えていくのです。 これをオーバーライドといいます。 このようなとき、"virtual" を付けます。
次は、曲線を描くメソッドです。 線を描くので、MyDC クラスの中へ書きます。 t の範囲を指定して曲線を描きます。
この範囲でグラフを描いていきます。 t は、0.1 ずつ増やして点をずらしていきます。 そして、線で結んでいきます。
// MyCurve を描く void draw(MyCurve &mc, double min, double max){ double t; // 変数用意 t = min; MoveTo(mc.fx(t), mc.fy(t)); while(t < max){ t = t + 0.1; LineTo(mc.fx(t), mc.fy(t)); } }
ついでに、軸を描くクラスを作ります。 これは、MyCurve クラスを継承します。 x軸は、x = t, y = 0 ですから次のようになります。
// 軸 class MyCurveX : public MyCurve{ public: double fx(double t){ return t; } double fy(double t){ return 0; } };
y軸も同様です。
次回は、グラフを描く雛形を作ります。