準備

グラフを描くクラスを作ります。

MyCurve クラス(MyCurve.h)

クラスの継承を使っていきます。 スーパークラスは青い部分です。

#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軸も同様です。

次回は、グラフを描く雛形を作ります。


[前] [目次] [次]