
#ifndef  __JBXL_CPP_WINDOW_H_
#define  __JBXL_CPP_WINDOW_H_


/**
グラフィック用ワールド座標系サポートヘッダ  Window.h  v2.1

  依存関係
      #include "Graph.h"

*/



#include "Graph.h"



//
namespace jbxl {



/*
template <typename T> void  wSetPixel(MSGraph<T> vp, double x, double y, int cc)
template <typename T> T     wGetPixel(MSGraph<T> vp, double x, double y)
template <typename T> void  wLine(MSGraph<T> vp, double x1, double y1, double x2, double y2, int cc)
template <typename T> void  wDraw(MSGraph<T>* vp, double x, double y, int cc)
template <typename T> void  wDraw_rel(MSGraph<T>* vp, double x, double y, int cc)
*/





/**
template <typename T> void  wSetPixel(MSGraph<T> vp, double x, double y, int cc)

    機能: ワールド座標系に点を打つ．

    引数: vp  -- 操作対象のグラフィックデータ．
          x   -- 点の x座標(ワールド座標系)．
          y   -- 点の y座標(ワールド座標系)．
          cc  -- 点の輝度値．

    戻り値：なし．
*/
template <typename T> void  wSetPixel(MSGraph<T> vp, double x, double y, int cc)
{
    int i = (int)((x - vp.wZeroX)*vp.wRateX + 0.5);
	int j = (int)((vp.wZeroY - y)*vp.wRateY + 0.5);

    vp.point(i,j) = (T)cc;
}




/**
template <typename T> T wGetPixel(MSGraph<T> vp, double x, double y)

    機能: ワールド座標系の点のデータを得る．

    引数: vp  -- 操作対象のグラフィックデータ．
          x   -- 点の x座標(ワールド座標系)．
          y   -- 点の y座標(ワールド座標系)．

    戻り値：  -- 点の輝度値．
*/
template <typename T> T wGetPixel(MSGraph<T> vp, double x, double y)
{
    int i = (int)((x - vp.wZeroX)*vp.wRateX + 0.5);
    int j = (int)((vp.wZeroY - y)*vp.wRateY + 0.5);

    return vp.point(i, j);
}





/**
template <typename T> void  wLine(MSGraph<T> vp, double x1, double y1, double x2, double y2, int cc)

    機能: ワールド座標系に線を引く．

    引数: vp  -- 操作対象のグラフィックデータ．
          x1  -- 線の始点の x座標(ワールド座標系)．
          y1  -- 線の始点の y座標(ワールド座標系)．
          x2  -- 線の終点の x座標(ワールド座標系)．
          y2  -- 線の終点の y座標(ワールド座標系)．
          cc  -- 線の輝度値．

    戻り値：なし．
*/
template <typename T> void  wLine(MSGraph<T> vp, double x1, double y1, double x2, double y2, int cc)
{
    int  i1, j1, i2, j2;

    i1 = (int)((x1 - vp.wZeroX)*vp.wRateX + 0.5);
    i2 = (int)((x2 - vp.wZeroX)*vp.wRateX + 0.5);
    j1 = (int)((vp.wZeroY - y1)*vp.wRateY + 0.5);
    j2 = (int)((vp.wZeroY - y2)*vp.wRateY + 0.5);

    MSGraph_Line<T>(vp, i1, j1, i2, j2, cc);
}



/**
template <typename T> void  wDraw(MSGraph<T>* vp, double x, double y, int cc)

    機能: ワールド座標系で現地点から指定した地点へ線を引く．
          指定した地点が現地点となる．

    引数: vp  -- 操作対象のグラフィックデータ．
          x   -- 線の終点の x座標(ワールド座標系)．
          y   -- 線の終点の y座標(ワールド座標系)．
          cc  -- 線の輝度値．

    戻り値：なし．
*/
template <typename T> void  wDraw(MSGraph<T>* vp, double x, double y, int cc)
{
    wLine<T>(vp, vp->wNowX, vp->wNowY, x, y, cc);
	vp->wMove(x, y);
}




/**
template <typename T> void  wDraw_rel(MSGraph<T>* vp, double x, double y, int cc)

    機能: ワールド座標系で現地点を起点として相対的に線を引く．
          線の終点が現地点となる．

    引数: vp  -- 操作対象のグラフィックデータ．
          x   -- 現地点から x方向への移動距離(ワールド座標系)．
          y   -- 現地点から x方向への移動距離(ワールド座標系)．
          cc  -- 線の輝度値．

    戻り値：なし．
*/
template <typename T> void  wDraw_rel(MSGraph<T>* vp, double x, double y, int cc)
{
    double x2 = vp->wNowX + x;
    double y2 = vp->wNowY + y;

    wLine<T>(*vp, vp->wNowX, vp->wNowY, x2, y2, cc);
	vp->wMove(x2, y2);
}




}		// namespace


#endif
