1、图形学实验报告画直线圆剪裁一实验目的:1理解并掌握中点画线算法的基本思想和算法实现在面板随意位置画线。2理解并掌握中点画圆算法的基本思想和算法实现在面板以任意位置为圆心画半径任意的圆。3. 理解并掌握裁剪直线的基本思想和算法实现在任意绘制的矩形中裁剪所画直线。二 实验内容:1 中点画线 1.1基本原理:假定直线斜率|k|=1,且已确定当前象素点P(Xp ,Yp ),然后确定下一个象素点,即T 或B之一。M为T,B中点,Q为理想直线与栅格线的交点。若M在Q的下方,选T,否则选B。使用直线的正负划分性来判断M和Q的位置关系(即:F(x,y)a*x+b*y+c=0)。然后构造判别式:d=F(M)=F
2、(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c其中a=y0-y1, b=x1-x0, c=x0y1-x1y0当d0,M在L(Q点)上方,取右方B为下一个象素;当d=0,选T或B均可,约定取B为下一个象素判断了M的位置之后则可以依次的画出各个点,从而得到一条直线。但是上面的这个算法存在浮点运算,所以将其乘以2去掉浮点运算,实现整数运算,提高效率。而对于|k|1的情况,只需将x与y的位置对调考虑则很容易得到正确的算法实现。并且在本次的中点算法中可以绘制任意斜率的直线。1.2函数流程直线方程:a*x+b*y+c=0, p1(x1,y1), p2(x2,y2)= a=y1-y2;b
3、=x2-x1.点到直线的距离:distance=|a*x0-b*y0+c|/sqrt(a*a + b*b)设directionX,directionY分别为从(x1,y1)=(x2,y2)的单位变化量(+/-1)当直线偏向X轴时,当前象素为(xk, yk),下一个象素可能为:(xk+directionX, yk)或者(xk+directionX,yk+directionY)这两点到直线的距离分别为: d1=|a*xk+b*yk+c+a*directionX|/sqrt(a*a + b*b); d2=|a*xk+b*yk+c+a*directionX+b*directonY|/sqrt(a*a
4、+ b*b);便于运算,定义:f(xk,yk)= d2 * d2 - d1 * d1 (将d1和d2的分母去掉了的)= b*b + *b*directonY*(a*xk+b*yk+c+a*directionX) ;当f(xk,yk)=0的时候,下一个点为(xk+directionX, yk) :f(xk+directionX, yk) = f(xk,yk) + 2*a*b*directionX*directionY ;当直线偏向Y轴时,当前象素为(xk, yk),下一个象素可能为:(xk, yk+directionY)或者(xk+directionX,yk+directionY)这两点到直线的
5、距离分别为:d1=|a*xk+b*yk+c+b*directionY|/sqrt(a*a + b*b);d2=|a*xk+b*yk+c+b*directionY+a*directonX|/sqrt(a*a + b*b);便于运算,定义:f(xk,yk)= d2 * d2 - d1 * d1 (将d1和d2的分母去掉了的)= a*a + *a*directonX*(a*xk+b*yk+c+b*directionY) ;当f(xk,yk)=0的时候,下一个点为(xk+directionX, yk) :f(xk+directionX, yk) = f(xk,yk) + 2*a*b*direction
6、X*directionY ;1.3截图2 中点画圆2.1基本原理:对于圆上的点,F(x, y)=0;对于圆外的点,F(x, y)0;而对于圆内的点,F(x, y) 0。假设M是P1和P2的中点,即M =(xp+1, yp-0.5)。那么,当F(M) e.getX() /获取xmin,xmax,ymin,ymax绘制剪裁矩形 xmin = e.getX(); xmax = xstart; else xmin = xstart; xmax = e.getX(); if (ystart e.getY() ymin = e.getY(); ymax = ystart; else ymin = ysta
7、rt; ymax = e.getY(); if (xmin width) xmax = width; if (ymin height) ymax = height; clip.drawRectBoth(xmin, ymin, xmax, ymax); clip.setClipRect(xmin, ymin, xmax, ymax); public void mouseMoved(MouseEvent e) void resetSize(int width, int height) /绘图面板 if (this.width = width & this.height = height) retu
8、rn; this.width = width; this.height = height; bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); g2 = (Graphics2D) bi.getGraphics(); g2.setColor(Color.white); g2.fillRect(0, 0, width, height); g2.dispose(); setSize(width, height); public void clear()/清屏 g2 = (Graphics2D) bi.getGraphi
9、cs(); g2.setColor(Color.white); g2.fillRect(0, 0, width, height); g2.dispose(); paint(getGraphics(); public void paint(Graphics g) g.drawImage(bi, 0, 0, width, height, this); public void update(Graphics g) paint(g); public void stop() public void setOperate(int op) currentOperate = op; needConnectPo
10、int = false; public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) MainFrame mf; BufferedImage bi; LineOP line; ClipOP clip; CircleOP circle; Graphics2D g2; int xstart; int ystart; int xcurrent; int ycurrent; int xend; int yend; private int xmin; private int ymin; private int xmax; private int ymax; int width = 0; int height = 0; int currentOperate = DrawLine; Color color;boolean needConnectPoint = false; public static final int DrawLine = 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1