📄 drawgraph.c
字号:
** 功能描述:在屏幕上输出一条直线
** 调用模块:无
** 全局变量:g_nNumOfRotatedResult,g_nNumOfResult,g_nNumOfToBeRotated
** 作 者:
** 日 期:2003.01.29
** 修改人:
** 日 期:2003.08.10
** 版 本:
****************************************************************/
void Line1(int x1,int y1,int x2,int y2,int color,int nFlags)
{
register int x,y,tempi;
register float slope,antislope,tempf;
register int *p,*p1;
//如果直线正处于闪烁的消失期则直接返回
if((nFlags&BLINKING)&&g_nBlinkCounter<0) return;
if (nFlags&BFINALRESULT)
{
//如果需要输出插值修正后的直线
if (nFlags&NEEDMODIFY)
{
p=g_nResult-g_nNumOfResult*3;
p1=g_nRotatedResult+g_nNumOfRotatedResult*7;
g_nNumOfToBeRotated=0;
//如果直线垂直
if (x1==x2)
{
if (y2>y1)
{
g_nNumOfRotatedResult+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p1++)=x1;
*(p1++)=y;
*(p1++)=color;
*(p1++)=256;
*(p1++)=0;
*(p1++)=0;
*(p1++)=0;
}
}
else if (y2<y1)
{
g_nNumOfRotatedResult+=y1-y2;
for (y=y1-1;y>=y2;y--)
{
*(p1++)=x1;
*(p1++)=y;
*(p1++)=color;
*(p1++)=256;
*(p1++)=0;
*(p1++)=0;
*(p1++)=0;
}
}
}
//如果直线水平
else if (y1==y2)
{
if (x2>x1)
{
g_nNumOfRotatedResult+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p1++)=x;
*(p1++)=y1;
*(p1++)=color;
*(p1++)=256;
*(p1++)=0;
*(p1++)=0;
*(p1++)=0;
}
}
else
{
g_nNumOfRotatedResult+=x1-x2;
for(x=x1-1;x>=x2;x--)
{
*(p1++)=x;
*(p1++)=y1;
*(p1++)=color;
*(p1++)=256;
*(p1++)=0;
*(p1++)=0;
*(p1++)=0;
}
}
}
//斜线
else
{
//计算斜率和斜率的倒数
slope=(float)(y2-y1)/(x2-x1);
antislope=1.0/slope;
//斜率的绝对值小于1,递增x,计算y
if ((slope<1)&&(slope>-1))
{
if (x2>x1)
{
//将会增加的点数为x2-x1
g_nNumOfRotatedResult+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p1++)=x;
*(p1++)=tempi=tempf=(x-x1)*slope+y1;
*(p1++)=color;
*(p1++)=256-(tempf=(tempf-tempi)*256);
*(p1++)=0;
*(p1++)=tempf;
*(p1++)=0;
}
}
else
{
//将会增加的点数为x1-x2
g_nNumOfRotatedResult+=x1-x2;
for(x=x1-1;x>=x2;x--)
{
*(p1++)=x;
*(p1++)=tempi=tempf=(x-x2)*slope+y2;
*(p1++)=color;
*(p1++)=256-(tempf=(tempf-tempi)*256);
*(p1++)=0;
*(p1++)=tempf;
*(p1++)=0;
}
}
}
//斜率的绝对值大于等于1的情况,递增y,计算x
else// if ((slope>=1)|(slope<=-1) )
{
if (y2>y1)
{
//将会增加的点数为y2-y1
g_nNumOfRotatedResult+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p1++)=tempi=tempf=(y-y1)*antislope+x1;
*(p1++)=y;
*(p1++)=color;
*(p1++)=256-(tempf=(tempf-tempi)*256);
*(p1++)=tempf;
*(p1++)=0;
*(p1++)=0;
}
}
else
{
//将会增加的点数为y1-y2
g_nNumOfRotatedResult+=y1-y2;
for(y=y1-1;y>=y2;y--)
{
*(p1++)=tempi=tempf=(y-y2)*antislope+x2;
*(p1++)=y;
*(p1++)=color;
*(p1++)=256-(tempf=(tempf-tempi)*256);
*(p1++)=tempf;
*(p1++)=0;
*(p1++)=0;
}
}
}
}
}
//直接输出不需要修正的直线到屏幕上
else//BFINALRESULT&!NEEDMODIFY
{
p=g_nResult-g_nNumOfResult*3;
//如果直线垂直
if (x1==x2)
{
if (y2>y1)
{
g_nNumOfResult+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p--)=x1;*(p--)=y;*(p--)=color;
}
}
else if (y2<y1)
{
g_nNumOfResult+=y1-y2;
for (y=y1-1;y>=y2;y--)
{
*(p--)=x1;*(p--)=y;*(p--)=color;
}
}
}
//如果直线水平
else if (y1==y2)
{
if (x2>x1)
{
g_nNumOfResult+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p--)=x;*(p--)=y1;*(p--)=color;
}
}
else
{
g_nNumOfResult+=x1-x2;
for(x=x1-1;x>=x2;x--)
{
*(p--)=x;*(p--)=y1;*(p--)=color;
}
}
}
//斜线
else
{
//计算斜率和斜率的倒数
slope=(float)(y2-y1)/(x2-x1);
antislope=1.0/slope;
//斜率的绝对值小于1,递增x,计算y
if ((slope<1)&&(slope>-1))
{
if (x2>x1)
{
g_nNumOfResult+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p--)=x;*(p--)=(x-x1)*slope+y1+0.5;*(p--)=color;
}
}
else
{
g_nNumOfResult+=x1-x2;
for(x=x1-1;x>=x2;x--)
{
*(p--)=x;*(p--)=(x-x2)*slope+y2+0.5;*(p--)=color;
}
}
}
//斜率的绝对值大于等于1的情况,递增y,计算x
else// if ((slope>1)|(slope<-1) )
{
if (y2>y1)
{
g_nNumOfResult+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p--)=(y-y1)*antislope+x1+0.5;*(p--)=y;*(p--)=color;
}
}
else
{
g_nNumOfResult+=y1-y2;
for(y=y1-1;y>=y2;y--)
{
*(p--)=(y-y2)*antislope+x2+0.5;*(p--)=y;*(p--)=color;
}
}
}
}
}
}
//非最终结果,输出中间结果到待旋转结果缓冲区等待旋转
else//!BFINALRESULT
{
//因为旋转的过程包含了插值运算,所以在旋转前不能再做插值修正
if (nFlags&NEEDMODIFY)
{
//ERROR
}
//不再做插值修正的情况
else
{
p=g_nRotatedResult+(g_nNumOfToBeRotated+g_nNumOfRotatedResult)*7;
//如果直线垂直
if (x1==x2)
{
if (y2>y1)
{
g_nNumOfToBeRotated+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p++)=x1;*(p++)=y;*(p++)=color;p+=4;
}
}
else if (y2<y1)
{
g_nNumOfToBeRotated+=y1-y2;
for (y=y1-1;y>=y2;y--)
{
*(p++)=x1;*(p++)=y;*(p++)=color;p+=4;
}
}
}
//如果直线水平
else if (y1==y2)
{
if (x2>x1)
{
g_nNumOfToBeRotated+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p++)=x;*(p++)=y1;*(p++)=color;p+=4;
}
}
else
{
g_nNumOfToBeRotated+=x1-x2;
for(x=x1-1;x>=x2;x--)
{
*(p++)=x;*(p++)=y1;*(p++)=color;p+=4;
}
}
}
//斜线
else
{
//计算斜率和斜率的倒数
slope=(float)(y2-y1)/(x2-x1);
antislope=1.0/slope;
//斜率的绝对值小于1,递增x,计算y
if ((slope<1)&&(slope>-1))
{
if (x2>x1)
{
g_nNumOfToBeRotated+=x2-x1;
for(x=x1+1;x<=x2;x++)
{
*(p++)=x;*(p++)=(x-x1)*slope+y1+0.5;
*(p++)=color;p+=4;
}
}
else
{
g_nNumOfToBeRotated+=x1-x2;
for(x=x1-1;x<=x2;x--)
{
*(p++)=x;*(p++)=(x-x2)*slope+y2+0.5;
*(p++)=color;p+=4;
}
}
}
//斜率的绝对值大于等于1的情况,递增y,计算x
else// if ((slope>=1)|(slope<=-1) )
{
if (y2>y1)
{
g_nNumOfToBeRotated+=y2-y1;
for(y=y1+1;y<=y2;y++)
{
*(p++)=(y-y1)*antislope+x1+0.5;*(p++)=y;
*(p++)=color;p+=4;
}
}
else
{
g_nNumOfToBeRotated+=y1-y2;
for(y=y1-1;y>=y2;y--)
{
*(p++)=(y-y2)*antislope+x2+0.5;*(p++)=y;
*(p++)=color;p+=4;
}
}
}
}
}
}
return;
}
/*****************************************************************
** 函数名:Line
** 输 入: int x1,int y1,int x2,int y2,int color,int nFlags
** x1---直线一端的横坐标
** y1---直线一端的纵坐标
** x2---直线另一端的横坐标
** y2---直线另一端的纵坐标
** color---直线的颜色
** nFlags---属性标志,在此有用的有BLINKING位,指明直线是否闪烁
BFINALRESULT,指明直线是否最终结果,如否,产生中间结果后用Rotate函数旋转
NEEDMODIFY,指明直线需否插值修正,需修正的话,BFINALRESULT位必须同时有效
** 输 出: 无
** 功能描述:在屏幕上输出一条两象素宽直线
** 调用模块:Line1(int x1,int y1,int x2,int y2,int color,int nFlags)
** 全局变量:g_nNumOfRotatedResult,g_nNumOfResult,g_nNumOfToBeRotated
** 作 者:
** 日 期:2003.01.29
** 修改人:
** 日 期:2003.08.10
** 版 本:
****************************************************************/
void Line(int x1,int y1,int x2,int y2,int color,int nFlags)
{
Line1(x1,y1,x2,y2,color,nFlags);
if(abs(y2-y1)<=abs(x2-x1))
{
Line1(x1,y1+1,x2,y2+1,color,nFlags);
// Line1(x1,y1+2,x2,y2+2,color,nFlags);
}
else
{
Line1(x1+1,y1,x2+1,y2,color,nFlags);
// Line1(x1+2,y1,x2+2,y2,color,nFlags);
}
return;
}
/*****************************************************************
** 函数名:HollowRect
** 输 入: int x1,int y1,int x2,int y2,int color,int nFlags
** x1---矩形左上角的横坐标
** y1---矩形左上角的纵坐标
** x2---矩形右下角的横坐标
** y2---矩形右下角的纵坐标
** color---直线的颜色
** nFlags---属性标志,在此有用的只有BLINKING位,指明矩形是否闪烁
** 输 出: 无
** 功能描述:在屏幕上输出一空心矩形
** 调用模块:Line()
** 全局变量:g_nNumOfResult
** 作 者:
** 日 期:2003.01.29
** 修改人:
** 日 期:2003.08.10
** 版 本:
****************************************************************/
void HollowRect(int x1,int y1,int x2,int y2,int color,int nFlags)
{
Line1(x1,y1,x2,y1,color,nFlags);
Line1(x2,y1,x2,y2,color,nFlags);
Line1(x2,y2,x1,y2,color,nFlags);
Line1(x1,y2,x1,y1,color,nFlags);
return;
}
/*****************************************************************
** 函数名:ConfigSkyEarthBall
** 输 入: int radius,int angle,int ColorSky,int ColorEarth
** radius---天地球的半径
** angle---圆弧与矩形部分交点与圆心连线和水平线的夹角,单位是角度
** ColorSky---天空部分的颜色
** ColorEarth---大地部分的颜色
** color---直线的颜色
** 输 出: 无
** 功能描述:配置天地球的半径,角度,颜色
** 调用模块:无
** 全局变量:g_nSkyEarthBallRadius,g_nSkyEarthBallColor1,g_nSkyEarthBallColor2,g_fSkyEarthBallEdge[];
** 作 者:
** 日 期:2003.01.29
** 修改人:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -