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

📄 4.1-4.2.c

📁 计算机图形学
💻 C
字号:
/*line-circle*/

#include "Conio.h"
#include "graphics.h"
#include "stdio.h"
#include "math.h"
#define closegr closegraph
#define xo 300
#define yo 250
#define DELTA 1.0
#define max 100
/*最大顶点数*/

typedef struct
 {int x;
  int y;
}Point;

typedef struct
{int pointNum;
 Point *vertices;
 }Polygon;

void initgr(void) /* BGI初始化 */
{
  int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
  registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
  initgraph(&gd, &gm, "");
}
/*控制线宽*/
void putpixels(int x,int y,int color,int n)
{ int i,j;
  for(i=-n/2;i<=n/2;i++)
      for(j=-n/2;j<=n/2;j++)
        putpixel(x+j,y+i,color);

}
void putpixelt(int x,int y,int color,int i)
{int a[8]={1,1,1,1,0,0,0,0};
 if(a[i%8])putpixel(x,y,color);
}
/*画点*/
void EllipsePoints(int x,int y,int color)
{putpixel(xo+x,yo+y,color);
 putpixel(xo-x,yo+y,color);
 putpixel(xo+x,yo-y,color);
 putpixel(xo-x,yo-y,color);
 }
void CirclePoints(int x,int y,int color)
{putpixel(xo+x,yo+y,color);
 putpixel(xo+y,yo+x,color);
 putpixel(xo-y,yo+x,color);
 putpixel(xo-x,yo+y,color);
 putpixel(xo+y,yo-x,color);
 putpixel(xo+x,yo-y,color);
 putpixel(xo-x,yo-y,color);
 putpixel(xo-y,yo-x,color);
 }
/*画直线*/

void LineDDAwidth(int x0,int y0,int x1,int y1,int color,int n)
{int x;
 float dy,dx,y,m;
 dx=x1-x0;
 dy=y1-y0;
 m=dy/dx;
 y=y0;
 for(x=x0;x<=x1;x++)
    {putpixels(x,(int)(y+0.5),color,n);
    y+=m;
    }
}
void LineDDAdash(int x0,int y0,int x1,int y1,int color)
{int x,i=0;
 float dy,dx,y,m;
 dx=x1-x0;
 dy=y1-y0;
 m=dy/dx;
 y=y0;
 for(x=x0;x<=x1;x++)
    {putpixelt(x,(int)(y+0.5),color,i++);
    y+=m;
    }
}

void MidPointLine(int x0,int y0,int x1,int y1,int color)
{int dx,dy,incrE,incrNE,d,x,y;
 dx=x1-x0;
 dy=y1-y0;
 d=dx-2*dy;
 incrE=-2*dy;
 incrNE=2*(dx-dy);
 x=x0,y=y0;
 putpixel(x,y,color);
 if(dy<dx)
 {
 while(x<x1)
  {if(d>0)
   d+=incrE;
   else
    {d+=incrNE;
     y++;

     }
   x++;
   putpixel(x,y,color);
     }
   }
  else
   {d=dy-2*dx;
    incrE=-2*dx;
    incrNE=2*(dy-dx);
    x=x0,y=y0;
    putpixel(x,y,color);
    while(y<y1)
   {if(d>0)
   d+=incrE;
   else
    {d+=incrNE;
     x++;
     }
   y++;
   putpixel(x,y,color);
     }
   }
 }
/*画圆*/

void MidPointCircle(int radius,int color)
/*生成圆弧的中点算法*/
{int x,y;
 float d;
 x=0;
 y=radius;
 d=5.0/4-radius;
 CirclePoints(x,y,color);
 while(y>x)
 {if(d<=0)
  d+=2.0*x+3;
  else
   {d+=2.0*(x-y)+5;
    y--;
    }
   x++;
   CirclePoints(x,y,color);
   }
  }
void MidPointCircle1(int radius,int color)
/*消除了乘法运算的中点算法*/
{int x,y,d,E=12,SE=20-8*radius;
 x=0;
 y=radius;
 d=5-4*radius;
 CirclePoints(x,y,color);
 while(y>x)
 {if(d<=0)
  {d+=E;
  SE+=8;}
  else
   {d+=SE;
  SE+=16;
    y--;
    }
   E+=8;
   x++;
   CirclePoints(x,y,color);
   }
  } 


void PositiveNegativeArc(int radius,int color)
/* 正负法生成圆弧 */
{int x,y,d;
 x=0;
 y=radius;
 EllipsePoints(x,y,color);
 x=1;
 EllipsePoints(x,y,color);
 d=1;
 while(y>=0)
 {if(d>=0)
 {d=d-2*y+1;
 y--;
 }
 else
 {d=d+2*x+1;
 x++;
 }
  EllipsePoints(x,y,color);
 }
 }
/*多边形迫近法生成多边形*/
Polygon *CircleToPolygon(int radius,Polygon *polygon)
{int i,n;
 float x,y,xnew,ynew,cos1,sin1,alfa;
 /* 计算圆心角和边数n */
 alfa=2*acos(((float)radius-DELTA)/(float)radius);
 n=(int)(2*3.1415926/alfa+0.5);
 /* 分配记录多边形顶点所需要的空间 */
 polygon->pointNum=n;
 polygon->vertices=(Point *)malloc(n*sizeof(Point));
 /* 由递推式求解顶点 */
 x=0.0;
 y=(float)radius;
 polygon->vertices[0].x=0;
 polygon->vertices[0].y=radius;
 cos1=cos(alfa);
 sin1=sin(alfa);
 for(i=1;i<n;i++)
 {xnew=cos1*x-sin1*y;
  ynew=sin1*x+cos1*y;
  x=xnew;
  y=ynew;
  polygon->vertices[i].x=(int)(x+0.5);
  polygon->vertices[i].y=(int)(y+0.5);
  }
  printf("%d",n);     /*n边形*/
  return(polygon);
  }

void CircleToPolygonDraw(int radius,int color)
{   int i=0;
   Polygon *polygon=NULL;
   CircleToPolygon(radius,polygon);
   setcolor(color);
   for(i=0;i<polygon->pointNum-1;i++)
  { line(xo+polygon->vertices[i].x, yo+polygon->vertices[i].y,xo+polygon->vertices[i+1].x,
   yo+polygon->vertices[i+1].y);}
   line(xo+polygon->vertices[i].x, yo+polygon->vertices[i].y,
   xo+polygon->vertices[0].x, yo+polygon->vertices[0].y);
}

main()
{
  initgr(); /* BGI初始化 */
  LineDDAwidth(10,50,160,200,14,5);
  LineDDAdash(50,50,200,200,15);
  MidPointLine(100,50,250,200,2);
  MidPointCircle1(100,3);
  PositiveNegativeArc(150,4);
  CircleToPolygonDraw(200,5);
  getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
  closegr(); /*恢复TEXT屏幕模式 */
}

⌨️ 快捷键说明

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