📄 drawgraph.c
字号:
** 日 期: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 + -