ビューポート変換の式

2次元ワールド座標から2次元ディスプレイ座標への変換式のメモです。
行列を使わずに直接計算しています。

class ViewportTransform{
protected:
		//Device(Screen)座標系における原点座標
		float m_screenOriginX;
		float m_screenOriginY;
		//倍率 screen / world
		float m_xScale,m_yScale;
public:
		//例えばこんなコンストラクタとか
		ViewportTransform(float screenOriginX,float screenOriginY,float screenWidth,float screenHeight,float worldWidth,float worldHeight);
		//Device(screen)座標系へ変換を行う
		float toScreenX(float x);
		float toScreenY(float y);
		//World座標系へ変換を行う
		float toWorldX(float x);
		float toWorldY(float y);
ViewportTransform::ViewportTransform(float screenOriginX,float screenOriginY,float screenWidth,float screenHeight,float worldWidth,float worldHeight):
//原点座標の初期化
m_screenOriginX(screenOriginX),
m_screenOriginY(screenOriginY),
m_xScale(screenWidth/worldWidth),//x座標の倍率
m_yScale(screenHeight/worldHeight)//y座標の倍率
{
}

World to Device

float ViewportTransform::toScreenX(float x){
	return x*m_xScale+m_screenOriginX;
}
float ViewportTransform::toScreenY(float y){
	return m_screenOriginY-y*m_yScale;
}

Device to World

float ViewportTransform::toWorldX(float x){
	return (x-m_screenOriginX)/m_xScale;
}
float ViewportTransform::toWorldY(float y){
	return (m_screenOriginY-y)/m_yScale;
}