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

📄 zhang.c

📁 计算机图形学
💻 C
📖 第 1 页 / 共 2 页
字号:
/* WIN-TC BGI 图形编程模板 */

#include "Conio.h"
#include "graphics.h"
#include "string.h"
#include "Math.h"
#define ESC 0x1b
#define DELTA 5.0
#define pi 3.1415926
#define true 1
#define false 0
#define closegr closegraph
typedef struct{
  float x;
  float y;
  }Point;
typedef struct{
  int pointNum;
  Point *vertices;
  }Polygon;
typedef struct{
  unsigned all;
  unsigned left,right,top,bottom;
  }OutCode;
typedef struct{
  int xmin,xmax,ymin,ymax;
  }Rectangle;

void initgr(void) /* BGI初始化 */
{
  int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
  registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
  initgraph(&gd, &gm, "");
}

void Pause(void)
{
  int c;
  c = getch();              /* Read a character from kbd    */

  if( ESC == c ){           /* Does user wish to leave? */
    closegraph();           /* Change to text mode      */
    exit( 1 );              /* Return to OS         */
  }

  if( 0 == c ){             /* Did use hit a non-ASCII key? */
    c = getch();            /* Read scan code for keyboard  */
  }
}
/*----------------------------直线中点算法-----------------------------*/

void MidPointLine(int x0,int y0,int x1,int y1,int color,int width,int figure)
{
 int flag,t,x,y,i;
 float incrE,incrNE, dx,dy,s,d;
 if(x1<x0)
 {t=x0;x0=x1;x1=t;
  t=y0;y0=y1;y1=t;
  }
  dx=x1-x0;
  dy=y1-y0;
  s=y0-dy/dx*x0;
  y0=y0-s;
  y1=y1-s;
  if(dy>0&&dy/dx<=1)
  {flag=0;}
  else if(dy/dx>=-1&&dy<0)
  {flag=1;
   y0=-y0;
   y1=-y1;
   }
   else if(dy/dx>1)
   {flag=2;
    t=x0;x0=y0;y0=t;
    t=x1;x1=y1;y1=t;
    if(x1<x0)
      {t=x0;x0=x1;x1=t;
       t=y0;y0=y1;y1=t;
       }
    }
    else if(dy/dx<-1)
    {flag=3;
     t=x0;x0=y0;y0=t;
     t=x1;x1=y1;y1=t;
     y0=-y0;
     y1=-y1;
     if(x1<x0)
      {t=x0;x0=x1;x1=t;
       t=y0;y0=y1;y1=t;
       }
     }
     dx=x1-x0;
     dy=y1-y0;
     d=dx-2*dy;
     incrE=-2*dy;
     incrNE=2*(dx-dy);
     x=x0;y=y0;
     if(flag==0)
         putpixel(x,y+(int)(s+0.5),color);
        else if(flag==1)
          putpixel(x,-y+(int)(s+0.5),color);
        else if(flag==2)
           putpixel(y,x+(int)(s+0.5),color);
        else if(flag==3)
          putpixel(-y,x+(int)(s+0.5),color);
     while(x<x1)
     {if(d>0)
       d+=incrE;
       else
       {
        d+=incrNE;
        y++;
        }
        x++;
       if(figure==true)
        {if(flag==0)
         for(i=-width/2;i<width-width/2;i++)
          putpixel(x+450,y+i+(int)(s+0.5)+225,color);
        else if(flag==1)
         for(i=-width/2;i<width-width/2;i++)
          putpixel(x+450,-y+i+(int)(s+0.5)+225,color);
        else if(flag==2)
         for(i=-width/2;i<width-width/2;i++)
          putpixel(y+450,x+i+(int)(s+0.5)+225,color);
        else if(flag==3)
         for(i=-width/2;i<width-width/2;i++)
          putpixel(-y+450,x+i+(int)(s+0.5)+225,color);
         }
       else

         {if(flag==0)
           {if((x+450)%16>=8)
             for(i=-width/2;i<width-width/2;i++)
             putpixel(x+450,y+i+(int)(s+0.5)+225,color);}
          else if(flag==1)
           {if((x+450)%16>=8)
             for(i=-width/2;i<width-width/2;i++)
             putpixel(x+450,-y+i+(int)(s+0.5)+225,color);}
          else if(flag==2)
           {if((x+225)%16>=8)
            for(i=-width/2;i<width-width/2;i++)
            putpixel(y+450,x+i+(int)(s+0.5)+225,color);}
          else if(flag==3)
           {if((x+225)%16>=8)
            for(i=-width/2;i<width-width/2;i++)
            putpixel(-y+450,x+i+(int)(s+0.5)+225,color);}
         }
     }

     Pause();
}


/*-----------------生成圆的等面积正多边形迫近法--------------------*/
void CircleToPolygon(int radius)
{
 int i,n;
 float x,y,xnew,ynew,alfa,cos1,sin1;
 /*计算圆心角和边数n*/
 alfa=2*acos(((float)radius-DELTA)/(float)radius);
 printf("alfa=%f\n",alfa);
 n=(int)(360/alfa);
 printf("n=%d\n",n);
 /*由递推式求解顶点*/
 x=sqrt(alfa/sin(alfa))*radius;
 y=0.0;
 cos1=cos(alfa/360*2*pi);
 sin1=sin(alfa/360*2*pi);
 for(i=1;i<n;i++)
 {
  xnew=cos1*x-sin1*y;
  ynew=sin1*x+cos1*y;
  line((int)(x+0.5+450),(int)(y+0.5+225),(int)(xnew+0.5+450),(int)(ynew+0.5+225));
  x=xnew;
  y=ynew;
  }
  x=sqrt(alfa/sin(alfa))*radius;
  y=0.0;
  line((int)(xnew+0.5+450),(int)(ynew+0.5+225),(int)(x+450),(int)(y+225));
  Pause();
}



/*-----------------------------------建立坐标系-----------------------------*/
void establishcoordinate()
{
  int x,y;
  line(300,225,600,225);
  line(450,100,450,350);
  for(x=300;x<600;x+=10)
     for(y=222;y<225;y++)
      putpixel(x,y,WHITE);
      outtextxy(442,228,"0");
      outtextxy(300,232,"-150");
      outtextxy(600,232,"150");
      outtextxy(605,220,"x");

/*---------------------以下为说明语句--------------------*/
      line(350,155,360,155);
      for(x=350;x<=360;x+=10)
        for(y=152;y<155;y++)
         putpixel(x,y,WHITE);
      outtextxy(349,160,"10");
      outtextxy(280,150,"explain");
/*---------------------以上为说明语句--------------------*/
  for(y=100;y<350;y+=10)
     for(x=450;x<453;x++)
     putpixel(x,y,WHITE);
     outtextxy(415,100,"-125");
     outtextxy(415,350,"125");
     outtextxy(450,355,"y");
  line(595,220,600,225);
  line(595,230,600,225);
  line(445,345,450,350);
  line(455,345,450,350);
  Pause();
}



/*-----------------------------------用正负法画抛物线-----------------------------*/
void PositiveNegativeParabola(float a,float b,float c,int color)
{
 int x,y,d;
 x=0;
 y=0;
 putpixel(x+450+b,y+225+c,color);
 if(a>0)
 {   y=1;
     putpixel(x+450+b,y+225+c,color);
     d=1;
    while(y<=100)
    {
     if(d>=0)
     {d=d-2*a*x-a;
      x++;
      }
     else
     {d=d+1;
      y++;
      }
      putpixel(-x+450+b,y+225+c,color);
      putpixel(x+450+b,y+225+c,color);
     }
  }
  else if(a<0)
  {
     x=1;
     putpixel(x+450+b,y+225+c,color);
     d=1;
    while(y>=-100)
    {
     if(d>=0)
     {
      d=d-1;
      y--;
      }
     else
     {
      d=d-2*a*x-a;
      x++;
      }
      putpixel(-x+450+b,y+225+c,color);
      putpixel(x+450+b,y+225+c,color);
      }
    }
    else
    {
     printf("this is not a Parabola!\n");
    }
    Pause();
}


/*---------------------计算五角星各顶点坐标,绘制五角星----------------------*/
void DrawPentacle(int radius,int centerx,int centery)
{
  int i;
  int list[10][2];
  setcolor(RED);
  for(i=0;i<10;i++)
    if(i%2==0)
    {
     list[i][0]=(int)(radius*cos(pi/5*i-pi/10))+centerx;
     list[i][1]=(int)(radius*sin(pi/5*i-pi/10))+centery;
     }
     else
     {
      list[i][0]=(int)(radius*sin(pi/10)/sin(pi*7/10)*cos(pi/5*i-pi/10))+centerx;
      list[i][1]=(int)(radius*sin(pi/10)/sin(pi*7/10)*sin(pi/5*i-pi/10))+centery;
      }
   for(i=0;i<10;i++)
     line(list[i][0],list[i][1],list[(i+1)%10][0],list[(i+1)%10][1]);

}

/*------------------------逐点判断算法--------------------------------*/

void FillPentacle(int Pentaclecolor)
{
 int x,y,i0,y0,flag=0;
 setcolor(RED);
 for(y=129;y<=303;y++)
  for(x=200;x<=getmaxx();x++)
   if(getpixel(x-1,y)!=RED&&getpixel(x,y)==RED&&flag==0)
    {i0=x;
     y0=y;
     flag++;
     }
     else if(getpixel(x,y)==RED&&getpixel(x-1,y)!=RED&&flag==1)
     {

      line(i0,y0,x,y);
      flag=0;
     }
}


/*-------------------------画直线部分的程序输入-----------------------*/
void DrawLine()

⌨️ 快捷键说明

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