📄 grtry.c
字号:
#include "MyType.h"
#include "GrTry.h"
/* 设置好寄存器,并完成初始化 */
void SetSVGAMode(INT16 vmode)
{
switch (vmode) /* 记录当前的分辨率 */
{
case TRY320X200X256:
COLS = 320;
ROWS = 200;
break;
case TRY640X480X256:
COLS = 640;
ROWS = 480;
break;
case TRY800X600X256:
COLS = 800;
ROWS = 600;
break;
case TRY1024X768X256:
COLS = 1024;
ROWS = 768;
break;
}
_AX = 0x4f02;
_BX = vmode;
__int__(0x10);
}
/* 获取当前模式 */
INT16 GetSVGAMode()
{
_AX = 0x4f03;
__int__(0x10);
return _BX;
}
/* 画点函数 */
void Dot(INT16 x, INT16 y, UINT8 color)
{
static UINT8 OldPage = 0;
UINT32 PageAll1, PageAll2;
UINT8 NewPage;
if (x > -1 && x < COLS && y > -1 && y < ROWS)
{
PageAll1 = PageAll2 = (UINT32)y*(UINT32)COLS+(UINT32)x;
NewPage = PageAll1 >> 16;
if (NewPage != OldPage)
{
OldPage = NewPage;
SelectPage(NewPage);
}
VideoBuffer[PageAll2] = color;
}
}
/* 图形初始化 */
void InitSVGA()
{
OldSMode = GetSVGAMode();
}
/* 回到原来模式 */
void ExitSVGA()
{
SetSVGAMode(OldSMode);
}
/* 换页函数 */
void SelectPage(register UINT8 page)
{
_BX = 0;
_DX = page;
_AX = 0x4f05;
__int__(0x10);
}
/* 画线函数 */
void Line(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
INT32 dx; /* 直线x轴差值变量 */
INT32 dy; /* 直线y轴差值变量 */
INT8 dx_sym; /* x轴增长方向,为-1时减值方向,为1时增值方向 */
INT8 dy_sym; /* y轴增长方向,为-1时减值方向,为1时增值方向 */
INT32 dx_x2; /* dx*2值变量,用于加快运算速度 */
INT32 dy_x2; /* dy*2值变量,用于加快运算速度 */
INT32 di; /* 决策变量 */
if (x0 == x1) /* 画垂直线 */
{
if (y0 > y1)
{
dx = y0;
y0 = y1;
y1 = dx;
}
for (dx = y0; dx < y1+1; dx++)
{
Dot(x0, dx, color);
}
return ;
}
if (y0 == y1) /* 画水平线 */
{
if(x0 > x1)
{
dy = x0;
x0 = x1;
x1 = dy;
}
for (dy = x0; dy < x1+1; dy++)
{
Dot(dy, y0, color);
}
return;
}
/* 画斜线 */
dx = x1-x0; /* 求取两点之间的差值 */
dy = y1-y0;
if (dx > 0) /* 判断x轴方向 */
{
dx_sym = 1; /* dx>0,设置dx_sym=1 */
}
else
{
if (dx < 0)
{
dx_sym = -1; /* dx<0,设置dx_sym=-1 */
}
}
if (dy > 0) /* 判断y轴方向 */
{
dy_sym = 1; /* dy>0,设置dy_sym=1 */
}
else
{
if (dy < 0)
{
dy_sym = -1; /* dy<0,设置dy_sym=-1 */
}
}
dx = dx_sym * dx; /* 将dx、dy取绝对值 */
dy = dy_sym * dy;
dx_x2 = dx*2; /* 计算2倍的dx及dy值 */
dy_x2 = dy*2;
/* 使用Bresenham法进行画直线 */
if (dx >= dy) /* 对于dx>=dy,则使用x轴为基准 */
{
di = dy_x2 - dx;
while(x0!=x1)
{
Dot(x0, y0, color);
x0 += dx_sym;
if (di < 0)
{
di += dy_x2; /* 计算出下一步的决策值 */
}
else
{
di += dy_x2 - dx_x2;
y0 += dy_sym;
}
}
Dot(x0, y0, color); /* 显示最后一点 */
}
else /* 对于dx<dy,则使用y轴为基准 */
{
di = dx_x2 - dy;
while(y0!=y1)
{
Dot(x0, y0, color);
y0 += dy_sym;
if (di < 0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
x0 += dx_sym;
}
}
Dot(x0, y0, color); /* 显示最后一点 */
}
}
/* 画矩形函数 */
void Rect(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
INT16 i;
if (x0 > x1)
{
i = x0;
x0 = x1;
x1 = i;
}
if (y0 > y1)
{
i = y0;
y0 = y1;
y1 = i;
}
for (i = x0; i < x1+1; i++)
{
Dot(i, y0, color);
Dot(i, y1, color);
}
for (i = y0; i < y1+1; i++)
{
Dot(x0, i, color);
Dot(x1, i, color);
}
}
/* 画矩形块函数 */
void Rectfill(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
INT16 i, j;
if (x0 > x1)
{
i = x0;
x0 = x1;
x1 = i;
}
if (y0 > y1)
{
i = y0;
y0 = y1;
y1 = i;
}
for(i = y0; i < y1+1; i++)
{
for(j = x0; j < x1+1; j++)
{
Dot(j, i, color);
}
}
}
/* 画圆函数 */
void Circle(INT16 x1, INT16 y1, UINT16 r, UINT8 color)
{
INT16 x, y, d;
x = 0;
y = r;
d = 1-r; /* 计算初始值 */
while (x <= y)
{
/* 绘制点(x,y)及其在八分圆中的另外7个对称点 */
Dot(x1+x, y1+y, color);
Dot(x1+y, y1+x, color);
Dot(x1-y, y1+x, color);
Dot(x1-x, y1+y, color);
Dot(x1-x, y1-y, color);
Dot(x1-y, y1-x, color);
Dot(x1+y, y1-x, color);
Dot(x1+x, y1-y, color);
if (d < 0)
{
d += 2*x+3; /* 根据误差项d的判断,决定非最大位移方向上是走还是不走 */
}
else
{
d += 2*(x-y)+5;
y--;
}
x++;
}
}
/* 画实心圆函数 */
void Circlefill(INT16 x1, INT16 y1, UINT16 r, UINT8 color)
{
INT16 i, x, y, d;
x = 0;
y = r;
d = 1-r; /* 计算初始值 */
while (x <= y)
{
/* 绘制点(x,y)及其在八分圆中的另外7个对称点 */
Line(x1+x, y1+y, x1-x, y1+y, color);
Line(x1+x, y1-y, x1-x, y1-y, color);
Line(x1+y, y1+x, x1-y, y1+x, color);
Line(x1+y, y1-x, x1-y, y1-x, color);
if (d < 0)
{
d += 2*x+3; /* 根据误差项d的判断,决定非最大位移方向上是走还是不走 */
}
else
{
d += 2*(x-y)+5;
y--;
}
x++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -