图形学,计算机图形学,C语言

  • n0_576111
    了解作者
  • 45.6KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-14 05:00
    上传日期
里面包含了计算机图形学的一些经典的例子,如画点,画线,画二维图,三维图,图的反转等。希望能你们一起分享。 里面是用C语言编写。
计算机图形学.zip
  • 计算机图形学
  • CCurve.c
    23.2KB
  • C2D.c
    30.2KB
  • C3D.c
    106.2KB
  • CClip.c
    16.9KB
  • cline.h
    2.1KB
内容介绍
/******************************* 三维变换和投影算法演示程序——球面和马鞍面 线图 1、功能: 假定已知n个点P0(X0,Y0,Z0),P1(X1,Y1,Z1),..., Pn-1(Xn-1,Yn-1,Zn-1), 构成的三维空间物体,将其进行投影在屏幕显示,并进行平移、缩放、旋转、对称、错切变换。 2、编程运行环境:Turbo C2.0 屏幕DOS图形模式(640X480,16色) 调用Turbo c的图形库putpixel画点函数, 需要文件EGAVGA.BGI支持 3、要求掌握平移、缩放、旋转、三视图、透视投影、凸多面体消隐算法。 正轴测投影和斜平行投影不必掌握。 /*******************************/ #include <stdio.h> #include <math.h> #include <graphics.h> #include <CLine.h> /*键盘按键值,用于交互式作图。*/ #define ESC 0x011B #define LEFT 0x4B00 #define RIGHT 0x4D00 #define UP 0x4800 #define DOWN 0x5000 #define HOME 0x4700 #define END 0x4F00 #define PGUP 0x4900 #define PGDN 0x5100 #define CTRL_LEFT 0x7300 #define CTRL_RIGHT 0x7400 #define INSERT 0x5200 #define DELETE 0x5300 #define C_HOME 0x7700 #define C_END 0x7500 #define C_PGUP 0x8400 #define C_PGDN 0x7600 #define F1 0x3B00 #define F2 0x3C00 #define F3 0x3D00 #define F4 0x3E00 #define F5 0x3F00 #define F6 0x4000 #define F7 0x4100 #define F8 0x4200 #define F9 0x4300 #define F10 0x4400 #define CTRL_F1 0x5e00 #define CTRL_F2 0x5f00 #define CTRL_F3 0x6000 #define CTRL_F4 0x6100 #define CTRL_F5 0x6200 #define CTRL_F6 0x6300 #define CTRL_F7 0x6400 #define CTRL_F8 0x6500 #define CTRL_F9 0x6600 #define CTRL_F10 0x6700 /*屏幕分辨率尺寸*/ #define XMAX 640 #define YMAX 480 #define POINTCOUNT 1100 /*凸多面体最多顶点数,用于球体、马鞍面,Sierpinski海棉*/ /*#define POINTCOUNT 200 /*凸多面体最多顶点数,用于简单凸多面体*/ /*#define PI 3.14159*/ double PI; /*定义一个全局变量,使用PI=4*atan(1.0);这样算出的π更精确些。tgπ/4=1,所以π/4= Arc tg(1.0) */ /******************************* 多边形填充函数myfill1:扫描线算法,用于填充多面体的表面。 /*******************************/ typedef struct aet{ float x;/*当前扫描线与边的交点坐标x值*/ float delta_x;/*当前扫描线到下一条扫描线x的增量Δx*/ int ymax;/*该边端点y最大值,即它所交的最高扫描线号*/ struct aet *next;/*指向下一个结点的指针*/ }AET; void myfill1(int px[],int py[],int n, int fcolor){ /*fcolor填充色*/ int i,start,l,h; int scan_count, scan_no; AET *q,*r,*s,**net,*aet; int x1,y1,x2,y2; int p_ymin,p_ymax; /*步骤1:求出p_ymin和p_ymax*/ /*多边形顶点y坐标的最小和最大值p_ymin和p_ymax。*/ p_ymin=py[0]; p_ymax=py[0]; for(i=1;i<n;i++){ /*检查多边形的每一条边,计算p_ymin和p_ymax。*/ if(p_ymin>py[i])p_ymin=py[i]; if(p_ymax<py[i])p_ymax=py[i]; } /*计算扫描线数量scan_count。 扫描线号从p_ymin到p_ymax,一共有p_ymax-p_ymin+1条扫描线*/ scan_count=p_ymax-p_ymin+1; /*步骤2:构造net表。*/ /*建立所有扫描线的新边表(NET表), 每个结点结构与AET表一样。所有NET表头指针,放在一个 数组net中第i号扫描线放在net[i-p_ymin]所指向的链表中*/ net=(AET **)malloc(scan_count*sizeof(AET *)); if(net==NULL){printf("myfill1 malloc error.");return;} for(i=0;i<scan_count;i++){ net[i]=NULL; }/*for*/ /*构造net表组*/ for(i=0,start=0;i<n;i++){ /*检查多边形的每一条边,制作其对应的结点,并插入到net中*/ if(i>start && px[i]==px[start] && py[i]==py[start]){ /*封闭线*/ start=i+1; continue; } /* 结点结构如下: ┏━┳━━┳━━┳━━┓ ┃x ┃Δx ┃ymax┃next┃ ┗━┻━━┻━━┻━━┛ */ /*求出边的低端和高端下标l,h*/ if(py[i] < py[i+1]){/*斜边l和h由y坐标来定*/ l= i; h=i+1; } else { l= i+1; h=i; } if(py[l]<py[h]){ /*斜边处理,新建立一个结点q。水平边处理,不建立结点*/ q=(AET *)malloc(sizeof(AET)); if(q==NULL){printf("myfill1 malloc error.");return;} q->x=px[l]; q->delta_x=(float)(px[i]-px[i+1])/(py[i]-py[i+1]); q->ymax=py[h]; q->next=net[py[l]-p_ymin];/*插入q到net[py[l]-p_ymin]表头*/ net[py[l]-p_ymin]=q; } }/*for*/ /*打印net链表组,调试用*/ /*for(i=0;i<scan_count;i++){ if(net[i]==NULL)continue; q=net[i]; printf("\ni=%d ",i); while(q!=NULL){ printf("%f,%f,%d->",q->x,q->delta_x,q->ymax); q=q->next; } }/*for*/ /*步骤3:表aet的初值是空*/ aet=NULL; /*步骤4:循环处理每一条扫描线。*/ for (i = 0; i < scan_count; i++) { /*计算当前扫描线号*/ scan_no = i+p_ymin; /*步骤5:遍历aet画线 遍历表aet,进行交点配对:第一个和第二个,第三个 和第四个,...每对交点表示扫描线与多边形的一个相 交区域,染成填充色。 */ q=aet; /*q从aet表头指针开始*/ /*打印aet表,调试用*/ /*printf("\n%d ",scan_no);*/ while( q != NULL ){ /*打印aet表,调试用*/ /*printf("%f,%f,%d->",q->x,q->delta_x,q->ymax);*/ x1=q->x+1; /*x1不要四舍五入*/ /*q指向下一个结点*/ if(q->next!=NULL)q=q->next; /*打印aet表,调试用*/ /*printf("%f,%f,%d->",q->x,q->delta_x,q->ymax);*/ x2=q->x-1+0.5;/*x2要四舍五入*/ if(x1<=x2)myline5(x1,scan_no,x2,scan_no,fcolor,XY); q=q->next; } /*步骤6:更新aet表,做两件事情: 一是删除ymax等于当前扫描线号的结点(ymax==scan_no), 因为以后的扫描线不会与这些结点对应的边相交。 二是将ymax大于当前扫描线号的结点(ymax>scan_no)的 结点的x增加Δx,新x是下一条扫描线与该边交点的x坐标。 */ q=aet; s=NULL; /*q从aet表头指针开始,保持s是q的前驱。*/ while( q != NULL ){ /*在aet表中删除ymax==scan_no的线结点,并更新ymax>scan_no结点的x值 */ if( q->ymax==scan_no){ /*删除q*/ if(s==NULL){ /*q是aet第一个结点 aet ——→┐ ↓删前 ↓删后 ┏━┳┓ ┏━┳┓ ┃ ┃┃ →┃ ┃┃→... ┗━┻┛ ┗━┻┛ ↑ q */ aet=q->next; free(q); q=aet;/*q继续前进,保持s是q的前驱,此时s==NULL*/ } else{ /*q在aet中间 s ↓ ┌→——————→┐ ┏━┳┓ ┏━┳┓ ┏━┳┓ ┃ ┃┃-X→┃ ┃┃→┃ ┃┃ →... ┗━┻┛ ┗━┻┛ ┗━┻┛ ↑(回收) q */ s->next=q->next; free(q); q=s->next;/*q继续前进,保持s是q的前驱*/ } } else if( q->ymax > scan_no ){ /*更新q->x。*/ q->x = q->x + q->delta_x; s=q; q=q->next;/*q继续前进,保持s是q的前驱*/ } }/*while(q!=NULL)结束*/ /*步骤7:将net[i]链表结点按x递增顺序搬到aet表中 。 如果x值相等,则按delta_x递增顺序。*/ while (net[i] != NULL){ /*q指向net表中结点,先将q从net表组中删除*/ q=net[i]; net[i]=q->next; q->x+=q->delta_x; /* 注意搬进来后x马上加上Δx,这叫“下闭上开”。因为 与该边相交的第一条扫描线前面已经画过了,不必再画。*/ /*遍历aet,找到q可以插入的合适位置。 r和s指向aet表中结点,保持s是r的前驱。 */ r=aet;s=NULL; while (r != NULL){ if( r->x < q->x || r->x == q->x && r->delta_x < q->delta_x) { /*按x递增顺序,如果x值相等,则按delta_x递增顺序。*/ s=r;r=r->next; } else break; } if (s == NULL){ /*插入在aet表头 r ↓ ┏━┳┓ aet -╳→┃ ┃┃ ┗━┻┛ ↓ ↗ ┏━┳┓ q→ ┃ ┃┃ q插入在aet之后,插入前先从net中删除。 ┗━┻┛ */ q->next=aet; aet=q; } else{ /*插入在aet中间 s r ↓ ↓ ┏━┳┓ ┏━┳┓ ┃ ┃┃-╳→┃ ┃┃ ┗━┻┛ ┗━┻┛ ↓ ↗ ┏━┳┓ q→ ┃ ┃┃ q插入在s之后,插入前先从net中删除。 ┗━┻┛ */ q->next=s->next; s->next=q; } }/*while(net[i]!=NULL)结束*/ }/*for (i)*/ /*aet表结点已经全部删除释放*/ free(net);/*释放net数组,其中链表结点已经全部搬走。*/ } /******************************* 浮点矩阵相乘函数DMulMatrix: /*******************************/ void DMulMatrix(double A[][4],double B[],double C[]){ /*计算矩阵A[4][
评论
    相关推荐
    • 谭浩强C语言
      这是谭浩强C语言的新版,有兴趣想学C语言的童鞋们可以下载来看看啊!
    • C语言 实现
      C语言 项目实现 《计算方法》课件 俄罗斯方块游戏 C语言实训 综合案例-学生成绩管理程序 C语言程序设计学习与实践指导(源代码)
    • 水滴石穿C语言
      学习C语言的有用文档 水滴石穿C语言C语言的底层操作 水滴石穿C语言之extern声明辨析 水滴石穿C语言之static辨析 水滴石穿C语言之typedef的问题 水滴石穿C语言之编译器引出的问题 水滴石穿C语言之代码检查工具 ...
    • C语言精讲
      初学者必看,让你轻松学会c语言,课程详细,内容丰富
    • 谭浩强c语言
      谭浩强c语言,国内最权威的c语言学习宝典,从零基础开始,成为c语言高手。
    • Makefile c语言
      Makefile c语言Makefile c语言Makefile c语言Makefile c语言 四本资料!自己学习的时候整理的!
    • C语言 课件
      此文件是小甲鱼c语言的 第四章 分支结构程序(课件).rar )
    • c语言
      C语言电子课件 简单易懂 清楚明了 希望让每一个学它的人都有所收获 。
    • c语言
      c语言
    • C语言
      C语言