java 画线段(bresenham,mid-bresenham)

来源:互联网 发布:蜜桃诱导充值视频源码 编辑:程序博客网 时间:2024/05/31 19:16
package myline;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import javax.swing.JLayeredPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JCheckBox;
import javax.swing.AbstractAction;
import javax.swing.Action;


public class line extends JFrame {
 
 private JTextField textField;
 private JTextField textField_1;
 private JTextField textField_2;
 private JTextField textField_3;
 
 
 public line() {
  setBounds(450, 300, 450, 300);
  
  JLayeredPane layeredPane = new JLayeredPane();
  getContentPane().add(layeredPane, BorderLayout.CENTER);
  
  textField = new JTextField();
  textField.setBounds(116, 154, 66, 21);
  layeredPane.add(textField);
  textField.setColumns(10);
  
  
  textField_1 = new JTextField();
  textField_1.setBounds(209, 153, 66, 21);
  layeredPane.add(textField_1);
  textField_1.setColumns(10);
  
  
  textField_2 = new JTextField();
  textField_2.setBounds(116,104 , 66, 21);
  layeredPane.add(textField_2);
  textField_2.setColumns(10);
  
  
  textField_3 = new JTextField();
  textField_3.setBounds(209, 104, 66, 21);
  layeredPane.add(textField_3);
  textField_3.setColumns(10);
  
  JCheckBox chckbxMidbresenham = new JCheckBox("mid-bresenham");
  chckbxMidbresenham.setBounds(299, 103, 103, 23);
  layeredPane.add(chckbxMidbresenham);
  chckbxMidbresenham.setSelected(false);

  JCheckBox chckbxBresenham = new JCheckBox("bresenham");
  chckbxBresenham.setBounds(299, 153, 103, 23);
  layeredPane.add(chckbxBresenham);
  chckbxBresenham.setSelected(false);

  
  JButton btnOjk = new JButton("ok");
  btnOjk.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {
    if(arg0.getSource()==btnOjk){
     chckbxMidbresenham.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(chckbxMidbresenham.isSelected()){
                 String a=textField_2.getText();
        String b=textField_3.getText();
        String c=textField.getText();
        String d=textField_1.getText();
        boolean flag=true;
        dispose();
        jjjj j=new jjjj(a,b,c,d,flag);
        j.setVisible(true);
        System.out.println("mid");
               
                }
            }
        });

     chckbxBresenham.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(chckbxBresenham.isSelected()){
                 String aa=textField_2.getText();
        String bb=textField_3.getText();
        String cc=textField.getText();
        String dd=textField_1.getText();
        boolean flagg=true;
        dispose();
        jjjj j=new jjjj(aa,bb,cc,dd,flagg);
        j.setVisible(true);
        System.out.println("not mid");
                }
            }
        });

    }
   }
  });
  btnOjk.setBounds(100, 200, 93, 23);
  layeredPane.add(btnOjk);
  
  JTextArea txtrX = new JTextArea();
  txtrX.setEnabled(false);
  txtrX.setText("\u8D77\u59CB\u5750\u6807");
  txtrX.setBounds(26, 103, 66, 24);
  layeredPane.add(txtrX);
  
  JTextArea txtrY = new JTextArea();
  txtrY.setEnabled(false);
  txtrY.setText("\u7EC8\u70B9\u5750\u6807");
  txtrY.setBounds(26, 153, 72, 24);
  layeredPane.add(txtrY);
  

    

 }

   

    public static void main(String[] args){

                line a=new line();
                a.setVisible(true);

    }
 

}


package myline;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class jjjj extends JFrame {

 private JPanel contentPane;
 public String x000;
 public String y000;
 public String x111;
 public String y111;
 public boolean flag=false;

 /**
  * Launch the application.
  */


 /**
  * Create the frame.
  */
 public jjjj(String x00,String y00,String x11,String y11,boolean flag) {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(450, 300, 450, 300);
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  contentPane.setLayout(new BorderLayout(0, 0));
  setContentPane(contentPane);
  this.x000=x00;
  this.y000=y00;
  this.x111=x11;
  this.y111=y11;
  this.flag=flag;
 }

 public int rex0(){
  int x0=Integer.parseInt(this.x000);
  return x0;
 }
 public int rey0(){
  int y0=Integer.parseInt(this.y000);
  return y0;
 }
 public int rex1(){
  int x1=Integer.parseInt(this.x111);
  return x1;
 }
 public int rey1(){
  int y1=Integer.parseInt(this.y111);
  return y1;
 }
 public boolean ref(){
  return this.flag;
 }
    // @Override

  public void paint(Graphics g) {

     
   super.paint(g);
      int x0,y0,x1,y1,k;
      boolean fl=false;
      x0=this.rex0();
      y0=this.rey0();
      x1=this.rex1();
      y1=this.rey1();
      fl=this.ref();
      int dx=x1-x0;
      int dy=y1-y0;
      k=dy/dx;
      if((k<0)&&(k>=-1)){
       if(fl==true){
        int D=dx+2*dy;
        int x=x1,y=y1;
        while(x>=x0){
         g.drawLine(x,y,x,y);
         if(D<0){
          x--;
          y++;
          D=D+2*dx+2*dy;
         }
         else{
          x--;
          D=D+2*dy;
         }
        }
       }
      }
      else if(k<-1){
       if(fl==true){
        int D=dy+2*dx;
        int x=x1,y=y1;
        while(y>=y0){
         g.drawLine(x,y,x,y);
         if(D<0){
          y--;
          x++;
          D=D+2*dy+2*dx;
         }
         else{
          y--;
          D=D+2*dx;
         }
        }
       }
      }
  
      else if(k<=1){
     if(fl==true)
     {
        int d=dx-2*dy;
              int x=x0,y=y0;
              while(x<=x1){
             g.drawLine(x,y,x,y);
             if(d<0){
              x++;
              y++;
              d=d+2*dx-2*dy;
             }
             else{
              x++;
              d=d-2*dy;
             }
       
            }
     }
      if(fl==false){
       int e=-dx;
       int xx=x0,yy=y0;
       while(xx<=x1){
        g.drawLine(xx,yy,xx,yy);
        e=e+2*dy;
        if(e>0){
         yy++;
         xx++;
         e=e-2*dx;
        }
        else{
         xx++;
        }
       }
      }}
      else if(k>1){
       if(fl==true)
          {
            int d=dy-2*dx;
          int x=x0,y=y0;
          while(y<=y1){
           g.drawLine(x,y,x,y);
           if(d<0){
            x++;
            y++;
            d=d+2*dy-2*dx;
           }
           else{
            y++;
            d=d-2*dx;
           }
           
          }}
          if(fl==false){
           int e=-dy;
           int xx=x0,yy=y0;
           while(yy<=y1){
            g.drawLine(xx,yy,xx,yy);
            e=e+2*dx;
            if(e>0){
             yy++;
             xx++;
             e=e-2*dy;
            }
            else{
             yy++;
            }
           }
          }
      }
 
    

  }

}

ps:

坐标只能是正的,斜率正负都可以,但斜率负的时候只能用bresenham算法

输入两点坐标后,先点击ok,然后再选择算法类型

0 0
原创粉丝点击