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