2001年5月21日 WvLine丸め誤差のための四捨五入追加
  関谷トップページへ CGトップページへ  

Glibwv.h 河西朝雄 からSLSを使用して、Windows用に移植)


// Glibwv.h  河西朝雄、C言語によるはじめてのアルゴリズム入門、pp.346-356 からSLSを使用して、Windows用に移植。
//      1998.3.16 北九州職業能力開発短期大学校 情報処理科 関谷順太

#include <math.h>

#include "line.f"
#include "pset.f"

#define pset(x,y,c) \
				WvLine((double)(x),(double)(y),(double)(x),(double)(y),(int)c)
#define window(x1,y1,x2,y2) \
				Window((double)(x1),(double)(y1),(double)(x2),(double)(y2))
#define view(x1,y1,x2,y2) \
				View((int)(x1),(int)(y1),(int)(x2),(int)(y2))
#define setpoint(x,y) \
				SetPoint((double)(x),(double)(y))
#define setangle(a) \
				ANGLE=(double)(a)
#define turn(a) \
				ANGLE=fmod(ANGLE+(a), 360.0)
#define move(l,c) \
				Move((double)(l), (int)(c))
#define moveto(x,y,c) \
				MoveTo((double)(x),(double)(y),(int)(c))
#define moverel(x,y,c) \
				MoveTo((double)(LPX+(x)),(double)(LPY+(y)), (int)(c))
#define wvline(x1,y1,x2,y2,c) \
				WvLine((double)(x1),(double)(y1),(double)(x2),(double)(y2),(int)(c))

double  ANGLE,				/*  現在角   */
		LPX, LPY;			/*  現在位置 */
//int     C=1;				/*  色       */
double	WX1,WY1,WX2,WY2,	/* ワールド座標 */
		VX1,VY1,VX2,VY2,	/* ビュー座標 */
        FACTX,FACTY;        /* スケール */
int PX1,PY1, PX2, PY2;        // 現在スクリーン座標

int Cpy(void){
    return PY2;
}
int Cpx(void){
    return PX2;
}
void Window(double x1, double y1, double x2, double y2)
{
	WX1=x1; WY1=y1; WX2=x2; WY2=y2;
	FACTX=(VX2-VX1)/(WX2-WX1);
	FACTY=(VY2-VY1)/(WY2-WY1);
}
void View(int x1, int y1, int x2, int y2)
{
	VX1=(double)x1; VY1=(double)y1; VX2=(double)x2; VY2=(double)y2;
	FACTX=(VX2-VX1)/(WX2-WX1);
	FACTY=(VY2-VY1)/(WY2-WY1);
}

void WvLine(double x1, double y1, double x2, double y2, int c)
{
    PX1 = (int)(((x1-WX1)*FACTX+VX1)+0.5);	// 丸め誤差のための四捨五入 2001.5.21
    PY1 = (int)(((y1-WY1)*FACTY+VY1)+0.5);
    PX2 = (int)(((x2-WX1)*FACTX+VX1)+0.5);
    PY2 = (int)(((y2-WY1)*FACTY+VY1)+0.5);
  line(PX1, PY1, PX2, PY2, c);
//	LPX=x2; LPY=y2;
}
void Move(double l, int c)
{
	double x,y,rd=3.14159265358979/180.0;
	x=l*cos(rd*ANGLE); y=-l*sin(rd*ANGLE);
	WvLine(LPX, LPY, LPX+x, LPY+y, c);
  LPX += x; LPY +=y;
}
void MoveTo(double x, double y, int c)
{
	WvLine(LPX, LPY, x, y, c);
  LPX = x; LPY =y;
}
void SetPoint(double x, double y)
{
	LPX=x; LPY=y;
}