计算机图形学直线的生成算法_第1页
计算机图形学直线的生成算法_第2页
计算机图形学直线的生成算法_第3页
计算机图形学直线的生成算法_第4页
计算机图形学直线的生成算法_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二 直线段生成绘制的实现算法班级 08信计2班 学号20080502050姓名 张玉凤 分数 一、实验目的和要求:1、掌握光栅图形显示基本原理2、熟悉直线的生成算法,掌握直线的绘制3、初步了解Tc下画图基本程序结构;4、初步了解DDA画线算法及Bresenham算法的思想和基本方法二、实验主要思想:1、DDA算法思想: 数值微分法即DDA法,这是一种基于直线的微分方程来生成直线的方法。选定和中较大者作为步进方向,取该方向上的为一个像素单位长,即x每次递增一个像素,然后利用公式计算出相应的y值,把每次计算出的取整后顺序输出到显示器,则得到光栅后的直线。2、中点直线算法思想: 假定直线斜率k在

2、01之间(k的其它取值可以类似处理),当前象素点为(xp,yp),则下一个象素点有两种可选择点P1(xp+1,yp)或P2(xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M,Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。三、实验内容及步骤1、dda画线算法画一段直线实验代码:#include"stdio.h"#include"graphics.h"void DDALine(int x1,int y1, int x2,int y

3、2)    double dx, dy,e,x,y;    int i;    dx=x2-x1;    dy=y2-y1;    e=(fabs(dx)>fabs(dy)? fabs(dx):fabs(dy);    dx/=e;    dy/=e;    x=x1;    y=y1;   

4、 for(i=1;i<=e;i+)           putpixel(int)(x+0.5),(int)(y+0.5),GREEN);        x+=dx;        y+=dy;    void main()    int driver=VGA;    in

5、t mode=VGAHI;    initgraph(&driver,&mode,"");    DDALine(100,150,250,300 );    getch();    closegraph();运行结果: 2. 用Bresenham画线算法画直线,并完善算法功能,使之适应更广实验代码:#include<stdio.h>#include<graphics.h>void Bresenhamline(int

6、x1,int y1,int x2,int y2)    int x,y,dx,dy,p;    x=x1;    y=y1;    dx=x2-x1;    dy=y2-y1;    p=2*dy-dx;    for(;x<=x2;x+)            putpixel(x

7、,y,BLUE);        if(p>=0)                    y+;           p+=2*(dy-dx);         &

8、#160;      else                    p+=2*dy;            main()    int driver=VGA;    int mode=VGAHI; 

9、   initgraph(&driver,&mode,"");    Bresenhamline(50,150,200,250);    getch();    closegraph();运行结果:3.、对比Bresenham算法、DDA算法、中点算法三种算法的像素逼近效果和程序执行速度 三两种算法的像素逼近效果和程序执行速度。实验代码:#include <stdio.h>#include <graphics.h>#inclu

10、de <math.h>#include <bios.h>#include <time.h>#include <conio.h>void DrawZb();void BLine(int, int, int, int);void DDALine(int, int, int, int);void MidLine(int, int, int, int);void main() int i; char str20; long oldtime, newtime,time; int gd = VGA, gm = VGAHI; initgraph(&gd

11、, &gm, "D:TCTCPPBGI"); DrawZb(); outtextxy(10,10,"Welcome to this program!"); settextstyle(2,0,0); outtextxy(10,420,"Name : Lineswork 1.0"); outtextxy(10,430,"Information : Computer Graphics Work - lines"); outtextxy(10,440,"CopyRight : (C) Lewsn 2010

12、"); outtextxy(10,450,"Made by : Zhang Shaolei OUC 2010/12 "); settextstyle(0,0,0); setcolor(11); outtextxy(10,30,"Press to Bline! "); getch(); oldtime = biostime(0,0L); for(i = 0; i < 200; i+) BLine(0, 0, 200, 50); BLine(0, 0, 50, 200); BLine(0, 0, -50, 200); BLine(0, 0,

13、-200, 50); BLine(0, 0, -200, -50); BLine(0, 0, -50, -200); BLine(0, 0, 50, -200); BLine(0, 0, 200, -50); newtime = biostime(0,0L); time = (newtime - oldtime) * 1000 /CLK_TCK; sprintf(str, "Time: %d ms",time); outtextxy(170, 30, str); setcolor(10); outtextxy(10, 50, "Press to DDAline!

14、"); getch(); oldtime = biostime(0,0L); for(i = 0; i < 200; i+) DDALine(0, 0, 190, 80); DDALine(0, 0, 80, 190); DDALine(0, 0, -80, 190); DDALine(0, 0, -190, 80); DDALine(0, 0, -190, -80); DDALine(0, 0, -80, -190); DDALine(0, 0, 80, -190); DDALine(0, 0, 190, -80); newtime = biostime(0,0L); tim

15、e = (newtime - oldtime) * 1000 /CLK_TCK; sprintf(str, "Time: %d ms",time); outtextxy(170, 50, str); setcolor(12); outtextxy(10, 70, "Press to Midline! "); getch(); oldtime = biostime(0,0L); for(i = 0; i < 200; i+) MidLine(0, 0, 180, 100); MidLine(0, 0, 100, 180); MidLine(0, 0,

16、 -100, 180); MidLine(0, 0, -180, 100); MidLine(0, 0, -180, -100); MidLine(0, 0, -100, -180); MidLine(0, 0, 100, -180); MidLine(0, 0, 180, -100); newtime = biostime(0,0L); time = (newtime - oldtime) * 1000 /CLK_TCK ; sprintf(str, "Time: %d ms",time); outtextxy(170, 70, str); setcolor(14); g

17、etch(); setcolor(15); outtextxy(10,110,"Press to Exit! "); getch(); closegraph();void DrawZb() setcolor(15); line(320,10,320,470); line(20,240,620,240); line(320,10,315,15); line(320,10,325,15); line(615,235,620,240); line(615,245,620,240); return;void BLine(int x1, int y1, int x2, int y2)

18、 int i, e, exchange, xsign, ysign; int x, y, dx, dy; dx=abs(x2-x1); dy=abs(y2-y1); x=x1; y=y1; exchange=0; if(dy>dx) i=dx; dx=dy; dy=i; exchange=1; e=2*dy-dx; xsign=(x2>x1)? 1:-1; ysign=(y2>y1)? 1:-1; for(i=0; i<=dx; i+) putpixel(x+320, 240-y, 11); if(e>=0) e=e-2*dx; if(exchange) x+=x

19、sign; else y+=ysign; e=e+2*dy; if(exchange) y+=ysign; else x+=xsign; void DDALine(int x1,int y1,int x2,int y2) float x,y,dx,dy; int i,step; x = x1 + 0.5; y = y1 + 0.5; step = abs(x2 - x1) > abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1); dx = (float)(x2 - x1) / step; dy = (float)(y2 - y1) / step; for(i = 0; i<=step; i+) putpixel( (int)x+320, 240-(int)y, 10); x += dx; y += dy; void MidLine(int x1, int y1, int x2, int y2) if(abs(x1 - x2) <= 1 && abs(y1 - y2) <= 1) putpixel ( (int)(320 + (x1 + x2)/2 +0.5), (int)(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论