?求出一个图片里面特定位置像素点的个数?????100分哦~~~~~~~~~~~~

时间:2023-02-14 14:28:16
?求出一个图片里面特定位置像素点的个数?????100分哦~~~~~~~~~~~~

正如上面图片上的黑色区域一样~我想求出这个区域内部的像素点的个数!!!

希望哪位大哥帮我写个程序啊~~~帮帮忙啊~~~~

12 个解决方案

#1


这个黑色区域是叠加在源图层上面的吧
如果这个区域是个圆的话,不是很好计算吗?

不规则图形,那就要有特定的算法了

#2


网上搜索一下

#3


可以用matlab吧,这样方便很多

一句话就可以读入

但后就全图片扫描,可以获取的

#4


一个个像素扫描,看这点的着色值为黑色就加一~~~

#5


可以啊 ~~~有没有程序啊?

#6


有没有程序啊?急需程序啊~~~

#7


扫描线填充算法和区域填充算法

#8


参考以下
#include <graphics.h>
#include <math.h>

#define SCREENX 80
#define SCREENY 80
   
/* 矩阵变换函数---------------------------------------------------------- */
   
/* 生成绕x轴旋转theta角的矩阵Rx */
void matRx(float Rx[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Rx[i][j]=0;
   Rx[0][0]=1; Rx[3][3]=1;
   Rx[1][1]=cos(theta);
   Rx[1][2]=sin(theta);
   Rx[2][1]=-sin(theta);
   Rx[2][2]=cos(theta);
}

/* 生成绕y轴旋转theta角的矩阵Ry */
void matRy(float Ry[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Ry[i][j]=0;
   Ry[1][1]=1;  Ry[3][3]=1;
   Ry[0][0]=cos(theta);
   Ry[0][2]=-sin(theta);
   Ry[2][0]=sin(theta);
   Ry[2][2]=cos(theta);
}

/* 生成绕z轴旋转theta角的矩阵Rz */
void matRz(float Rz[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Rz[i][j]=0;
   Rz[2][2]=1;  Rz[3][3]=1;
   Rz[0][0]=cos(theta);
   Rz[0][1]=sin(theta);
   Rz[1][0]=-sin(theta);
   Rz[1][1]=cos(theta);
}

/* 生成平移(tx,ty,tz)的矩阵Txyz */
void matTxyz(float Txyz[][4],float tx,float ty,float tz)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Txyz[i][j]=0;
   Txyz[0][0]=1; Txyz[1][1]=1;  Txyz[2][2]=1;  Txyz[3][3]=1;
   Txyz[3][0]=tx; Txyz[3][1]=ty; Txyz[3][2]=tz; 
}

/* 矩阵相乘 R=A*B */
void MatMul(float R[][4],float A[][4],float B[][4])
{
   int i,j,k;
   float AA[4][4],BB[4][4];
   for(i=0;i<4;i++) {
      for(j=0;j<4;j++) {
         AA[i][j] = A[i][j]; BB[i][j] = B[i][j]; 
      }
   }
  
   for(i=0;i<4;i++) {
      for(j=0;j<4;j++) {
         R[i][j] = 0;  /* float (*R)[4],  *(*(R+i)+j) = 0; */
         for(k=0;k<4;k++)
            R[i][j] = R[i][j]+ AA[i][k]*BB[k][j];
      }
   }
}

/* 向量与矩阵相乘 R=Vector*Mat */
void MVMul(float R[],float Vector[],float Mat[][4])
{
   int i,j,k;
   for(i=0;i<3;i++) {
      R[i] = 0;
      for(j=0;j<3;j++) 
         R[i] = R[i] + Vector[j] * Mat[j][i];
      R[i] = R[i] + Mat[3][i];
   }
}


/* 排序,求交等公用函数---------------------------------------------------------- */

/* 从小到大排序 */
void sort(float a[],int n)
{
   int i,j,k;
   float temp;
   for (i=0;i<n;i++){
      k=i;
      for (j=i+1;j<n;j++)
         if (a[j]<a[k])
            k=j;
      temp = a[i];
      a[i]=a[k];
      a[k]=temp;
   }
}

/* 求扫描线与边AB的交点,如果无交点,返回-1 */
float linejoin(float A[3],float B[3],int y)
{
   float t;
   if (B[1]==A[1])
      return -1;
   
   t = (y-A[1]) / (B[1]-A[1]);
   if (t>=0 && t<=1){
      return A[0] + (B[0]-A[0])*t;
   }else
      return -1;
}

/* 向量的点乘 */
float dot(float A[3],float B[3]){
   return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]);
}

/* 向量的叉乘 */
void cross(float R[3],float A[3],float B[3]){
   R[0] = A[1]*B[2] - A[2]*B[1];
   R[1] = A[2]*B[0] - A[0]*B[2];
   R[2] = A[0]*B[1] - A[1]*B[0];
}

/* 求平面P(u,w)=A+uB+wC与直线Q(t)=D+tE的交点R */
int facejoin(float R[3],float A[3],float B[3],float C[3],float D[3],float E[3])
{
   float Temp[3],t;

   cross(Temp,B,C);
   
   if (dot(Temp,E)==0)
      return -1;
   
   t = (dot(Temp,A)-dot(Temp,D)) / dot(Temp,E);
   
   R[0] = D[0] + t*E[0];
   R[1] = D[1] + t*E[1];
   R[2] = D[2] + t*E[2];
   return 1;
}

/* 复制两个向量R=A */
void copyvertex(float R[3],float A[3])
{
  R[0]=A[0];R[1]=A[1];R[2]=A[2];
}

/* 扫描线填充算法---------------------------------------------------------- */
/* 用扫描线算法用颜色c填充由vertex顶点序列定义的多边形区域 */
/* 为了与其它三维点坐标传递参数,这里也统一改用空间点的坐标,而不用float vertex[][2] */
/* 用深度缓存算法进行面消隐 */
void linefill(float vertex[][3],int n,int c,float ZB[][SCREENY],int beginx,int beginy)
{
   int i,j,k,x,y,miny,maxy;
   float A[3],B[3],C[3],D[3],E[3],R[3],temp,join[10];
   
   setcolor(c);
   
   /* 计算该多边形的平面方程P(u,w)=A+uB+wC,直线方程Q(t)=(x0,y0,0)+(0,0,1)t */
   for (i=0;i<3;i++) {
      A[i]=vertex[0][i];
      B[i]=vertex[1][i]-vertex[0][i];
      C[i]=vertex[2][i]-vertex[0][i];
      
      D[i] = 0;
      E[i] = 0;
   }
   D[2]=0;
   E[2]=1;

   
   /* 找出y坐标最大和最小的顶点 */
   miny=vertex[0][1];maxy=vertex[0][1];
   for (i=0;i<n;i++){
      if (vertex[i][1]<miny)
         miny=vertex[i][1];
      if (vertex[i][1]>maxy)
         maxy=vertex[i][1];
   }
   
   /* 使扫描线从y坐标最小的递增1到y最大的顶点 */
   for (y=miny;y<=maxy;y++){
      
      /* 求当前扫描线与每条边的交点 */
      j=-1;
      for (i=0;i<n;i++) {
         if (y==vertex[(i+1)%n][1]) /* 交点在边的端点 */
            if ((vertex[(i+1)%n][1]-vertex[i][1])*(vertex[(i+1)%n][1]-vertex[(i+2)%n][1])<0) /* 如果是左右顶点,交点算一个 */
               continue;

         temp = linejoin(vertex[i],vertex[(i+1) % n],y);
         if (temp!=-1){
            j++;
            join[j] = temp;
            
         }
      }
      
      /* 交点排序,填充交点间的扫描线段 */
      sort(join,j+1);
      
      for (k=0;k<=j/2;k++){
         /* line(join[2*k],y,join[2*k+1],y); */
         
          for (x=join[2*k];x<=join[2*k+1];x++) {
              D[0]=x; D[1]=y;
              if (facejoin(R,A,B,C,D,E)){ /* 计算平面区域在(x,y)点的深度值R[2] */
                  if (R[2]>ZB[x-beginx][y-beginy]){
                      putpixel(x,y,c);
                      ZB[x-beginx][y-beginy] = R[2];
                  }
              }
          }
          
      }
   }
}
/* --------------------------------------------------------- */


#9


/* 把数据显示在屏幕上 */
void draw(float vertex[][3],int c)
{

   int i,j,minx,miny,c1=RED,c2=YELLOW,c3=BLUE,c4=CYAN,c5=WHITE,c6=GREEN;
   float ZB[SCREENX][SCREENY];
   float thevertex[4][3];
   
   /* 初始化深度缓存数组 */
   for (i=0;i<SCREENX;i++)
      for (j=0;j<SCREENY;j++)
         ZB[i][j] = -1000;
   
   setcolor(c);
   
   /* 画正方体的12条边 */
   moveto(vertex[3][0],vertex[3][1]);
   for (i=0;i<4;i++)
      lineto(vertex[i][0],vertex[i][1]);
   moveto(vertex[7][0],vertex[7][1]);
   for (i=4;i<8;i++)
      lineto(vertex[i][0],vertex[i][1]);
   for (i=0;i<4;i++)
      line(vertex[i][0],vertex[i][1],vertex[i+4][0],vertex[i+4][1]);
   
   /* 找出x,y坐标最小的顶点 */
   minx=vertex[0][0];miny=vertex[0][1];
   for (i=0;i<8;i++){
      if (vertex[i][0]<minx)
         minx=vertex[i][0];
      if (vertex[i][1]<miny)
         miny=vertex[i][1];
   }
   minx--;miny--;
 
   if (c==BLACK) {c1=BLACK;c2=BLACK;c3=BLACK;c4=BLACK;c5=BLACK;c6=BLACK;}
   
   linefill(vertex,4,c1,ZB,minx,miny);
   linefill(&vertex[4],4,c2,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[0]);
   copyvertex(thevertex[1],vertex[1]);
   copyvertex(thevertex[2],vertex[5]);
   copyvertex(thevertex[3],vertex[4]);
   linefill(thevertex,4,c3,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[0]);
   copyvertex(thevertex[1],vertex[3]);
   copyvertex(thevertex[2],vertex[7]);
   copyvertex(thevertex[3],vertex[4]);
   linefill(thevertex,4,c4,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[2]);
   copyvertex(thevertex[1],vertex[3]);
   copyvertex(thevertex[2],vertex[7]);
   copyvertex(thevertex[3],vertex[6]);
   linefill(thevertex,4,c5,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[1]);
   copyvertex(thevertex[1],vertex[2]);
   copyvertex(thevertex[2],vertex[6]);
   copyvertex(thevertex[3],vertex[5]);
   linefill(thevertex,4,c6,ZB,minx,miny);
   
}

/* 主函数--------------------------------------------------------- */
main()
{
   int i,j;
   float vertex[][3]={{280,0,20},{280,40,20},{320,40,20},{320,0,20},{280,0,-20},{280,40,-20},{320,40,-20},{320,0,-20}};
   float pvertex[8][3]; /* 旋转变换之后的新坐标 */

   float Rx[4][4],Ry[4][4],Rz[4][4],R[4][4],Txyz[4][4]; /* 旋转平移变换矩阵 */
   float theta;
   
   void matRx(),matRy(),matTxyz(),MatMul(),MVMul(),draw();

  int driver=DETECT,mode;  
  registerbgidriver(EGAVGA_driver);
  initgraph(&driver,&mode,"");
   
   /* 整个场景绕x轴旋转theta角度(也可看作是坐标轴旋转-theta角度),使得z轴的方向和视线方向相同 */
   theta = 3.14/3;
   matRx(Rx,theta);
   
   /* 不断循环动画,直到敲击了一下键盘 */
   while (!kbhit()) { 

      theta = theta + 0.1;
      if (theta>6.28)
         theta = 0;

      /* 正方体绕z轴公转theta角度 */
      matRz(Rz,theta);

      MatMul(R,Rz,Rx);
   
      /* 以 (300,240,0) 为中心(固定点)旋转 */
      matTxyz(Txyz,-300,-240,0);
      MatMul(R,Txyz,R);
      matTxyz(Txyz,300,240,0);
      MatMul(R,R,Txyz);

      /* 进行坐标变换 */
      for (i=0;i<8;i++)
         MVMul(pvertex[i],vertex[i],R);
      
      /* 清楚屏幕,画出新的图形 */
      clearviewport();
      draw(pvertex,WHITE);
      
      /* 延迟速度 sleep(1);*/
      for (i=0;i<500;i++) {
         /* 在中心画个圆并用红色填充(太阳) */
         setcolor(WHITE);
         circle(300,240,20);
         setfillstyle(1,RED);
         floodfill(300,240,WHITE);
      }

      getch();
      /* draw(pvertex,BLACK); 用背景色擦掉刚才所画的所有图形,下一轮循环再在新的地方画图,实现动画 */
      
   }

   getch();
   
   closegraph();
}

#10


楼上的....厉害.
我只能想到一个一个象素遍历

#11


嗯,不错!
学习了

#12



∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞

力争成为中国最大的架构师群联盟,架构师技术交流群:62402336正式开放!!!

已经上传的*软件产品的架构分析,本群资料仅供研究学习,不得商用!!!
google 、
eBay、
Youtube、
淘宝等
......
技术文章包括:
《自己动手写操作系统》
《搜索引擎-原理、技术与系统》
《企业应用架构模式》
......
重要的RUP实例
设计模式精解
......
资料陆续上传中
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞

#1


这个黑色区域是叠加在源图层上面的吧
如果这个区域是个圆的话,不是很好计算吗?

不规则图形,那就要有特定的算法了

#2


网上搜索一下

#3


可以用matlab吧,这样方便很多

一句话就可以读入

但后就全图片扫描,可以获取的

#4


一个个像素扫描,看这点的着色值为黑色就加一~~~

#5


可以啊 ~~~有没有程序啊?

#6


有没有程序啊?急需程序啊~~~

#7


扫描线填充算法和区域填充算法

#8


参考以下
#include <graphics.h>
#include <math.h>

#define SCREENX 80
#define SCREENY 80
   
/* 矩阵变换函数---------------------------------------------------------- */
   
/* 生成绕x轴旋转theta角的矩阵Rx */
void matRx(float Rx[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Rx[i][j]=0;
   Rx[0][0]=1; Rx[3][3]=1;
   Rx[1][1]=cos(theta);
   Rx[1][2]=sin(theta);
   Rx[2][1]=-sin(theta);
   Rx[2][2]=cos(theta);
}

/* 生成绕y轴旋转theta角的矩阵Ry */
void matRy(float Ry[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Ry[i][j]=0;
   Ry[1][1]=1;  Ry[3][3]=1;
   Ry[0][0]=cos(theta);
   Ry[0][2]=-sin(theta);
   Ry[2][0]=sin(theta);
   Ry[2][2]=cos(theta);
}

/* 生成绕z轴旋转theta角的矩阵Rz */
void matRz(float Rz[4][4],float theta)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Rz[i][j]=0;
   Rz[2][2]=1;  Rz[3][3]=1;
   Rz[0][0]=cos(theta);
   Rz[0][1]=sin(theta);
   Rz[1][0]=-sin(theta);
   Rz[1][1]=cos(theta);
}

/* 生成平移(tx,ty,tz)的矩阵Txyz */
void matTxyz(float Txyz[][4],float tx,float ty,float tz)
{
   int i,j;
   for(i=0;i<4;i++)
       for(j=0;j<4;j++)
          Txyz[i][j]=0;
   Txyz[0][0]=1; Txyz[1][1]=1;  Txyz[2][2]=1;  Txyz[3][3]=1;
   Txyz[3][0]=tx; Txyz[3][1]=ty; Txyz[3][2]=tz; 
}

/* 矩阵相乘 R=A*B */
void MatMul(float R[][4],float A[][4],float B[][4])
{
   int i,j,k;
   float AA[4][4],BB[4][4];
   for(i=0;i<4;i++) {
      for(j=0;j<4;j++) {
         AA[i][j] = A[i][j]; BB[i][j] = B[i][j]; 
      }
   }
  
   for(i=0;i<4;i++) {
      for(j=0;j<4;j++) {
         R[i][j] = 0;  /* float (*R)[4],  *(*(R+i)+j) = 0; */
         for(k=0;k<4;k++)
            R[i][j] = R[i][j]+ AA[i][k]*BB[k][j];
      }
   }
}

/* 向量与矩阵相乘 R=Vector*Mat */
void MVMul(float R[],float Vector[],float Mat[][4])
{
   int i,j,k;
   for(i=0;i<3;i++) {
      R[i] = 0;
      for(j=0;j<3;j++) 
         R[i] = R[i] + Vector[j] * Mat[j][i];
      R[i] = R[i] + Mat[3][i];
   }
}


/* 排序,求交等公用函数---------------------------------------------------------- */

/* 从小到大排序 */
void sort(float a[],int n)
{
   int i,j,k;
   float temp;
   for (i=0;i<n;i++){
      k=i;
      for (j=i+1;j<n;j++)
         if (a[j]<a[k])
            k=j;
      temp = a[i];
      a[i]=a[k];
      a[k]=temp;
   }
}

/* 求扫描线与边AB的交点,如果无交点,返回-1 */
float linejoin(float A[3],float B[3],int y)
{
   float t;
   if (B[1]==A[1])
      return -1;
   
   t = (y-A[1]) / (B[1]-A[1]);
   if (t>=0 && t<=1){
      return A[0] + (B[0]-A[0])*t;
   }else
      return -1;
}

/* 向量的点乘 */
float dot(float A[3],float B[3]){
   return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]);
}

/* 向量的叉乘 */
void cross(float R[3],float A[3],float B[3]){
   R[0] = A[1]*B[2] - A[2]*B[1];
   R[1] = A[2]*B[0] - A[0]*B[2];
   R[2] = A[0]*B[1] - A[1]*B[0];
}

/* 求平面P(u,w)=A+uB+wC与直线Q(t)=D+tE的交点R */
int facejoin(float R[3],float A[3],float B[3],float C[3],float D[3],float E[3])
{
   float Temp[3],t;

   cross(Temp,B,C);
   
   if (dot(Temp,E)==0)
      return -1;
   
   t = (dot(Temp,A)-dot(Temp,D)) / dot(Temp,E);
   
   R[0] = D[0] + t*E[0];
   R[1] = D[1] + t*E[1];
   R[2] = D[2] + t*E[2];
   return 1;
}

/* 复制两个向量R=A */
void copyvertex(float R[3],float A[3])
{
  R[0]=A[0];R[1]=A[1];R[2]=A[2];
}

/* 扫描线填充算法---------------------------------------------------------- */
/* 用扫描线算法用颜色c填充由vertex顶点序列定义的多边形区域 */
/* 为了与其它三维点坐标传递参数,这里也统一改用空间点的坐标,而不用float vertex[][2] */
/* 用深度缓存算法进行面消隐 */
void linefill(float vertex[][3],int n,int c,float ZB[][SCREENY],int beginx,int beginy)
{
   int i,j,k,x,y,miny,maxy;
   float A[3],B[3],C[3],D[3],E[3],R[3],temp,join[10];
   
   setcolor(c);
   
   /* 计算该多边形的平面方程P(u,w)=A+uB+wC,直线方程Q(t)=(x0,y0,0)+(0,0,1)t */
   for (i=0;i<3;i++) {
      A[i]=vertex[0][i];
      B[i]=vertex[1][i]-vertex[0][i];
      C[i]=vertex[2][i]-vertex[0][i];
      
      D[i] = 0;
      E[i] = 0;
   }
   D[2]=0;
   E[2]=1;

   
   /* 找出y坐标最大和最小的顶点 */
   miny=vertex[0][1];maxy=vertex[0][1];
   for (i=0;i<n;i++){
      if (vertex[i][1]<miny)
         miny=vertex[i][1];
      if (vertex[i][1]>maxy)
         maxy=vertex[i][1];
   }
   
   /* 使扫描线从y坐标最小的递增1到y最大的顶点 */
   for (y=miny;y<=maxy;y++){
      
      /* 求当前扫描线与每条边的交点 */
      j=-1;
      for (i=0;i<n;i++) {
         if (y==vertex[(i+1)%n][1]) /* 交点在边的端点 */
            if ((vertex[(i+1)%n][1]-vertex[i][1])*(vertex[(i+1)%n][1]-vertex[(i+2)%n][1])<0) /* 如果是左右顶点,交点算一个 */
               continue;

         temp = linejoin(vertex[i],vertex[(i+1) % n],y);
         if (temp!=-1){
            j++;
            join[j] = temp;
            
         }
      }
      
      /* 交点排序,填充交点间的扫描线段 */
      sort(join,j+1);
      
      for (k=0;k<=j/2;k++){
         /* line(join[2*k],y,join[2*k+1],y); */
         
          for (x=join[2*k];x<=join[2*k+1];x++) {
              D[0]=x; D[1]=y;
              if (facejoin(R,A,B,C,D,E)){ /* 计算平面区域在(x,y)点的深度值R[2] */
                  if (R[2]>ZB[x-beginx][y-beginy]){
                      putpixel(x,y,c);
                      ZB[x-beginx][y-beginy] = R[2];
                  }
              }
          }
          
      }
   }
}
/* --------------------------------------------------------- */


#9


/* 把数据显示在屏幕上 */
void draw(float vertex[][3],int c)
{

   int i,j,minx,miny,c1=RED,c2=YELLOW,c3=BLUE,c4=CYAN,c5=WHITE,c6=GREEN;
   float ZB[SCREENX][SCREENY];
   float thevertex[4][3];
   
   /* 初始化深度缓存数组 */
   for (i=0;i<SCREENX;i++)
      for (j=0;j<SCREENY;j++)
         ZB[i][j] = -1000;
   
   setcolor(c);
   
   /* 画正方体的12条边 */
   moveto(vertex[3][0],vertex[3][1]);
   for (i=0;i<4;i++)
      lineto(vertex[i][0],vertex[i][1]);
   moveto(vertex[7][0],vertex[7][1]);
   for (i=4;i<8;i++)
      lineto(vertex[i][0],vertex[i][1]);
   for (i=0;i<4;i++)
      line(vertex[i][0],vertex[i][1],vertex[i+4][0],vertex[i+4][1]);
   
   /* 找出x,y坐标最小的顶点 */
   minx=vertex[0][0];miny=vertex[0][1];
   for (i=0;i<8;i++){
      if (vertex[i][0]<minx)
         minx=vertex[i][0];
      if (vertex[i][1]<miny)
         miny=vertex[i][1];
   }
   minx--;miny--;
 
   if (c==BLACK) {c1=BLACK;c2=BLACK;c3=BLACK;c4=BLACK;c5=BLACK;c6=BLACK;}
   
   linefill(vertex,4,c1,ZB,minx,miny);
   linefill(&vertex[4],4,c2,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[0]);
   copyvertex(thevertex[1],vertex[1]);
   copyvertex(thevertex[2],vertex[5]);
   copyvertex(thevertex[3],vertex[4]);
   linefill(thevertex,4,c3,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[0]);
   copyvertex(thevertex[1],vertex[3]);
   copyvertex(thevertex[2],vertex[7]);
   copyvertex(thevertex[3],vertex[4]);
   linefill(thevertex,4,c4,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[2]);
   copyvertex(thevertex[1],vertex[3]);
   copyvertex(thevertex[2],vertex[7]);
   copyvertex(thevertex[3],vertex[6]);
   linefill(thevertex,4,c5,ZB,minx,miny);
   
   /* 复制生成一个面的四个顶点坐标,并进行填充 */
   copyvertex(thevertex[0],vertex[1]);
   copyvertex(thevertex[1],vertex[2]);
   copyvertex(thevertex[2],vertex[6]);
   copyvertex(thevertex[3],vertex[5]);
   linefill(thevertex,4,c6,ZB,minx,miny);
   
}

/* 主函数--------------------------------------------------------- */
main()
{
   int i,j;
   float vertex[][3]={{280,0,20},{280,40,20},{320,40,20},{320,0,20},{280,0,-20},{280,40,-20},{320,40,-20},{320,0,-20}};
   float pvertex[8][3]; /* 旋转变换之后的新坐标 */

   float Rx[4][4],Ry[4][4],Rz[4][4],R[4][4],Txyz[4][4]; /* 旋转平移变换矩阵 */
   float theta;
   
   void matRx(),matRy(),matTxyz(),MatMul(),MVMul(),draw();

  int driver=DETECT,mode;  
  registerbgidriver(EGAVGA_driver);
  initgraph(&driver,&mode,"");
   
   /* 整个场景绕x轴旋转theta角度(也可看作是坐标轴旋转-theta角度),使得z轴的方向和视线方向相同 */
   theta = 3.14/3;
   matRx(Rx,theta);
   
   /* 不断循环动画,直到敲击了一下键盘 */
   while (!kbhit()) { 

      theta = theta + 0.1;
      if (theta>6.28)
         theta = 0;

      /* 正方体绕z轴公转theta角度 */
      matRz(Rz,theta);

      MatMul(R,Rz,Rx);
   
      /* 以 (300,240,0) 为中心(固定点)旋转 */
      matTxyz(Txyz,-300,-240,0);
      MatMul(R,Txyz,R);
      matTxyz(Txyz,300,240,0);
      MatMul(R,R,Txyz);

      /* 进行坐标变换 */
      for (i=0;i<8;i++)
         MVMul(pvertex[i],vertex[i],R);
      
      /* 清楚屏幕,画出新的图形 */
      clearviewport();
      draw(pvertex,WHITE);
      
      /* 延迟速度 sleep(1);*/
      for (i=0;i<500;i++) {
         /* 在中心画个圆并用红色填充(太阳) */
         setcolor(WHITE);
         circle(300,240,20);
         setfillstyle(1,RED);
         floodfill(300,240,WHITE);
      }

      getch();
      /* draw(pvertex,BLACK); 用背景色擦掉刚才所画的所有图形,下一轮循环再在新的地方画图,实现动画 */
      
   }

   getch();
   
   closegraph();
}

#10


楼上的....厉害.
我只能想到一个一个象素遍历

#11


嗯,不错!
学习了

#12



∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞

力争成为中国最大的架构师群联盟,架构师技术交流群:62402336正式开放!!!

已经上传的*软件产品的架构分析,本群资料仅供研究学习,不得商用!!!
google 、
eBay、
Youtube、
淘宝等
......
技术文章包括:
《自己动手写操作系统》
《搜索引擎-原理、技术与系统》
《企业应用架构模式》
......
重要的RUP实例
设计模式精解
......
资料陆续上传中
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞