计算机图形学-直线算法bda,正负法MidpointLine,Bresenham算法,Bresenham改进算法

    技术2022-05-13  31

    import javax.swing.JFrame;

    public class MyDrawLine {  public static void main(String args[]){ //  dda(3,1,45,14); //  midpointLine(3,1,45,14); //  bresenham(3,1,45,14);   bresenham2(3,1,45,14);  }  public static void dda(int x1,int y1,int x2,int y2){   JFrame frame=new JFrame();   TwoDimen env=new TwoDimen();   frame.getContentPane().add(env);   frame.setBounds(100, 100, 600, 600);   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setResizable(false);   frame.setVisible(true);   int k,i;   float x,y,dx,dy;   k=Math.abs(x2-x1);   if(Math.abs(y2-y1)>k){    k=Math.abs(y2-y1);   }   dx=(float)(x2-x1)/k;   dy=(float)(y2-y1)/k;   x=(float)x1;   y=(float)y1;   for(i=0;i<k;i++){    env.drawPoint((int)(x+0.5), (int)(y+0.5));    x=x+dx;    y=y+dy;   }  }  public static void midpointLine(int xs,int ys,int xe,int ye){   JFrame frame=new JFrame();   TwoDimen env=new TwoDimen();   frame.getContentPane().add(env);   frame.setBounds(100, 100, 600, 600);   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setResizable(false);   frame.setVisible(true);   int a,b,dt1,dt2,d,x,y;   a=ys-ye;   b=xe-xs;   d=2*a+b;   dt1=2*a;   dt2=2*a+2*b;   x=xs;   y=ys;   env.drawPoint(x, y);   while(x<xe){    if(d<0){     x++;     y++;     d=d+dt2;    }    else{     x++;     d=d+dt1;    }    env.drawPoint(x, y);   }  }  public static void bresenham(int xs,int ys,int xe,int ye){   JFrame frame=new JFrame();   TwoDimen env=new TwoDimen();   frame.getContentPane().add(env);   frame.setBounds(100, 100, 600, 600);   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setResizable(false);   frame.setVisible(true);   int dx,dy,i,x,y;   double m,e;   dy=ye-ys;   dx=xe-xs;   m=(double)dy/(double)dx;   e=m-0.5;   x=xs;   y=ys;   for(i=0;i<dx;i++){    env.drawPoint(x,y);    if(e>=0){     y=y+1;e=e-1;    }    x=x+1;e=e+m;   }  }  public static void bresenham2(int xs,int ys,int xe,int ye){   JFrame frame=new JFrame();   TwoDimen env=new TwoDimen();   frame.getContentPane().add(env);   frame.setBounds(100, 100, 600, 600);   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setResizable(false);   frame.setVisible(true);   int dx,dy,i,x,y;   double m,e;   dy=ye-ys;   dx=xe-xs;   m=(double)dy/(double)dx;   e=2*m-0.5;   x=xs;   y=ys;   for(i=0;i<dx;i++){    if(e+0.5<0.25*2){     env.drawPoint(x+1, y);     env.drawPoint(x+2, y);    }    else if(e+0.5<0.5*2){     env.drawPoint(x+1,y);     env.drawPoint(x+2,y+1);    }    else if(e+0.5<0.75*2){     env.drawPoint(x+1,y+1);     env.drawPoint(x+2,y+1);    }    else{     env.drawPoint(x+1, y+1);     env.drawPoint(x+2, y+2);    }    if(e>1){     y=y+2;e=e-2;    }else if(e>0){     y=y+1;e=e-1;    }else{     y=y;e=e;    }    x=x+1;e=e+m;   }  } }

    class TwoDimen extends JPanel {  private boolean[][] data;  public TwoDimen() {   data = new boolean[100][100];   initialData(data);   this.setBounds(100, 100, 500, 500);   this.setVisible(true);  }

     public void initialData(boolean[][] data) {   for (int i = 0; i < data.length; i++) {    for (int j = 0; j < data[i].length; j++) {     data[i][j] = false;    }   }   repaint();  }  public void drawPoint(int i,int j){   data[i+49][50-j]=true;   repaint();  }  @Override  public void paint(Graphics g) {   // TODO Auto-generated method stub   super.paint(g);   g.drawLine(0, 250, 500, 250);   g.drawLine(250, 0, 250, 500);   for (int i = 0; i < data.length; i++) {    for (int j = 0; j < data[i].length; j++) {     if (data[i][j]) {      g.fillRect(5 * i, 5 * j, 5, 5);     }    }   }   // g.fillRect(100, 100, 5, 5);  } }


    最新回复(0)