《计算机图形学》实验3实验报告
实验题目:直线(光栅化)实数型Bresenham算法
在用户坐标系和Java AWT坐标系下显示图像
实验内容:1 直线(光栅化)实数型Bresenham算法原理及程序。
2 直线(光栅化)DDA算法原理及程序。
3 在用户坐标系和Java AWT坐标系下显示图像的算法原理及实现。
写程序调用验证之。
参考资料:1 课件:光栅图形生成算法.PPT
2 Bresenham算法演示程序已经在MyCanvas包里,DDA算法applet演示程序DDA.java
3 有一个示范程序imageDrawApplet.java
基本概念:
直线(光栅化):画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列、并填入彩数据的过程。这过程称为直线光栅化。
Bresenham算法:Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。
DDA算法:DDA算法(Digital Differential Analyzer),又称数值微分法,是计算机图形学中一种基于直线的微分方程来生成直线的方法。
算法设计:(详细叙述自己设计的Bresenham算法以及程序的功能、不同坐标系下图像显示的算法)
Bresenham算法:
基本原理:选择的原则是看精确值y与yi及yi+1的距离d1及d2的大小而定。
用坐标为(xi,yi,r)的象素来表示直线上的点,则第 i+1个点只能在C和D中选取。令d1=BC ,d2=DB
d1-d2=(yi+1–yi,r)-( yi,r+1-yi+1)
=2yi+1–yi,r–(yi,r+1)
= 2yi+1–2yi,r–1
令 ε(xi+1)= yi+1–yi,r–0.5
=BC-AC=BA=B-A
= yi+1–(yi,r+ yi,r+1)/2
当ε(xi+1)≥0时,yi+1,r= yi,r+1,即选D点,即下个点( xi+1,yi+1 )对应的象素( xi+1, yi+1,r )为( xi+1, yi,r+1 )
当ε(xi+1)<0时,yi+1,r= yi,r,即选C点,即下个点( xi+1,yi+1 )对应的象素( xi+1, yi+1,r )为( xi+1, yi,r )
ε(xi+1)= yi+1–yi,r–0.5
ε(xi+1)≥0时,yi+1,r= yi,r+1
ε(xi+1)<0时,yi+1,r= yi,r
程序功能:用DDA算法画出直线,在不同的坐标系下显示图像。
用户坐标系下图像显示算法:定义自己的坐标系,将用户坐标系转换为Java awt坐标,调用Graphics类的drawImage方法即可。
Awt坐标系下图像显示算法:直接调用Graphics类的drawImage方法即可。
代码:
/
/imageDrawApplet.java
//图像显示程序
import java.applet.*;
import java.awt.*;
import java.*; //使用java network 包
import MyCanvas.MyCanvas; //引入自制包中的类MyCanvas
//===定义imageDrawApplet类======
public class imageDrawApplet extends Applet {
protected Image image; //图像对象
protected URL imageURL; //文件的URL
protected String imageFile="熊猫.jpg"; //文件路径名
protected MyCanvas m; //定义MyCanvas的对象
public void init() { //初始化
setSize(640, 400);
try{ //生成存放图像数据文件的URL
imageURL=new URL(getDocumentBase(),imageFile);
}catch(MalformedURLException e){};
MediaTracker mt= new MediaTracker(this); //剪辑对象
image=getImage(imageURL); //获取图像
mt.addImage(image,1); //将图像追加到第一个剪辑
try{
mt.waitForID(1); //等待第一个剪辑就绪
}catch(InterruptedException e) {};
m=new MyCanvas(this); //生成MyCanvas的对象
}
public void paint(Graphics g){ //绘图方法
/*在用户坐标系下显示图像*/
m.myDrawImage(image,0,0,this);
/*在Java AWT坐标系下显示图像*/
g.drawImage(image,0,0,this);
}
} //类imageDrawApplet结束
//用DDA算法画直线
package lianxi;
import java.awt.*;
import java.applet.Applet;
public class DDA extends Applet
{
int startX=50,startY=50,endX=150,endY=150;
Color d;
public void paint(Graphics g)
{
g.setColor(color);
dda(g,startX,startY,endX,endY);
}
//DDA算法:参数为直线的起点和终点
void dda(Graphics g,int x1,int y1,int x2,int y2)
{
int k;
float x,y,dx,dy;
k=Math.abs(x2-x1); //直线最小方向位移在X还是Y向?
if(k<Math.abs(y2-y1))
k=Math.abs(y2-y1);
dx=(x2-x1)/k; //增量
dy=(y2-y1)/k;
x=x1;
y=y1;
for(int i=0;i<k;i++) { //斜线段在坐标方向增量小于1,为的是不漏掉每一个像素。
g.drawLine((int)(x+0.5f),(int)(y+0.5f),(int)(x+0.5f),(int)(y+0.5f)); //也可以调用点亮像素的方法
x+=dx;
电脑如何截屏 y+=dy;
}
}
}
运行结果:(给出运行结果的截屏和说明)
1、在java AWT坐标系下的显示图像:
2、在用户坐标系下显示的图像
3、在不同坐标系下的显示图像:
4、用DDA算法画直线:
4
实验体会:
通过本次实验初步了解了直线光栅化实数型bresenham算法、DDA算法以及在不同坐标系下显示图像的算法并且理解了直线光栅化的原理。Java程序的使用还是不能做到熟练,仍然需要多上机练习。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论