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

📄 drawgraph.c

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

** 版 本:

****************************************************************/

void ConfigSkyEarthBall(int radius,int angle,int ColorSky,int ColorEarth)
{
	int x,y,diameter=radius*2;
	int temp;
	g_nSkyEarthBallRadius=radius;
	temp=0.5+radius-radius*sin(angle*PI_180)-1;
	x=0.5+radius*cos(angle*PI_180);
	for(y=0;y<temp;y++)
	{
	g_fSkyEarthBallEdge[diameter-y-3]=g_fSkyEarthBallEdge[y]=sqrtf(radius*radius-(radius-y-1)*(radius-y-1));
	}

	for(y=temp;y<=radius-1;y++)
	{
	g_fSkyEarthBallEdge[diameter-y-3]=g_fSkyEarthBallEdge[y]=x-1;
	}
	g_nSkyEarthBallColor1=ColorSky;
	g_nSkyEarthBallColor2=ColorEarth;
return;
}

/*****************************************************************

** 函数名:SkyEarthBall

** 输 入: int angle,int Ox,int Oy,float hangle

** angle---横滚角,单位是角度

** Ox---中心点的横坐标

** Oy---中心点的纵坐标

** hangle---俯仰角,单位是角度,取值范围【0,20】

** 输 出: 无

** 功能描述:输出天地球。切勿将天地球的任何部分画到屏幕以外,因为这很容易避免,所以程序对此不作检查

** 调用模块:Line1()

** 全局变量:g_nSkyEarthBallRadius,g_nSkyEarthBallColor1,g_nSkyEarthBallColor2,g_fSkyEarthBallEdge[];
			g_nNumOfHorizontalLine,

** 作 者:

** 日 期:2003.01.29

** 修改人:

** 日 期:2003.08.10

** 版 本:

****************************************************************/
void SkyEarthBall(float angle,int Ox,int Oy,float hangle)
{

	register float ctan,cosangle,sinangle;
	register int color1=g_nSkyEarthBallColor1,color2=g_nSkyEarthBallColor2;
	int x,y,diameter=g_nSkyEarthBallRadius*2;
	int h;
	int *p,*protated;
	float *pedge;
	int temp;
	float ftemp,Ox1,Oy1,ftemp2;
	int x1,x2,y1,y2;bool bfirsttime=true;
//俯仰角
	h=-(g_nSkyEarthBallRadius-1)*hangle/20;
//计算栈顶指针
	p=g_nHorizontalLine+g_nNumOfHorizontalLine*4;
	pedge=g_fSkyEarthBallEdge+g_nSkyEarthBallRadius-1;
	protated=g_nRotatedResult+g_nNumOfRotatedResult*7;
//把angle限制在【-180,180)范围内
	while (angle<=-180)
	angle+=360;
	while (angle>=180)
	angle-=360;
//如果angle小于零,将天地的颜色对调后,俯仰角取反,角度加180,即将angle小于0的情况转换到【0,180)的情况来处理
	if (angle<0)
	{
		angle+=180;color1=g_nSkyEarthBallColor2;color2=g_nSkyEarthBallColor1;h=-h;
	}
	cosangle=cos(angle*PI_180);sinangle=sin(angle*PI_180);
//加了俯仰角后相当于原点有个偏移
	Ox1=h*sinangle;
	Oy1=h*cosangle;
	if(angle==0)
	{
		g_nNumOfHorizontalLine+=diameter-1;
		g_nNumOfRotatedResult+=2*(diameter-1);
		for(y=-g_nSkyEarthBallRadius+1;y<Oy1;y++)
		{
			temp=ftemp=*(pedge+y);
//////////////////////////////////////////////////
//修正天地球圆弧边缘的锯齿
				*(protated++)=Ox+temp;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
//////////////////////////////////////////////////
			*(p++)=Ox-temp;
			*(p++)=Ox+temp-1;
			*(p++)=y+Oy;
			*(p++)=color1;
		}
		for(y=Oy1;y<g_nSkyEarthBallRadius;y++)
		{
			temp=ftemp=*(pedge+y);
//////////////////////////////////////////////////
//修正天地球圆弧边缘的锯齿
				*(protated++)=Ox+temp;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
//////////////////////////////////////////////////
			*(p++)=Ox-temp;
			*(p++)=Ox+temp-1;
			*(p++)=y+Oy;
			*(p++)=color2;
		}
	}
	else// if(angle<180)
	{
		ctan=cosangle/sinangle;
		g_nNumOfRotatedResult+=2*(diameter-1);
		for(y=-g_nSkyEarthBallRadius+1;y<g_nSkyEarthBallRadius;y++)
		{
			x=ftemp=ctan*(Oy1-y)+Ox1;
			temp=ftemp2=*(pedge+y);
			//如果天与地的相交处在天地球左边界的左边,则这一行的颜色都是color2
			if(x<=-temp)
			{
				*(p++)=Ox-temp;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color2;
				g_nNumOfHorizontalLine+=1;
				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
			}
			//如果天与地的相交处在天地球右边界的右边,则这一行的颜色都是color1
			else if(x>=temp)
			{
				*(p++)=Ox-temp;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color1;
				g_nNumOfHorizontalLine+=1;
				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
			}
			//如果天与地的相交处在天地球左右边界的中间,则这一行分成两部分,左边是color1,右边是color2
			else
			{
				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				//左半边是color1
				*(p++)=Ox-temp;
				*(p++)=(x=Ox+ftemp);
				*(p++)=y+Oy;
				*(p++)=color1;
				//右半边是color2
				*(p++)=x+1;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color2;
				g_nNumOfHorizontalLine+=2;
				if(bfirsttime)
				{
					x1=x;y1=Oy+y;bfirsttime=false;
				}
				x2=x;y2=Oy+y;
			}
		}
//对天与地的交界部分的锯齿进行修正
		if(angle>=45&&angle<=135)
		{
		Line1(x1,y1,x2,y2,color1,BFINALRESULT|NEEDMODIFY);	
		Line1(x1+1,y1,x2+1,y2,color2,BFINALRESULT|NEEDMODIFY);	
		}
		else if(angle<45)
		{
		Line1(x1,y1,x2,y2,color1,BFINALRESULT|NEEDMODIFY);	
		Line1(x1,y1+1,x2,y2+1,color2,BFINALRESULT|NEEDMODIFY);	
		}
		else
		{
		Line1(x1,y1,x2,y2,color2,BFINALRESULT|NEEDMODIFY);	
		Line1(x1,y1+1,x2,y2+1,color1,BFINALRESULT|NEEDMODIFY);	
		}
	}
}

//不对圆弧及交界线作修正的天地球程序,用来与上面的程序作效果对比
void UnFixedSkyEarthBall(float angle,int Ox,int Oy,float hangle)
{

	register float ctan,tan,cosangle,sinangle;
	register int color1=g_nSkyEarthBallColor1,color2=g_nSkyEarthBallColor2;
	int x,y,diameter=g_nSkyEarthBallRadius*2;
	int h;
	int *p,*protated;
	float *pedge;
	int temp;
	float ftemp,Ox1,Oy1,ftemp2;
	int x1,x2,y1,y2;bool bfirsttime=true;
//俯仰角
	h=-(g_nSkyEarthBallRadius-1)*hangle/20;
//计算栈顶指针
	p=g_nHorizontalLine+g_nNumOfHorizontalLine*4;
	pedge=g_fSkyEarthBallEdge+g_nSkyEarthBallRadius-1;
	protated=g_nRotatedResult+g_nNumOfRotatedResult*7;
//把angle限制在【-180,180)范围内
	while (angle<=-180)
	angle+=360;
	while (angle>=180)
	angle-=360;
//如果angle小于零,将天地的颜色对调后,俯仰角取反,角度加180,即将angle小于0的情况转换到【0,180)的情况来处理
	if (angle<0)
	{
		angle+=180;color1=g_nSkyEarthBallColor2;color2=g_nSkyEarthBallColor1;h=-h;
	}
	cosangle=cos(angle*PI_180);sinangle=sin(angle*PI_180);
	Ox1=h*sinangle;
	Oy1=h*cosangle;
	if(angle==0)
	{
		g_nNumOfHorizontalLine+=diameter-1;
//		g_nNumOfRotatedResult+=2*(diameter-1);
		for(y=-g_nSkyEarthBallRadius+1;y<Oy1;y++)
		{
			temp=ftemp=*(pedge+y);
/*				*(protated++)=Ox+temp;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;*/
			*(p++)=Ox-temp;
			*(p++)=Ox+temp-1;
			*(p++)=y+Oy;
			*(p++)=color1;
		}
		for(y=Oy1;y<g_nSkyEarthBallRadius;y++)
		{
			temp=ftemp=*(pedge+y);
/*				*(protated++)=Ox+temp;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;*/
			*(p++)=Ox-temp;
			*(p++)=Ox+temp-1;
			*(p++)=y+Oy;
			*(p++)=color2;
		}
	}
	else// if(angle<180)
	{
		ctan=cosangle/sinangle;
		for(y=-g_nSkyEarthBallRadius+1;y<g_nSkyEarthBallRadius;y++)
		{
			x=ftemp=ctan*(Oy1-y)+Ox1;
			temp=ftemp2=*(pedge+y);
			//如果天与地的相交处在天地球左边界的左边,则这一行的颜色都是color2
			if(x<=-temp)
			{
				*(p++)=Ox-temp;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color2;
				g_nNumOfHorizontalLine+=1;
/*				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;g_nNumOfRotatedResult+=2;*/
			}
			//如果天与地的相交处在天地球右边界的右边,则这一行的颜色都是color1
			else if(x>=temp)
			{
				*(p++)=Ox-temp;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color1;
				g_nNumOfHorizontalLine+=1;
/*				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;g_nNumOfRotatedResult+=2;*/
			}
			//如果天与地的相交处在天地球左右边界的中间,则这一行分成两部分,左边是color1,右边是color2
			else
			{
/*				*(protated++)=Ox+temp+1;
				*(protated++)=Oy+y;
				*(protated++)=color2;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=Ox-temp-1;
				*(protated++)=Oy+y;
				*(protated++)=color1;
				*(protated++)=(ftemp2-temp)*256;
				*(protated++)=0;
				*(protated++)=0;
				*(protated++)=0;g_nNumOfRotatedResult+=2;*/
				//左半边是color1
				*(p++)=Ox-temp;
				*(p++)=(x=Ox+ftemp);
				*(p++)=y+Oy;
				*(p++)=color1;
				//右半边是color2
				*(p++)=x+1;
				*(p++)=Ox+temp;
				*(p++)=y+Oy;
				*(p++)=color2;
				
				g_nNumOfHorizontalLine+=2;
				if(bfirsttime)
				{
					x1=x;y1=Oy+y;bfirsttime=false;
				}
				x2=x;y2=Oy+y;
			}
		}
/*		if(angle>=45&&angle<90)
		{
		Line1(x1,y1,x2,y2,color1,BFINALRESULT|NEEDMODIFY);	
		Line1(x1+1,y1,x2+1,y2,color2,BFINALRESULT|NEEDMODIFY);	
		}
		else if(angle<=135&&angle>90)
		{
		Line1(x1,y1,x2,y2,color1,BFINALRESULT|NEEDMODIFY);	
		Line1(x1+1,y1,x2+1,y2,color2,BFINALRESULT|NEEDMODIFY);	
		}
		else if(angle<45)
		{
		Line1(x1,y1,x2,y2,color1,BFINALRESULT|NEEDMODIFY);	
		Line1(x1,y1+1,x2,y2+1,color2,BFINALRESULT|NEEDMODIFY);	
		}
		else
		{
		Line1(x1,y1,x2,y2,color2,BFINALRESULT|NEEDMODIFY);	
		Line1(x1,y1+1,x2,y2+1,color1,BFINALRESULT|NEEDMODIFY);	
		}*/
	}
}


/*****************************************************************

** 函数名:RotateLine

** 输 入: int x,int y1,int y2,int Oy,float angle,int color,int nFlags

** x---垂线的横坐标

** y1---垂线一端的纵坐标

** y2---垂线另一端的纵坐标

** angle---要旋转的角度,单位是角度

** color---直线的颜色

** nFlags---属性标志,在此有用的有BLINKING位,指明直线是否闪烁
								BFINALRESULT,指明直线是否最终结果,如否,产生中间结果后用Rotate函数旋转
								NEEDMODIFY,指明直线需否插值修正,需修正的话,BFINALRESULT位必须同时有效

** 输 出: 无

** 功能描述:画一条垂直线再将其逆时针旋转某一角度后输出到屏幕上

** 调用模块:cos(),sin(),Line()

** 全局变量:无

** 作 者:

** 日 期:2003.01.29

** 修改人:

** 日 期:2003.08.10

** 版 本:

****************************************************************/

void RotateLine(int x,int y1,int y2,int Oy,float angle,int color,int nFlags)
{
int x1,x2;
float cosangle,sinangle;
	angle*=PI_180;
	cosangle=cos(angle);sinangle=sin(angle);
	y1-=Oy;y2-=Oy;
//求出一个端点旋转后的坐标
	x1=x+y1*sinangle;
	y1=Oy+y1*cosangle;
//求出另一个端点旋转后的坐标
	x2=x+y2*sinangle;
	y2=Oy+y2*cosangle;
//调用Line()输出直线
	Line(x1,y1,x2,y2,color,nFlags);
return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -