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

📄 bezier.c

📁 计算机图形学
💻 C
字号:
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph

#define X 0
#define Y 1
#define MAX 100

typedef float Vector[2];

/*-------------------三次Bezier曲线的矩阵表示及生成-----------------------*/

void DisplayCubicBezierCurve1(Vector P[4],int count)
{
  float C[2][4],t,deltat;
  Vector V,newV;
  int i,j;
  for(j=0;j<2;j++)
  {
   C[j][0]=P[0][j];
   C[j][1]=-3*P[0][j]+3*P[1][j];
   C[j][2]=3*P[0][j]-6*P[1][j]+3*P[2][j];
   C[j][3]=-P[0][j]+3*P[1][j]-3*P[2][j]+P[3][j];                           ;

   }

   V[X]=P[0][X],V[Y]=P[0][Y];
   deltat=1.0/count;
   t=0.0;
   for(i=1;i<=count;i++)
 {
  t+=deltat;

  newV[X]=C[X][0]+t*(C[X][1]+t*(C[X][2]+t*C[X][3]));
  newV[Y]=C[Y][0]+t*(C[Y][1]+t*(C[Y][2]+t*C[Y][3]));
  line(V[X],V[Y],newV[X],newV[Y]);

  V[X]=newV[X],V[Y]=newV[Y];
   }
 }

 /*------------------de casteljau算法-----------------------*/
void BezierCurveDeCasteljau(Vector P[4],int n,float t,Vector V)
{
  Vector R[MAX];
  int r,i;
  float s;

  for(i=0;i<=n;i++)
  {
   R[i][X]=P[i][X];
   R[i][Y]=P[i][Y];
  }

  s=1.0-t;

  for(r=1;r<=n;r++)
  {
    for(i=0;i<=n-r;i++)
    {
     R[i][X]=s*R[i][X]+t*R[i+1][X];
     R[i][Y]=s*R[i][Y]+t*R[i+1][Y];
     }
     V[X]=R[0][X];V[Y]=R[0][Y];
   }
 }

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

main()
{
 Vector P[4],Q[4],V;
 float t;
 P[0][X]=600;P[0][Y]=100;
 P[1][X]=300;P[1][Y]=200;
 P[2][X]=200;P[2][Y]=400;
 P[3][X]=100;P[3][Y]=400;

 Q[0][X]=550;Q[0][Y]=150;
 Q[1][X]=450;Q[1][Y]=350;
 Q[2][X]=300;Q[2][Y]=450;
 Q[3][X]=150;Q[3][Y]=450;

 initgr(); /* BGI初始化 */

  setcolor(RED);
  line(P[0][X],P[0][Y],P[1][X],P[1][Y]);
  line(P[1][X],P[1][Y],P[2][X],P[2][Y]);
  line(P[2][X],P[2][Y],P[3][X],P[3][Y]);

  setcolor(GREEN);
  DisplayCubicBezierCurve1(Q,10000);

  setcolor(BLUE);
    putpixel(P[0][X],P[0][Y],BLUE);
  outtextxy(P[0][X],P[0][Y],"P0");
   putpixel(P[1][X],P[1][Y],BLUE);
  outtextxy(P[1][X],P[1][Y],"P1");
   putpixel(P[2][X],P[2][Y],BLUE);
  outtextxy(P[2][X],P[2][Y],"P2");
   putpixel(P[3][X],P[3][Y],BLUE);
  outtextxy(P[3][X],P[3][Y],"P3");
  for(t=0.0;t<=1;t+=0.0001)
  {
  BezierCurveDeCasteljau(P,3,t,V);
  putpixel(V[X],V[Y],WHITE) ;
  }
 getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
 closegr(); /* 恢复TEXT屏幕模式 */
}

⌨️ 快捷键说明

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