图形学实验报告

合集下载

图形学实验报告

图形学实验报告

学院:计算机学院实验课程:计算机图形学实验项目:制作一个绘图界面开课时间:2015 ~2016年度第1学期指导老师:杨晋吉专业:计算机科学与技术(师范)华南师范大学教务处一、实验目的利用计算机编程语言绘制图形,主要实现了以下内容:(1)画线(2)画圆(3)画多边形(矩形和圆角矩形)(4)填充(5)变换(平移、旋转、比例变换)二、实验环境Windows 8.0 操作系统,NetBean6.5,Java语言三、实验过程(1)窗口界面功能JFrame类JToolBar类工具栏MouseAdapter类鼠标位置显示JPanel类画图区域JLabel类标签栏(2)菜单栏可实现功能(3)画画区域内可实现功能菜单栏 Help 帮助 Stroke 粗细File (文件) Color 颜色 New (更新) Save (保存)Load (下载)Exit (退出)四、各功能实现算法及截图1)Pencil类-随笔画算法:class Pencil extends drawings//随笔画类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:2)Line类-画直线算法:class Line extends drawings //直线类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);System.out.println(" Line ");}}截图:3)Rect类-画矩形算法:class Rect extends drawings//矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:4)RoundRect类-画圆角矩形算法:class RoundRect extends drawings//圆角矩形类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2),50, 35);System.out.println(" RoundRect ");}}截图:5)Oval类-画椭圆算法:class Oval extends drawings//椭圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1 - x2), Math.abs(y1 - y2));}}截图:6)Circle类-画圆算法:class Circle extends drawings//圆类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(R, G, B));g2d.setStroke(new BasicStroke(stroke));g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));}}截图:7)橡皮擦算法:class Rubber extends drawings//橡皮擦类{void draw(Graphics2D g2d) {g2d.setPaint(new Color(255, 255, 255));g2d.setStroke(new BasicStroke(stroke + 4,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x1, y1, x2, y2);}}截图:8)填充算法:int tu[][] ;public void setColor(int x, int y,Graphics2D g2d){Color newColor = new Color(R,G,B);g2d.setPaint(newColor);g2d.setStroke(new BasicStroke(stroke,BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));g2d.drawLine(x, y, x, y);tu[x][y] = get(newColor);System.out.println("tu"+tu[x][y]);// g2d.drawLine(x, y, x+1, y);//g2d.drawLine(x, y, x, y+1);// g2d.drawLine(x, y, x+1, y+1);}public void floodFill8(int x, int y,int newColor,int oldColor,Graphics2D g2d,Point s){int haColor = getpixel(x,y,s);if( tu[x][y] == newColor)haColor =newColor;if(x >= 0 && x < 1024 && y >= 0 && y < 980 && (haColor == oldColor) && haColor != newColor){System.out.println("进来了");System.out.println("S x "+x+" y "+y+" "+newColor);setColor(x, y, g2d);floodFill8(x + 1, y,newColor, oldColor, g2d,s);floodFill8(x - 1, y,newColor, oldColor, g2d,s);floodFill8(x, y + 1, newColor, oldColor, g2d,s);floodFill8(x, y - 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y - 1, newColor, oldColor, g2d,s);// floodFill8(x - 1, y + 1, newColor, oldColor, g2d,s);// floodFill8(x + 1, y - 1, newColor, oldColor, g2d,s);}}int getpixel(int x,int y,Point a){//获得当前坐标颜色信息Robot rb = null; //java.awt.image包中的类,可以用来抓取屏幕,即截屏。

图形学实验报告

图形学实验报告

计算机图形学实验报告直线的生成程序设计:实验目的:掌握直线段的生成算法, 并用C/WIN-TC/VC++实现算法, 包括中点法生成直线, 微分数值法生成直线段等。

实验内容:用不同的方法生成斜率不同的直线段, 比较各种方法的效果。

/////////////////////////////////////////////////////////////////////////////// CLineView drawingvoid DDALine(int x1,int y1,int x2,int y2,int color,CDC*pDC)//数值微分法{int x;int k,y=y1;k=1.0*(y2-y1)/(x2-x1);for(x=x1;x<=x2;x++){pDC->SetPixel(x,(int)(y+0.5),color);y=y+k;}}void MPLine(int x1,int y1,int x2,int y2,int color,CDC*pDC)//中点画线法{int x,y,a,b,d,d1,d2;a=y1-y2; b=x2-x1;y=y1;d=2*a+b; d1=2*a; d2=2*(a+b);pDC->SetPixel(x,y,color);for(x=x1;x<=x2;x++){if(d<0) { y++; d+=d2;}else {d+=d1;}pDC->SetPixel(x,y,color);}}void BHLine(int x1,int y1,int x2,int y2,int color,CDC*pDC)//Bresenham画线法{int x,y,dx,dy,dk;dx=abs(x2-x1);dy=abs(y2-y1);dk=2*dy-dx;y=y1;for(x=x1;x<=x2;x++){pDC->SetPixel(x,y,color);dk=dk+2*dy;if(dk>=0){ y++; dk=dk-2*dx;}}}void CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);DDALine(100,100,200,70,255,pDC);//数值微分法pDC->TextOut(200,70,"数值微分画线");MPLine(100,120,200,140,255,pDC);//中点画线法pDC->TextOut(200,140,"中点画线");BHLine(100,140,200,190,255,pDC);//Bresenham画线法pDC->TextOut(200,190,"Bresenham画线法");// TODO: add draw code for native data here}运行结果:2.圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC++实现算法, 圆的生成算法实验内容: 用中点画圆法、Bresenham画圆法/////////////////////////////////////////////////////////////////////////////// CCircleView drawingvoid WholeCircle(int xc,int yc,int x,int y,int color,CDC*pDC){pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc-x,yc+y,color);pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x,yc-y,color);pDC->SetPixel(xc+y,yc+x,color);pDC->SetPixel(xc-y,yc+x,color);pDC->SetPixel(xc+y,yc-x,color);pDC->SetPixel(xc-y,yc-x,color);}void MidCircle(int xc,int yc,int r,int color,CDC*pDC )//中点画圆法{int x,y,d;x=0;y=r;d=1-r;WholeCircle(xc,yc,x,y,color,pDC);while(x<=y){if(d<0){ d+=2*x+3;x++;}else{ d+=2*(x-y)+5;x++; y--;}WholeCircle(xc,yc,x,y,color,pDC);}WholeCircle(xc,yc,x,y,color,pDC);}void BresenhamCircle(int xc,int yc,int r,int color,CDC*pDC)//Bresenham画圆法{ int x,y,d;x=0; y=r;d=3-2*r;while(x<y){WholeCircle(xc,yc,x,y,color,pDC);if(d<0)d=d+4*x+6;else{d=d+4*(x-y)+10;y--;}x++;}if(x==y) WholeCircle(xc,yc,x,y,color,pDC);}void CCircleView::OnDraw(CDC* pDC){CCircleDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);MidCircle(100,100,70,255,pDC);//中点画圆法pDC->TextOut(175,100,"中点画圆法");BresenhamCircle(100,250, 80, 255,pDC);//Bresenham画圆法pDC->TextOut(185,250,"Bresenham画圆法");// TODO: add draw code for native data here}运行结果:3.椭圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC++实现算法, 椭圆的生成算法实验内容: 实现椭圆的算法// CMPEllipseView drawingvoid WholeEllipse(int xc,int yc,int x,int y,int color,CDC*pDC) {pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x,yc+y,color);pDC->SetPixel(xc-x,yc-y,color);}void MidEllipse(int xc,int yc,int a,int b,int color,CDC*pDC) {int aa=a*a, bb=b*b;int twoaa=2*aa, twobb=2*bb;int x=0, y=b;int dx=0, dy=twoaa*y;int d=(int)(bb+aa*(-b+0.25)+0.5);WholeEllipse(xc,yc,x,y,color,pDC);while(dx<dy){x++; dx+=twobb;if(d<0)d+=bb+dx;else{ y--;dy-=twoaa;d+=bb+dx-dy;}WholeEllipse(xc,yc,x,y,color,pDC);}d=(int)(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb+0.5);while(y>0){y--; dy-=twoaa;if(d>0)d+=aa-dy;else{ x++;dx+=twobb; d+=aa-dy+dx; }WholeEllipse(xc,yc,x,y,color,pDC);}}void CMPEllipseView::OnDraw(CDC* pDC){CMPEllipseDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);MidEllipse(200,100,100,50,255, pDC);pDC->TextOut(305,100,"中点画椭圆法");// TODO: add draw code for native data here }运行结果:4.有序边表填充算法程序设计实验目的:掌握用C/WIN-TC/VC++实现算法, 有序边生成算法实验内容: 实现有序边填充算法代码如下:#define WINDOW_HEIGHT 480#define NULL 0typedef struct tEdge /* 有序便表和活化边表的结构 */ {int ymax;float x,dx;struct tEdge *next;} Edge;typedef struct point{int x,y;} tPOINT;void InsertEdge(Edge *list,Edge *edge){Edge *p,*q = list;p = q->next;while(p){if (edge->x < p->x){p = NULL;}else{q = p;p = p->next;}}edge->next = q->next;q->next = edge;}int yNext(int k,int cnt,tPOINT *pts){int j;if ((k+1)>(cnt-1)){j = 0;}else{j = k+1;}while(pts[k].y == pts[j].y){ if ((j+1) > (cnt-1)){ j = 0;}else{ j++;}}return pts[j].y;}void MakeEdgeRec(tPOINT lower,tPOINT upper,int yComp,Edge *edge,Edge *edges[]) /* 生成有序边表的一条边 */{edge->dx = (float)(upper.x - lower.x)/(upper.y - lower.y);edge->x = lower.x;if (upper.y < yComp){edge->ymax = upper.y - 1;}else{edge->ymax = upper.y;}InsertEdge(edges[lower.y],edge);}void BuildEdgeList(int cnt,tPOINT *pts,Edge *edges[]){ Edge *edge;tPOINT v1,v2;int i,yPrev = pts[cnt-2].y;v1.x = pts[cnt-1].x;v1.y = pts[cnt-1].y;for (i = 0;i < cnt;i++){v2 = pts[i];if (v1.y != v2.y){edge = (Edge *)malloc(sizeof(Edge)); /* C语言中的malloc */if (v1.y < v2.y){MakeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);}else{MakeEdgeRec(v2,v1,yPrev,edge,edges);}yPrev = v1.y;v1 = v2;}}}void BuildActiveList(int scan,Edge *active,Edge *edges[]){Edge *p,*q;p = edges[scan]->next;while (p){q = p->next;InsertEdge(active,p);p = q;}}void FillScan(int scan,Edge *active,int color,CDC *pDC){int i;Edge *p1,*p2;p1 = active->next;while(p1){p2 = p1->next;for (i = p1->x;i < p2->x;i++){pDC->SetPixel((int)i,scan,color);}p1 = p2->next;}}void DeletAfter(Edge *q){Edge *p = q->next;q->next = p->next;free(p);}void UpdateActiveList(int scan,Edge *active){Edge *q = active,*p = active->next;while(p){if (scan >= p->ymax){p = p->next;DeletAfter(q);}else{p->x = p->x + p->dx;q = p;p = p->next;}}}void ResortActiveList(Edge *active){Edge *q,*p = active->next;active->next = NULL;while(p){q = p->next;InsertEdge(active,p);p = q;}}void ScanFill(int cnt,tPOINT *pts,int color,CDC *pDC) {Edge *edges[WINDOW_HEIGHT],*active;int i,scan,scanmax = 0,scanmin = WINDOW_HEIGHT;for (i = 0;i < cnt-1;i++){if (scanmax < pts[i].y){scanmax = pts[i].y;}if (scanmin > pts[i].y){scanmin = pts[i].y;}}for (scan = scanmin;scan <= scanmax;scan++){edges[scan] = (Edge *)malloc(sizeof(Edge));edges[scan]->next = NULL;}BuildEdgeList(cnt,pts,edges);active = (Edge *)malloc(sizeof(Edge));active->next = NULL;for (scan = scanmin;scan <= scanmax;scan++){BuildActiveList(scan,active,edges);if (active->next){FillScan(scan,active,color,pDC);UpdateActiveList(scan,active);ResortActiveList(active);}}}CFillView::CFillView(){// TODO: add construction code here}CFillView::~CFillView(){}BOOL CFillView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CFillView drawingvoid CFillView::OnDraw(CDC* pDC){CFillDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data heretPOINT points[3]={{100,80},{300,100},{300,260}};tPOINT *p = points;int color = RGB(255,2,0);ScanFill(3,p,color,pDC);}运行结果:8.Cohen-SutherLand编码裁剪算法程序设计#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8typedef struct point { int x,y;} POINT1;void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT,CDC *pDC) {int c=0;if(x<XL) c=c|LEFT;else if(x>XR) c=c|RIGHT;if (y<YB) c=c|BOTTOM;else if (y>YT) c=c|TOP;(*code)=c;}void C_S_Line(POINT p1,POINT p2,int XL,int XR,int YB,int YT,CDC *pDC) {int x1,x2,y1,y2,x,y;int code1,code2,code;x1=p1.x;x2=p2.x;y1=p1.y;y2=p2.y;Encode(x1,y1,&code1,XL,XR,YB,YT,pDC);Encode(x2,y2,&code2,XL,XR,YB,YT,pDC);while(code1!=0 || code2!=0){if ((code1 & code2) !=0) return;code=code1;if (code1==0) code=code2;if ((LEFT & code) !=0){x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}else if((RIGHT & code)!=0){x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);}else if((BOTTOM & code) != 0){y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);}else if((TOP & code)!=0){y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);}if(code==code1){x1=x; y1=y;Encode(x,y,&code1,XL,XR,YB,YT,pDC);}else{x2=x; y2=y;Encode(x,y,&code2,XL,XR,YB,YT,pDC);}}p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2;pDC->MoveTo(p1.x,p1.y);pDC->LineTo(p2.x,p2.y);}void CCohenView::OnDraw(CDC* pDC){CCohenDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);POINT p1,p2,p3,p4,p5,p6,p7,p8;p1.x=35;p1.y=160;p2.x=245;p2.y=121;p3.x=120;p3.y=60;p4.x=200;p4.y=300;p5.x=169;p5.y=45;p6.x=150;p6.y=200;p7.x=120;p7.y=200;p8.x=220;p8.y=130;pDC->LineTo(120,100);pDC->LineTo(210,100);pDC->LineTo(220,180);pDC->LineTo(120,170);pDC->LineTo(110,100);C_S_Line(p1,p2,100,200,90,170,pDC); C_S_Line(p3,p4,100,200,90,170,pDC); }运行结果:6.基于链队列的种子填充算法程序设计程序代码:#define NULL 0typedef struct point{ int x,y;}POINT1;typedef struct QNode{POINT Data;struct QNode *Next;}QNode,*QPtr;typedef struct{QPtr Front;QPtr Rear;}LinkQueue;LinkQueue q;void CreateQueue(){q.Front=q.Rear=(QPtr)malloc(sizeof(QNode));q.Rear->Next=NULL;}POINT Dequeue(){QNode *p;POINT x;p=q.Front;x=q.Front->Data;q.Front=q.Front->Next;free(p);return x;}void Enqueue(POINT x){QNode *p=(QPtr)malloc(sizeof(QNode));q.Rear->Next=p;q.Rear->Data=x;q.Rear=p;}int Empty(){if( q.Front==q.Rear)return 1;else return 0;}void QueueSeedFill(int seedx, int seedy, int fcolor, int bcolor,CDC *pDC) {int color;POINT pt,p,p1,p2,p3,p4;pDC->SetPixel(seedx,seedy,fcolor);p.x=seedx;p.y=seedy;Enqueue(p);while(!Empty()){pt=Dequeue();color=pDC->GetPixel(pt.x,pt.y-1);if(color!=bcolor && color!=fcolor){pDC->SetPixel(pt.x,pt.y-1,fcolor);p1.x=pt.x;p1.y=pt.y-1;Enqueue(p1);}color= pDC->GetPixel(pt.x,pt.y+1);if(color!=bcolor && color!=fcolor){pDC->SetPixel(pt.x,pt.y+1,fcolor);p2.x=pt.x;p2.y=pt.y+1;Enqueue(p2);}color=pDC->GetPixel(pt.x-1,pt.y);if(color!=bcolor && color!=fcolor){pDC->SetPixel(pt.x-1,pt.y,fcolor);p3.x=pt.x-1;p3.y=pt.y;Enqueue(p3);}color=pDC->GetPixel(pt.x+1,pt.y);if(color!=bcolor && color!=fcolor){pDC->SetPixel(pt.x+1,pt.y,fcolor);p4.x=pt.x+1;p4.y=pt.y;Enqueue(p4);}}}void EdgeMark(int x1,int y1,int x2,int y2,int color,CDC *pDC){int i,length;float dx,dy,x=x1,y=y1;if (abs(x2-x1)>=abs (y2-y1))length=abs(x2-x1);elselength=abs(y2-y1);dx=(float)(x2-x1)/length;dy=(float)(y2-y1)/length;pDC->SetPixel((int)(x+0.5),(int)(y+0.5),color);for(i=1;i<=length;i++){x=x+dx;y=y+dy;pDC->SetPixel((int)(x+0.5),(int)(y+0.5),color);}}void QSeedFill(int cnt,POINT *pts,int seedx,int seedy,int fcolor,int bcolor,CDC *pDC){POINT v1,v2;int i;for(i=0;i<cnt-1;i++){v1=pts[i]; v2=pts[i+1];EdgeMark(v1.x,v1.y,v2.x,v2.y,bcolor,pDC);}QueueSeedFill(seedx,seedy,fcolor,bcolor,pDC); }void CQseedFillView::OnDraw(CDC* pDC){CQseedFillDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);POINT pts[7];pts[0].x=40;pts[0].y=12;pts[1].x=75;pts[1].y=45;pts[2].x=110;pts[2].y=20;pts[3].x=130;pts[3].y=70;pts[4].x=80;pts[4].y=110;pts[5].x=25;pts[5].y=60;pts[6].x=40;pts[6].y=15;QSeedFill(8,pts,70,80,2,4,pDC);}运行结果:13.Bezier曲线绘制程序设计程序代码如下:// CBezierView drawingtypedef struct point {int x,y;}POINT1;void Parabola(POINT *p,int n,CDC *pDC){int x,y,i,j,k=10;double t1,t2,t3,t,a,b,c,d;p[n].x=p[n-1].x;p[n].y=p[n-1].y;t=0.5/k;pDC->MoveTo(p[1].x,p[1].y);for(i=1;i<n-1;i++){for(j=1;j<k;j++){t1=j*t;t2=t1*t1;t3=t2*t1;a=4.0*t2-t1-4.0*t3; b=1.0-10.0*t2+12.0*t3;c=t1+8.0*t2-12.0*t3; d=4.0*t3-2.0*t2;x=(int)(a*p[i-1].x+b*p[i].x+c*p[i+1].x+d*p[i+2].x);y=(int)(a*p[i-1].y+b*p[i].y+c*p[i+1].y+d*p[i+2].y);pDC->LineTo(x,y);}pDC->LineTo(p[i+1].x,p[i+1].y);}}double powi(double v,int k){int i;double temp=1.0;if(k==0 || v==0)return 1;else{for(i=1;i<=k;i++)temp=temp*v;}return temp;}long fac(int m){int i;long temp=1;if(m==0)return 1;else{for(i=2;i<=m;i++)temp=temp*i;}return temp;}void Bezier(POINT *p,int n,CDC *pDC){int x,y,i,j,k=100;double t,t1,u,v;double temp,temp1,temp2,bi;t=1.0/k;pDC->MoveTo(p[0].x,p[0].y);for(j=1;j<k;j++){t1=j*t;u=t1;v=1-u;x=0;y=0;for(i=0;i<=n;i++){temp=(double)fac(n)/fac(i)/fac(n-i);temp1=powi(u,i);temp2=powi(v,n-i);bi=temp*temp1*temp2;x=x+bi*p[i].x;y=y+bi*p[i].y;}pDC->LineTo(x,y);}pDC->LineTo(p[n].x,p[n].y);}void BSpLine(POINT *p, int n,CDC *pDC){int x,y,i,j,k=1000;double t,t1,t2,t3,a,b,c,d;t=1.0/k;p[n].x=2*p[n-1].x-p[n-2].x;p[n].y=2*p[n-1].y-p[n-2].y;pDC->MoveTo(p[1].x,p[1].y);for(i=1;i<n-1;i++){for(j=1;j<=k;j++){t1=j*t;t2=t1*t1;t3=t2*t1;a=(3*t2-t3-3*t1+1)/6;b=(3*t3-6*t2+4)/6;c=(3*t2-3*t3+3*t1+1)/6;d=t3/6;x=(int)(a*p[i-1].x+b*p[i].x+c*p[i+1].x+d*p[i+2].x);y=(int)(a*p[i-1].y+b*p[i].y+c*p[i+1].y+d*p[i+2].y);pDC->LineTo(x,y);}}}void CardinalSpLine(POINT *p,int n,float tension,CDC *pDC) {int x,y,i,j,k=1000;double t,t1,t2,t3,a,b,c,d,s;t=1.0/k;s=(1.0-tension)/2.0;p[n].x=2*p[n-1].x-p[n-2].x;p[n].y=2*p[n-1].y-p[n-2].y;pDC->MoveTo(p[1].x,p[1].y);for(i=1;i<n-1;i++){for(j=1;j<=k;j++){t1=j*t;t2=t1*t1;t3=t2*t1;a=-s*t3+2*s*t2-s*t1;b=(2-s)*t3+(s-3)*t2+1;c=(s-2)*t3+(3-2*s)*t2+s*t1;d=s*t3-s*t2;x=(int)(a*p[i-1].x+b*p[i].x+c*p[i+1].x+d*p[i+2].x);y=(int)(a*p[i-1].y+b*p[i].y+c*p[i+1].y+d*p[i+2].y);pDC->LineTo(x,y);}}}void CBezierView::OnDraw(CDC* pDC){CBezierDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);int n=5;POINT ps[4];ps[0].x=60;ps[0].y=200;ps[1].x=50;ps[1].y=200;ps[2].x=160;ps[2].y=60;ps[3].x=200;ps[3].y=200;ps[4].x=350;ps[4].y=60;pDC->MoveTo(ps[0].x,ps[0].y);pDC->LineTo(ps[1].x,ps[1].y);pDC->LineTo(ps[2].x,ps[2].y);pDC->LineTo(ps[3].x,ps[3].y);Parabola(ps,n,pDC);CardinalSpLine(ps,n,0.5,pDC);Bezier(ps,n-1,pDC);BSpLine(ps,n,pDC);}。

计算机图形学实验报告4

计算机图形学实验报告4

计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。

二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。

三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。

通过设置线条颜色、填充颜色等属性,增强图形的表现力。

2、图形的几何变换实现图形的平移、旋转和缩放操作。

观察不同变换参数对图形的影响。

3、三维图形的生成构建简单的三维模型,如立方体、球体等。

应用光照和材质效果,使三维图形更加逼真。

四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。

然后,定义绘图窗口的大小和坐标范围。

接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。

最后,设置图形的颜色和填充属性,使图形更加美观。

2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。

对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。

对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。

3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。

然后,设置光照的位置、颜色和强度等参数。

接着,为模型添加材质属性,如颜色、反射率等。

最后,使用渲染函数将三维模型显示在屏幕上。

五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。

例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。

2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。

在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。

3、三维图形的生成生成的三维模型具有一定的立体感和真实感。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。

1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。

计算机图形学第五次实验报告

计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。

二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。

三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。

要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。

物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。

用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。

世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。

为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。

物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。

观察坐标系的原点一般即是观察点。

物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。

因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。

这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。

实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。

2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。

3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。

4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。

结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。

计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。

希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。

图形学实验报告

图形学实验报告

图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。

通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。

实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。

我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。

通过改变像素的颜色值,我们可以创建出各种各样的图像效果。

实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。

我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。

这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。

实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。

我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。

通过这些技术,我们可以创建出更加复杂和精细的图像。

实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。

我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。

通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。

实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。

我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。

通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。

实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。

我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。

通过这些技术,我们可以创建出逼真的三维场景和动画效果。

总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。

我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。

图形学实验报告2

图形学实验报告2
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView drawing
三、实验要求:
实验前须规划程序界面和按钮的相关事件的编写代码。实验时进行代码的调试。
四、实验代码
1,图形的变换
// TransformView.cpp : implementation of the CTransformView class
//
#include "stdafx.h"
#include "Transform.h"
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
for(i=1; i<3; i++)
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。

通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。

二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。

开发环境为 PyCharm。

三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。

它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。

Bresenham 算法则是一种基于误差的直线生成算法。

它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。

在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。

2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。

通过不断迭代计算中点的位置,逐步生成整个圆。

在实现过程中,需要注意边界条件的处理和误差的计算。

3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。

旋转变换是围绕一个中心点将图形旋转一定的角度。

缩放变换则是改变图形的大小。

通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。

4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。

扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。

在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。

四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。

根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。

图形学 实验报告

图形学 实验报告

图形学实验报告一、实验介绍图形学是计算机科学中的一个重要领域,主要研究计算机图形的生成、显示和处理。

本次实验旨在通过学习图形学的基本概念和算法,深入理解计算机图形的原理与应用。

二、实验内容本次实验主要包含以下内容:1. 图形学的基本概念和历史发展2. 图形学中常用的几何变换和投影算法3. 光栅化算法及其在图形渲染中的应用4. 着色和光照模型的原理及实现方法5. 三维场景建模与渲染技术三、实验步骤和结果1. 图形学的基本概念和历史发展首先我们了解了图形学的基本概念和历史发展。

图形学起源于20世纪60年代,当时主要用于计算机辅助设计(CAD)和计算机辅助制造(CAM)领域。

随着计算机技术的不断发展,图形学逐渐应用于计算机图形的显示和处理领域。

2. 几何变换和投影算法接下来我们学习了图形学中常用的几何变换和投影算法。

几何变换包括平移、旋转和缩放等操作,通过改变图形的位置、角度和尺寸,实现对图形的变换和组合。

投影算法主要用于将三维空间中的图形投影到二维屏幕上,实现透视效果。

3. 光栅化算法及其应用在图形渲染中,光栅化算法是非常常用的技术。

光栅化算法将连续的几何图形转化为离散的像素,实现图形在屏幕上的显示。

常见的光栅化算法包括扫描线算法和边界填充算法。

4. 着色和光照模型的原理与实现为了实现真实感的图形渲染,着色和光照模型是不可或缺的。

着色模型描述了在光照条件下物体表面的颜色,常见的着色模型包括平面着色模型和高洛德着色模型。

光照模型则描述了光线在物体表面的反射和折射过程,常见的光照模型包括冯氏光照模型和布林-菲菲尔德模型。

5. 三维场景建模与渲染技术最后我们学习了三维场景建模与渲染技术。

三维场景建模主要包括建立三维模型和场景的几何结构信息。

三维渲染技术则是将建模得到的三维场景转换为可显示的二维图像。

四、实验总结通过本次实验的学习,我们深入了解了图形学的基本概念和算法。

图形学在计算机图形的生成、显示和处理中具有重要应用,对于计算机科学专业学生来说,学习图形学是必不可少的。

图形学实验报告基本图形绘制

图形学实验报告基本图形绘制
// (5)添加代码实现改进Bresenham算法画直线//
// (6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改)//
// (7)适当修改代码实现具有宽度的图形(线刷子或方刷子)//
/////////////////////////////////////////////////////与计算科学
班级
姓名
学号
实验设备
计算机58
【评价及意见】
实验成绩:教师签名:批改日期:年月日
【实验目的和要求】
目的:了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解
要求:掌握软件的使用方法,绘制基本的图形
源代码如下:
////////////////////////////////////////////////////////////////////////////
//实验要求:(1)理解glut程序框架//
// (2)理解窗口到视区的变换//
// (3)理解OpenGL实现动画的原理//
// (4)添加代码实现中点Bresenham算法画直线//
#include<windows.h>
#include<gl/glut.h>
#include"stdio.h"
intm_PointNumber = 0;//动画时绘制点的数目
intm_DrawMode = 1;//绘制模式1 DDA算法画直线
// 2中点Bresenham算法画直线
// 3改进Bresenham算法画直线
了解opengl图形软件包绘制图形的基本过程及其程序框架并在已有的程序框架中添加代码实现直线和圆的生成算法演示直线和圆的生成过程从而加深对直线和圆等基本图形生成算法的理解要求

图形学画圆实验报告

图形学画圆实验报告

4.2.3程序实现与上机实习(二)一、实验目的编写圆和椭圆的扫描转换算法程序,验证算法的正确性。

二、实验任务1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;2.添加鼠标程序,实现交互式画圆;3.编写中点画椭圆法的扫描转换程序;4.添加鼠标程序,实现交互式画椭圆;三、实验内容1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。

通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为x’=x+x0y’=y+y0即p’1(x0 +x, y+y0)其它7个对称点分别是:p’2(x0+y,y+x0), p’3 (x0+y,y0-x),p’4 (x0+x,y0-y),p’5 (x0-x,y0-y),p’6 (x0-y,y0-x),p’7 (x0-y,y0+x),p’8 (x0-x,y0+y)算法程序如下:{int x,y;float d;x=0;y=r;d=1.25-r;CirPot(x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}(x0+R,y0)else{d+=2*(x-y)+5;x++; y--;}CirPot(x0,y0,x,y,color);} /* while*/} /* MidpointCiecle */int CirPot(int x0,int y0,int x,int y,int color){Setpixel((x0+x),(y0+y));Setpixel((x0+y),(y0+x));Setpixel((x0+y),(y0-x));Setpixel((x0+x),(y0-y));Setpixel((x0-x),(y0-y));Setpixel((x0-y),(y0-x));Setpixel((x0-y),(y0+x));Setpixel((x0-x),(y0+y));}程序实现步骤:(1)建立MidPointCircle工程文件;(2)右击CMidPointCircleView类,建立成员函数void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color)int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color)(3) 编写成员函数代码,程序如下:void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {int x,y;float d;x=0;y=r;d=1.25-r;CirPot(pDC,x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}else{d+=2*(x-y)+5;x++; y--;}CirPot(pDC,x0,y0,x,y,color);} /* while*/}int CMidPointCircleView::CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) {pDC->SetPixel((x0+x),(y0+y),color);pDC->SetPixel((x0+y),(y0+x),color);pDC->SetPixel((x0+y),(y0-x),color);pDC->SetPixel((x0+x),(y0-y),color);pDC->SetPixel((x0-x),(y0-y),color);pDC->SetPixel((x0-y),(y0-x),color);pDC->SetPixel((x0-y),(y0+x),color);pDC->SetPixel((x0-x),(y0+y),color);return 0;}(4)编写OnDraw(CDC* pDC)函数,程序如下:void CMidPointCircleView::OnDraw(CDC* pDC){CMidPointCircleDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereMidpointCircle(pDC,100, 100, 10, RGB(255,0,0));MidpointCircle(pDC,500, 300, 60, RGB(255,255,0));}(6)编译、运行程序,查看结果。

图形学实验报告

图形学实验报告

图形学实验报告计算机图形学实验指导书学号:1441901105姓名:谢卉实验一:图形的几何变换实验学时:4学时实验类型:验证实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。

如可能也可进行裁剪设计。

二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。

建议采用VC++实现OpenGL程序设计。

三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Tx y’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。

其交互方式可先定义键值,然后操作功能键使其移动。

2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。

则有:x’=x*s y’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。

一般情况下,参考点在图形的左下角或中心。

设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。

当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx 和Sy必须大于零)。

3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。

旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。

三维图形学实验报告

三维图形学实验报告

实验一1.(1)三角形:#include<glut.h>// glut.h includes gl.h and glu.hvoid init(void) {glClearColor(0.0, 0.0, 0.0, 0.0);}void reshape(int w, int h) {glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);// 指定哪一个矩阵是当前矩阵glLoadIdentity();//重置当前指定的矩阵为单位矩阵。

gluOrtho2D(-1.0, 1.0, -1.0, 1.0); // The para are: (left, right, bottom, top) 定义二维正交投影矩阵glMatrixMode(GL_MODELVIEW); //指定哪一个矩阵是当前矩阵}void display(void) {glClear(GL_COLOR_BUFFER_BIT); // Clear the frame bufferglColor3f(0.0, 1.0, 0.0); // Set current color to greenglBegin(GL_POLYGON); // Draw the triangleglVertex2f(-0.7, -0.7);glVertex2f(0.7, -0.7);glVertex2f(0, 0.7);glEnd();glFlush(); // Force to display the new drawings immediately}int main(int argc, char **argv) {glutInit(&argc, argv); // Initialize GLUT function callingsglutInitWindowSize(400, 400);glutInitWindowPosition(200, 100); // in numbers of pixelsglutCreateWindow("Green Triangle");glutDisplayFunc(display); // is created or re-drewinit(); // Invoke this function for initializationglutMainLoop(); // Enter the event processing loopreturn 0; // Indicate normal termination// (Required by ANSI C)}// 操作,定义事件回调函数(2)点:void display(){glClear(GL_COLOR_BUFFER_BIT); // Clear the frame bufferglColor3f(0.0, 1.0, 0.0); // Set current color to greenglPointSize(10.);glBegin(GL_POINTS);glVertex2i(0.5,0.5);glEnd();glFlush(); // Force to display the new drawings immediately }(3)线段:void display(){glClear(GL_COLOR_BUFFER_BIT); // Clear the frame bufferglColor3f(0.0, 1.0, 0.0); // Set current color to greenglLineWidth(3.0);glBegin(GL_LINES);glVertex3f(0., 0., 0.);glVertex3f(0., 1., 0.);glEnd();glFlush(); // Force to display the new drawings immediately }(4)四边形:void display(){glClear(GL_COLOR_BUFFER_BIT); // Clear the frame bufferglColor3f(1.0, 0.0, 0.0); // Set current color to greenglRectf(0.6, 0.3, 0.2, 0.8);int vertex1[] = { 0.6, 0.3};int vertex2[] = { 0.2, 0.8};glRectiv(vertex1, vertex2);glFlush(); // Force to display the new drawings immediately }2.立方体:3.void reshape(int w, int h)4.{5. glViewport(0, 0, w, h);6. glMatrixMode(GL_PROJECTION);7. glLoadIdentity();8. glOrtho(-3.0, 3.0, -3.0, 3.0, -3.0, 3.0);9.}10.void display(){11. glClear(GL_COLOR_BUFFER_BIT); // Clear the frame buffer12. glMatrixMode(GL_MODELVIEW);13. glLoadIdentity();14. gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);15. glutWireCube(0.5);16. glutSwapBuffers();17. glColor3f(0.0, 1.0, 0.0);18. glBegin(GL_LINE_LOOP); //Green19. glVertex3f(0., 0., 0.); glVertex3f(0., 2, 0.);20. glVertex3f(2, 2, 0.); glVertex3f(2, 0., 0.);21. glEnd();22. glColor3f(1.0, 1.0, 0.0);23. glBegin(GL_LINE_LOOP); //Yellow24. glVertex3f(0., 0., 2); glVertex3f(2, 0., 2);25. glVertex3f(2, 2, 2); glVertex3f(0., 2, 2);26. glEnd();27. glColor3f(0.0, 1.0, 1.0);28. glBegin(GL_LINES); //Cyan29. glVertex3f(0., 0., 0.); glVertex3f(0., 0., 2);30. glVertex3f(0., 2, 0.); glVertex3f(0., 2, 2);31. glVertex3f(2, 0., 0.); glVertex3f(2, 0., 2);32. glVertex3f(2, 2, 0.); glVertex3f(2, 2, 2);33. glEnd();34. glFlush(); // Force to display the new drawings immediately}3.(1)三角形条带void display(){glClear(GL_COLOR_BUFFER_BIT); // Clear the frame bufferGLfloat v0[] = { 0., 0.3 },v1[] = { 0.2, 0.6 },v2[] = { 0.4, 0.3 },v3[] = { 0.5, 0.6 },v4[] = { 0.6, 0.3 },v5[] = { 0.8, 0.6 },glColor3f(1.0);glBegin(GL_TRIANGLE_STRIP);//三角形条带函数glVertex2fv(v0);glVertex2fv(v1);glVertex2fv(v2);glVertex2fv(v3);glVertex2fv(v4);glVertex2fv(v5);glEnd();glFlush(); // Force to display the new drawings immediately }3.(2)三角形扇形GLfloat v0[] = { 0., 0.3 },v1[] = { 0.3, 0.7 },v2[] = { 0.5, 0.65 },v3[] = { 0.5, 0.5},v4[] = { 0.45, 0.4 },v5[] = { 0.3, 0.35 },glColor3f(1.0);glBegin(GL_TRIANGLE_FAN);//共享一个顶点glVertex2fv(v0);glVertex2fv(v1);glVertex2fv(v2);glVertex2fv(v3);glVertex2fv(v4);glVertex2fv(v5);glEnd();glFlush(); // Force to display the new drawings immediately}实验二1.点glColor3f(0.0, 1.0, 0.0);glPointSize(3.);glBegin(GL_POINTS);glVertex3f(0.1, 0.5, 0);glColor3f(1.0, 1.0, 0.0);glPointSize(5.);glBegin(GL_POINTS);glVertex3f(0.5, 0.5, 0);glColor3f(1.0, 0.0, 0.0);glPointSize(10.);glBegin(GL_POINTS);glVertex3f(0.3, 0.4, 0);glColor3f(0.0, 0.0, 1.0);glPointSize(1.);glBegin(GL_POINTS);glVertex3f(0.2, 0.6, 0);glColor3f(1.0, 1.0, 1.0);glPointSize(4.);glBegin(GL_POINTS);glVertex3f(0.3, 0.5, 0);glEnd();glFlush(); // Force to display the new drawings immediately }2.直线glColor3f(0.0, 1.0, 0.0);glLineWidth(1.0);glBegin(GL_LINES);glVertex3f(0.3, 0.1, 0.0);glVertex3f(0.3, 0.5, 0.0);//垂直距离glColor3f(1.0, 1.0, 0.0);glLineWidth(3.);//宽度glBegin(GL_LINES);glVertex3f(0.2, 0.1, 0.0);glVertex3f(0.2, 0.5, 0.0);glColor3f(1.0, 0.0, 0.0);glLineWidth(5.);glBegin(GL_LINES);glVertex3f(0.5, 0.1, 0.0);glVertex3f(0.5, 0.5, 0.0);glEnd();glFlush(); // Force to display the new drawings immediately }3.直线,虚线,点划线glColor3f(1.0, 0.0, 0.0);glLineWidth(2.0);glBegin(GL_LINES);glVertex2f(0.0, 0.3);glVertex2f(0.8, 0.3);glEnd();glColor3f(1.0, 0.0, 0.0);glEnable(GL_LINE_STIPPLE);glLineStipple(1, 0x0101);glLineWidth(2.0);glBegin(GL_LINES);glVertex2f(0.0, 0.5);glVertex2f(0.8, 0.5);glEnd();glColor3f(1.0, 0.0, 0.0);glEnable(GL_LINE_STIPPLE);glLineStipple(1, 0xffcc);glLineWidth(2.0);glBegin(GL_LINES);glVertex2f(0.0, 0.8);glVertex2f(0.8, 0.8);glEnd();4.顶点不同颜色的三角形平滑填充glShadeModel(GL_SMOOTH);glBegin(GL_TRIANGLES);glColor3f(0.0, 0.0, 1.0);glPointSize(5.0);glVertex2f(0.3, 0.3);glColor3f(1.0, 0.0, 0.0);glPointSize(5.0);glVertex2f(0.4, 0.6);glColor3f(1.0, 1.0, 0.0);glPointSize(5.0);glVertex2f(0.5, 0.4);glEnd();5.调用glPolygonMode(face, displayMode); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);6. 两个正方形混合(1)glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//混合glColor4f(0.0, 1.0, 0.0,0.5); // Set current color to green glRectf(0.6, 0.3, 0.2, 0.8);int vertex1[] = { 0.6, 0.3 };int vertex2[] = { 0.2, 0.8 };glRectiv(vertex1, vertex2);glColor4f(0.0, 0.0, 1.0,0.5); // Set current color to greenglRectf(0.5, 0.2, 0.1, 0.5);int vertex3[] = { 0.5, 0.2 };int vertex4[] = { 0.1, 0.5 };glRectiv(vertex3, vertex4);(2)glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA,GL_ZERO);(3) glEnable(GL_BLEND);glBlendFunc(GL_ONE,GL_ZERO);说明:用函数glBlendFunc(sFactor,dFactor);选择调和因子的值产生不同的混合效果,有GL_ONE,GL_ZERO,GL_SRC_ALPHAGL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA等实验三1.平移glMatrixMode(GL_MODELVIEW);glColor3f(1.0, 1.0, 0.0);glRectf(0.6, 0.3, 0.2, 0.8);glColor3f(1.0, 0.0, 0.0);glTranslatef(-0.5,-0.3,0.0);glRectf(0.6, 0.3, 0.2, 0.8);旋转:glColor3f(1.0, 1.0, 0.0);glRectf(0.6, 0.3, 0.2, 0.8)glLoadIdentity();glRotatef(90.0,0.0,0.0,1.0);glRectf(0.6, 0.3, 0.2, 0.8);缩放:glColor3f(0.0, 1.0, 1.0);glLoadIdentity();glScalef(-0.5, 1.0, 1.0);glRectf(0.6, 0.3, 0.2, 0.8);3.桌子绘制void table(){glColor3f(0.0, 1.0, 1.0);glRectf(-0.5, 0.3, 0.5, -0.3);glColor3f(1.0, 1.0, 0.0);glRectf(-0.4, 0.25, 0.4, 0.15);glColor3f(1.0, 1.0, 0.0);glRectf(-0.4, 0.25, -0.3, -0.15);glColor3f(1.0, 1.0, 0.0);glRectf(0.3, 0.25, 0.4, -0.15);glColor3f(1.0, 1.0, 0.0);glRectf(-0.4, -0.15, 0.4, -0.25);glColor3f(1.0, 0.2, 0.0);glRotatef(-45.0, 0.0, 0.0, 1.0);glTranslatef(0.15, 0.35, 0.0);glRectf(-0.3, -0.15, 0.3, -0.25);glLoadIdentity();glColor3f(1.0, 0.2, 0.0);glRotatef(-90, 0.0, 0.0, 1.0);glTranslatef(-0.35, -0.15, 0.0);glRectf(-0.3, -0.15, 0.3, -0.25);glLoadIdentity();glColor3f(1.0, 0.2, 0.0);glRotatef(-90, 0.0, 0.0, 1.0);glTranslatef(-0.65, 0.15, 0.0);glRectf(-0.3, -0.15, 0.3, -0.25);glLoadIdentity();glColor3f(1.0, 0.2, 0.0);glRotatef(-90, 0.0, 0.0, 1.0);glTranslatef(-0.2, 0.6, 0.0);glRectf(-0.3, -0.15, 0.3, -0.25);}void display(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear the frame buffer glMatrixMode(GL_MODELVIEW);glPushMatrix();glRotatef(-45.0, 0.0, 0.0, 1.0);table();glPopMatrix();glFlush();}4. 编程绘制罗马字母Ⅳ和Ⅹ。

计算机图形学实验报告

计算机图形学实验报告
等领域。
实验内容:通 过实验掌握光 照模型的原理 和实现方法, 了解不同光照 模型对物体表 面光照效果的
影响。
纹理映射
定义:将纹理图像映射到三维物 体表面的过程
方法:根据物体表面的几何形状, 将纹理图像按照一定的规则和算 法进行拉伸、扭曲和拼接等操作, 最终覆盖在物体表面
添加标题
添加标题
添加标题
添加标题
提高编程能力
熟练使用相关编程语言和工 具
掌握计算机图形学的基本原 理和算法
学会分析和解决图形学中的 问题
提高编程技巧和解决问题的 能力
02
实验内容
图形渲染流程
加载场景和模型 设置相机和光源 几何着色器处理顶点数据 光栅化着色器生成像素数据
OpenGL基本操作
创建窗口:使用OpenGL创建 窗口,设置渲染上下文
熟悉图形渲染流程
了解图形渲染的 基本原理和流程
掌握图形渲染的 关键技术和技巧
熟悉图形渲染的 应用场景和优势
Hale Waihona Puke 掌握图形渲染的 未来发展方向和 趋势
掌握OpenGL的使用
学习OpenGL的基本概念和原理 掌握OpenGL的编程接口和开发流程 理解OpenGL在计算机图形学中的应用和优势 学会使用OpenGL进行基本的图形渲染和交互操作
目的:增加物体的表面细节和真 实感
应用:游戏开发、电影制作、虚 拟现实等领域
03
实验过程
实验环境搭建
安装操作系统: 选择适合的操
作系统,如 Windows或
Linux
安装开发工具: 安装所需的集
成开发环境 (IDE)和编
译器
安装图形库: 安装OpenGL、
DirectX或其 他的图形库

分形图形学实验报告

分形图形学实验报告

分形图形学实验报告指导实验报告要求1.实验名称2.实验目的、要求3.实验主要内容(某某算法的实现)4.实验过程(程序流程图、源代码)5.实验结果(附上打印的图形)6.实验小结实验报告一一般分形图形生成实验目的1.Koch曲线、Sierpinski三角形、Cantor集的计算机实现2.掌握用迭代、递归生成分形实验内容及步骤1、Koch曲线函数:plot(x1,y1) –(x2,y2)(画直线函数)sin( )(正弦函数)cos( )(余弦函数)ArcTan( )(反正切函数)2、Sierpinski三角形函数:plot(x1,y1) –(x2,y2)(画直线函数)sin( )(正弦函数)cos( )(余弦函数)3、Cantor集实验报告二L系统语言生成分形图形实验目的1.掌握用L系统语言生成分形2.Koch曲线、Sierpinski三角形、Cantor集的L系统实现实验内容及步骤1.编写程序用L系统语言生成分形图形1)编写程序生成Koch曲线:初始图形是一条线段,生成过程是将线段中间1/3向外折起。

程序伪码如下:KochCurve { ;柯赫曲线Angle 6 ;角度增量是60°Axiom F ;初始图形是一单位线段F=F+F--F+F ;产生式是将线段中间1/3折起} ;结束2)用L系统再次生成Sierpinski三角。

生成Sierpinski三角的伪码如下:Hilbert{ ;Sierpinski三角,1996-12Angle 4Axiom Y ;初始串为任意字母YX=-YF+XFX+FY- ;第一个生成规则Y=+XF-YFY-FX+ ;第二个生成规则,由以上规则不断代换}3)模拟草本植物。

注意这里出现了“括号”——可以方便地表示树枝,伪码如下:HerbPlant { ;生成植物,本程序使用了括号Angle 14Axiom ZZ=ZFX[+Z][-Z]X=X[-FFF][+FFF]FX}实验报告三逃逸时间法生成Mandelbrot 集与Julia集实验目的1.掌握逃逸时间法2.Mandelbrot集与Julia集的计算机实现实验内容及步骤1.编写程序生成Mandelbrot集在复迭代中影响最大的当属迭代z→z^2+c,实际上它只是形式更一般的复解析迭代z_(n+1)=F(z_n)+c的一种, F是一个非线性函数。

计算机图形学实验报告三

计算机图形学实验报告三

《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。

}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。

二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。

开发环境为 PyCharm 或 Jupyter Notebook。

三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。

通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。

比较两种算法的效率和准确性,分析其优缺点。

2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。

给定圆心坐标和半径,生成圆的图形。

研究不同半径大小对绘制效果和计算复杂度的影响。

(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。

处理多边形的顶点排序、交点计算和填充颜色的设置。

测试不同形状和复杂度的多边形填充效果。

2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。

探索如何通过改变填充图案的参数来实现不同的视觉效果。

(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。

通过矩阵运算实现这些变换。

观察变换前后图形的位置、形状和方向的变化。

2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。

分析组合变换的顺序对最终图形效果的影响。

(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。

理解如何将三维坐标映射到二维屏幕上显示。

2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。

探讨不同的绘制方法和视角对三维图形显示的影响。

图形学实验报告

图形学实验报告

山东建筑大学测绘地理信息学院实验报告(2016—2017学年第一学期)课程:计算机图形学专业:地理信息科学班级:地信141学生姓名:王俊凝学号:20140113010指实验一直线生成算法设计一、实验目的掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。

二、实验任务在TurboC环境下开发出绘制直线和圆的程序。

三、实验仪器设备计算机。

四、实验方法与步骤1 运行TurboC编程环境。

2 编写Bresenham直线绘制算法的函数并进行测试。

3 编写中点圆绘制算法的函数并进行测试。

4 增加函数参数,实现直线颜色的设置。

提示:1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。

2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。

这样,在向函数传入参数时,可使用两个点类型来传参。

定义方法为:typedef struct{int x;int y;}pt2;此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。

3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。

4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。

五、注意事项1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。

2 程序提交.c源文件,函数前和关键代码中增加注释。

程序模板#include <stdio.h>#include <graphics.h>typedef struct{int x;int y;}pt2;/*declare your drawing functions.*/void drawline(pt2 startpt,pt2 endpt,int color);void drawcircle(pt2 centerpt,int radius,int color);void circlePlotPoints(pt2 centerpt,int x,int y,int color);int main(){int color,radius;pt2 startpt,endpt,centerpt;/*initialize graphics driver.*/int gdriver=VGA;int gmode=VGAHI;initgraph(&gdriver, &gmode, "C:\\TC20\\BGI");/*start drawing.*/printf("Press enter to start drawing.");getchar();/*invoke your drawing functions one by one.*/ startpt.x=10;startpt.y=10;endpt.x=300;endpt.y=250;color=4;drawline(startpt,endpt,color);centerpt.x=200;centerpt.y=180;radius=145;color=8;drawcircle(centerpt,radius,color);/*end drawing.*/printf("Drawing is done, press enter to exit."); getchar();/*close graphics driver.*/closegraph();}/** draw line* startpt: the start point of the line* endpt: the end point of the line* color: the color of the line*/void drawline(pt2 startpt,pt2 endpt,int color){int dx=abs(startpt.x-endpt.x), dy=abs(startpt.y-endpt.y);int p=2*dy-dx;int twoDy=2*dy,twoDyDx=2*(dy-dx);int x,y,xEnd;if(startpt.x>endpt.x){x=endpt.x;y=endpt.y;xEnd=startpt.x;}else{x=startpt.x;y=startpt.y;xEnd=endpt.x;}putpixel(x,y,color);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyDx;}putpixel(x,y,color);}}/** draw circle* centerpt: the center of the circle* radius: the radius of the circle* color: the color of the circle*/void drawcircle(pt2 centerpt,int radius,int color) {int x=0;int y=radius;int p=1-radius;circlePlotPoints(centerpt,x,y,color);while(x<y){x++;if(p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circlePlotPoints(centerpt,x,y,color);}}void circlePlotPoints(pt2 centerpt,int x,int y,int color) {putpixel(centerpt.x+x,centerpt.y+y,color);putpixel(centerpt.x-x,centerpt.y+y,color);putpixel(centerpt.x+x,centerpt.y-y,color);putpixel(centerpt.x-x,centerpt.y-y,color);putpixel(centerpt.x+y,centerpt.y+x,color);putpixel(centerpt.x-y,centerpt.y+x,color);putpixel(centerpt.x+y,centerpt.y-x,color);putpixel(centerpt.x-y,centerpt.y-x,color);}运行结果实验二多边形区域填充算法设计一、实验目的掌握多边形图形元素的填充算法,利用编程语言C实现多边形的区域填充算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图形学实验报告计算机图形学实验指导书学号:1441901105姓名:谢卉实验一:图形的几何变换实验学时:4学时实验类型:验证实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。

如可能也可进行裁剪设计。

二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。

建议采用VC++实现OpenGL程序设计。

三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Tx y’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。

其交互方式可先定义键值,然后操作功能键使其移动。

2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。

则有:x’=x*s y’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。

一般情况下,参考点在图形的左下角或中心。

设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。

当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx 和Sy必须大于零)。

3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。

旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。

x,y为旋转前图形中某点的坐标,x’和y’为旋转后图形中该点的坐标。

4.裁剪对一个三角形进行裁剪,裁剪后的图形应是一个封闭的图形。

可采用线段裁剪法,其方法可用书上的线段相交求点的公式,确定可见线段予以保存,不在窗口的线段则应舍弃。

图1四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。

五、实验条件每人一台计算机独立完成实验。

六、实验步骤(1)将图形显示在初始位置。

(2)对图形各点按变换表达式作坐标变换,计算出各点变换后的相应点的坐标。

(3)将原来的图形抹去。

(4)在新的位置显示图形。

七、程序代码平移缩放// test1.cpp : 定义控制台应用程序的入口点。

//#include"stdafx.h"#include"gl/glut.h"#include"math.h"#include<stdlib.h>float width,highth,angle;void init (void)//画正方形{glClearColor (1.0,1.0, 1.0, 0.0);//背景颜色glMatrixMode (GL_PROJECTION);// 投影gluOrtho2D (0.0, 600.0, 0.0, 600.0);//参数分别代表(左下角x坐标,右上角x坐标,左下角y 坐标,右上角y坐标)}void display (void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (0.0, 1.0, 1.0);//矩形颜色glBegin(GL_POLYGON);glTranslatef(0,0,0);glRotatef(angle,0,0,1);glVertex2f(100.0f+width,100.0f+highth);//用来画点glVertex2f(100.0f+width,300.0f+highth);glVertex2f(300.0f+width,300.0f+highth);glVertex2f(300.0f+width,100.0f+highth);glEnd();glFlush ( );}void mySpecialKeyboard(int key, int x, int y) {if(key==GLUT_KEY_RIGHT)if(key==GLUT_KEY_LEFT)width-=5;if(key==GLUT_KEY_UP)highth+=5;if(key==GLUT_KEY_DOWN)highth-=5;glutPostRedisplay();}void myKeyboard(unsigned char key, int x, int y) {if(key == 'c' || key == 'C')glutPostRedisplay();}void mymouse(int button,int state,int x,int y)//鼠标控制缩放{if(state==GLUT_DOWN){if(button==GLUT_LEFT_BUTTON){glScalef(0.5,0.5,0.0);display();}else if(button==GLUT_RIGHT_BUTTON){glScalef(1.5,1.5,0.0);display();}glutPostRedisplay();//重新调用绘制函数}return;}void main (int argc, char** argv){glutInit (&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (50, 50); glutInitWindowSize (600, 600);glutCreateWindow ("方向键控制平移,鼠标控制缩放"); init ( );glutDisplayFunc (display);glutSpecialFunc( mySpecialKeyboard);glutMouseFunc(&mymouse);glutKeyboardFunc( myKeyboard);glutMainLoop ( );}旋转#include"stdafx.h"#include<GL/glut.h>#include<math.h>#include"stdlib.h"#define DEG_TO_RAD 0.017453 //角度转为弧度的参数,即 2*PI/360float theta=30.0; //直线与X轴正方向的夹角float length=200.0; //直线的长度float x=300.0, y=200.0; //直线的第一个端点void init (void){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 640.0, 0.0, 480.0);}void display (void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (0.0, 1.0, 1.0);glBegin (GL_POLYGON);glVertex2f (x, y);glVertex2f ( x + length*cos(DEG_TO_RAD*theta), y + length*sin(DEG_TO_RAD*theta) );glVertex2f ( x + length*cos(DEG_TO_RAD* (theta+30) ), y + length*sin(DEG_TO_RAD* (theta+30)) );glEnd ( );glutSwapBuffers ( ); //交换前后台缓存}/*void idleFunc(){theta += 0.1;if (theta>360) theta -=360;glutPostRedisplay(); //重新调用绘制函数}*/void myKeyboard(unsigned char key, int x, int y){if(key == 'a' || key == 'A')theta += 5.0;if(key == 's' || key == 'S')theta -= 5.0;if(key == 'c' || key == 'C')exit(0);if (theta>360) theta -=360;if (theta<0) theta +=360;glutPostRedisplay(); //重新调用绘制函数}void main (int argc, char** argv){glutInit (&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition (100, 100);glutInitWindowSize (640, 480);glutCreateWindow ("A键左转,S键右转");init ( );glutDisplayFunc (display);glutKeyboardFunc( myKeyboard);// glutIdleFunc(idleFunc); //指定空闲回调函数 glutMainLoop ( );}八、实验结果实验二:图形的区域填充实验学时:4学时实验类型:验证实验要求:必修一、实验目的区域填充是指先将区域内的一点(常称为种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。

区域填充技术广泛应用于交互式图形、动画和美术画的计算机辅助制作中。

本实验采用递归填充算法或扫描线算法实现对光栅图形的区域填充。

通过本实验,可以掌握光栅图形编程的基本原理和方法。

二、实验内容掌握光栅图形的表示方法,实现种子算法或扫描线算法。

通过程序设计实现上述算法。

建议采用VC++实现OpenGL程序设计。

三、实验原理、方法和手段1.递归算法在要填充的区域内取一点(X,Y)的当前颜色记为oldcolor,用要填充的颜色newcolor去取代,递归函数如下:procedure flood-fill(X,Y,oldcolor,newcolor:integer);beginif getpixel(framebuffer,x,y)=oldcolorthen beginsetpixel(framebuffer,x,y,newcolor);flood-fill(X,Y+1,oldcolor,newcolor);flood-fill(X,Y-1,oldcolor,newcolor);flood-fill(X-1,Y,oldcolor,newcolor);flood-fill(X+1,Y,oldcolor,newcolor);endend2.扫描线算法扫描线算法的效率明显高于递归算法,其算法的基本思想如下:(1)(初始化)将算法设置的堆栈置为空,将给定的种子点(x,y)压入堆栈。

相关文档
最新文档