// 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;
}