⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawgraph.c

📁 源程序是在VisualDSP环境下开发出来的
💻 C
📖 第 1 页 / 共 3 页
字号:

** 功能描述:在屏幕上输出一条直线

** 调用模块:无

** 全局变量: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 + -