正如上面图片上的黑色区域一样~我想求出这个区域内部的像素点的个数!!!
希望哪位大哥帮我写个程序啊~~~帮帮忙啊~~~~
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实例
设计模式精解
......
资料陆续上传中
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞