1、1一实验目的:1理解并掌握中点画线算法的基本思想和算法实现在面板随意位置画线。2理解并掌握中点画圆算法的基本思想和算法实现在面板以任意位置为圆心画半径任意的圆。3. 理解并掌握裁剪直线的基本思想和算法实现在任意绘制的矩形中裁剪所画直线。二 实验内容:1 中点画线1.1 基本原理:假定直线斜率|k|0,M 在 L(Q 点)上方,取右方 B 为下一个象素;当 d=0,选 T 或 B 均可,约定取 B 为下一个象素判断了 M 的位置之后则可以依次的画出各个点,从而得到一条直线。但是上面的这个算法存在浮点运算,所以将其乘以 2 去掉浮点运算,实现整数运算,提高效率。而对于|k|1 的情况,只需将 x
2、与 y 的位置对调考虑则很容易得到正确的算法实现。并且在本次的中点算法中可以绘制任意斜率的直线。1.2 函数流程直线方程:a*x+b*y+c=0, p1(x1,y1), p2(x2,y2)= a=y1-y2;b=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)这两点
3、到直线的距离分别为: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 + b*b);便于运算,定义:f(xk,yk)= d2 * d2 - d1 * d1 (将 d1 和 d2 的分母去掉了的)2= 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*
4、b*directionX*directionY ;当直线偏向 Y 轴时,当前象素为(xk, yk),下一个象素可能为:(xk, yk+directionY)或者(xk+directionX,yk+directionY)这两点到直线的距离分别为: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*directon
5、X*(a*xk+b*yk+c+b*directionY) ;当 f(xk,yk)=0 的时候,下一个点为(xk+directionX, yk) :f(xk+directionX, yk) = f(xk,yk) + 2*a*b*directionX*directionY ;1.3 截图32 中点画圆2.1 基本原理:对于圆上的点,F(x, y)=0;对于圆外的点,F( x, y)0;而对于圆内的点,F(x, y) e.getX() /获取 xmin,xmax,ymin,ymax 绘制剪裁矩形 xmin = e.getX(); xmax = xstart; else xmin = xstart;
6、xmax = e.getX(); if (ystart e.getY() ymin = e.getY(); ymax = ystart; else ymin = ystart; 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 resetSi
7、ze(int width, int height) /绘图面板if (this.width = width 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 v
8、oid clear()/清屏g2 = (Graphics2D) bi.getGraphics(); g2.setColor(Color.white);g2.fillRect(0, 0, width, height); g2.dispose();paint(getGraphics();11public 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
9、(int op) currentOperate = op; needConnectPoint = 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; in
10、t 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; public static final int drawcircle = 2; public static
11、 final int SegmentClip = 4;DRAWOP :import java.awt.*; import java.awt.image.*; import javax.swing.*;import java.awt.event.*; import javax.swing.event.*; import javax.swing.border.*;import java.math.*;public class DrawOPPanelEX p; int DelayTime; boolean Delay; Color color; Color t;BufferedImage bi; G
12、raphics g; boolean stop; Graphics2D g2; int mask=0;int RGB;public static final int PUSHBACK=1; public static final int XOR=2;public static final int ONSCREEN=4; public static final int BOTH=8;DrawOP(PanelEX p) this.p=p; stop=false; DelayTime=0; color=Color.black; public void initGraphics()g=p.getGra
13、phics(); bi=p.bi; g2=(Graphics2D)bi.getGraphics();g.setColor(color); g2.setColor(color);public int getPixel(int x,int y) return bi.getRGB(x,y); public void setMask(int m) mask=m; 12public void setDelay() Delay=true; public void clrDelay() Delay=false; public void setColor(Color c) color=c; public vo
14、id setDelayTime(int t) DelayTime=t; public void stop() stop=true; public void start() stop=false; void setPixel(int x,int y)if(x=p.width | x=p.height | yy2) ys=y2; ye=y1; xs=x2; ki=(double)(x1-x2)/(y1-y2); Else ys=-1; ki=0; next=null;13LINEOPimport java.awt.*; import java.awt.image.*; import javax.s
15、wing.*;import java.awt.event.*; import javax.swing.event.*; import javax.swing.border.*;import java.math.*;public class LineOP extends DrawOPClipOP clip; LineEX clipSeg; LineEX l;LineOP(PanelEX p,ClipOP clip) super(p); this.clip=clip; public void MidPoint(int x1,int y1,int x2,int y2)l=clip.clip(x1,y
16、1,x2,y2);if(l=null) return;elsex1=l.x1; y1=l.y1; x2=l.x2; y2=l.y2;setDelay(); setMask(LineOP.BOTH);initGraphics(); drawLineM(x1,y1,x2,y2);public void pushBack(int x1,int y1,int x2,int y2)clrDelay(); setMask(LineOP.PUSHBACK);initGraphics(); drawLineM(x1,y1,x2,y2);public void pushForward(int x1,int y1
17、,int x2,int y2)clrDelay(); setMask(LineOP.ONSCREEN);initGraphics(); drawLineM(x1,y1,x2,y2);public void drawLineM(int startX,int startY,int endX,int endY)int a, b ;a = startY - endY ; b = endX - startX ;int iDirectionX, iDirectionY ;iDirectionX = iDirectionY = 1 ;if(b(x2,y2)的单位变化量(+/-1)if(a0) iDirect
18、ionY = -1 ;int iDistance;/distance 为点到直线的距离int iDeltaSmall, iDeltaBig ,iCurrX, iCurrY ; int iStep ;iDeltaSmall = 2*a*b*iDirectionX*iDirectionY ;/2abiCurrX = startX ; iCurrY = startY ;if(Math.abs(b) Math.abs(a)/abs:求绝对值iDeltaBig = 2*b*b + iDeltaSmall ; iDistance = b*b + iDeltaSmall ;14iStep = Math.ab
19、s(b) ;while (iStep- 0)setPixel(iCurrX,iCurrY); iCurrX += iDirectionX ;if(iDistance 0)setPixel(iCurrX,iCurrY); iCurrY += iDirectionY ;if(iDistance xmax) code|=xmaxmask; else if(xymax) code|=ymaxmask; else if(yx2)t=x1;x1=x2;x2=t; if(y1y2)t=y1;y1=y2;y2=t;drawRectEX(x1,y1,x2,y2);public void pushForward(
20、int x1,int y1,int x2,int y2)clrDelay(); setMask(LineOP.ONSCREEN);initGraphics(); int t;if(x1x2)t=x1;x1=x2;x2=t; if(y1y2)t=y1;y1=y2;y2=t;drawRectEX(x1,y1,x2,y2);public void drawRectBoth(int x1,int y1,int x2,int y2)clrDelay(); setMask(LineOP.BOTH);initGraphics(); g.setColor(Color.RED);g2.setColor(Color.RED); int t;if(x1x2)t=x1;x1=x2;x2=t; if(y1y2)t=y1;y1=y2;y2=t;drawRectEX(x1,y1,x2,y2);public void drawRectEX(int x1,int y1,int x2,int y2)int i;for(i=y1;i=y2;i+) setPixel(x1,i); setPixel(x2,i); for(i=x1;i=x2;i+) setPixel(i,y1); setPixel(i,y2);