传一个小几何程序小女不才我记得当时思考了好几天才弄出来,O(∩_∩)O


设计一个GUI程序,在窗口中用鼠标单击绘制圆(所有圆的大小相同,且圆可以存储),用鼠标拖动在圆间绘制连线(连线要求是通过两个圆心的直线,且是从一个圆的边界绘制到另一个圆的边界,并且有箭头)的程序。

import javax.swing.JFrame;
public class Draw {
    public static void main(String[] args) {
    JFrame frame =new JFrame("画圆");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    frame.add(new DrawPanel());
    
    frame.pack();
    frame.setVisible(true);
    }

}
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class DrawPanel extends JPanel{
    private final int r=50;
    Point p,p1,p2;
    int l1=-1,l2=-1;
    int a,b,c,d,g,h;
    ArrayList<Point> l=new ArrayList<Point>();ArrayList<line> al=new ArrayList<line>();
    //用ArrayList进行存储
    public DrawPanel(){
        DrawListener listen=new DrawListener();
        addMouseListener(listen);
        addMouseMotionListener(listen);
        setBackground(Color.black);
        setPreferredSize(new Dimension(400,700));
    }
    public void paintComponent(Graphics page){
        super.paintComponent(page);
        page.setColor(Color.yellow);
        
        for(Point po:l)
        {
          if(po!=null)
             page.drawOval(po.x-r,po.y-r,2*r,2*r);
        }
        for(line n:al){     //核心算法,这里我用了相似  程序中15和5分别控制箭头的大小
            if(n!=null){
             a=(int)(r*(n.b.x-n.a.x)/Math.sqrt((n.a.x-n.b.x)*(n.a.x-n.b.x)+(n.a.y-n.b.y)*(n.a.y-n.b.y)));
             b=(int)(r*(n.b.y-n.a.y)/Math.sqrt((n.a.x-n.b.x)*(n.a.x-n.b.x)+(n.a.y-n.b.y)*(n.a.y-n.b.y)));
             c=(int)((r+15)*(n.b.x-n.a.x)/Math.sqrt((n.a.x-n.b.x)*(n.a.x-n.b.x)+(n.a.y-n.b.y)*(n.a.y-n.b.y)));
             d=(int)((r+15)*(n.b.y-n.a.y)/Math.sqrt((n.a.x-n.b.x)*(n.a.x-n.b.x)+(n.a.y-n.b.y)*(n.a.y-n.b.y)));
             g=5*b/r;
             h=5*a/r;
            int Xpoint[]=new int[3];int Ypoint[]=new int[3];
            Xpoint[0]=n.b.x-c-g;Xpoint[1]=n.b.x-c+g;Xpoint[2]=n.b.x-a;
            Ypoint[0]=n.b.y-d+h;Ypoint[1]=n.b.y-d-h;Ypoint[2]=n.b.y-b;
            page.drawLine(n.a.x+a, n.a.y+b,n.b.x-a,n.b.y-b);            
            page.fillPolygon(Xpoint, Ypoint, 3);}
        }
    class line{
            private Point a,b;
            line(Point p1,Point p2){
                a=p1;
                b=p2;
            }
        }
    private class DrawListener implements MouseListener,MouseMotionListener{
        
        public void mousePressed(MouseEvent event){
            l2=-1;l1=-1;p1=event.getPoint();
            for(int i=0;i<l.size();i++) {
              if(Math.sqrt((l.get(i).x-p1.x)*(l.get(i).x-p1.x)+(l.get(i).y-p1.y)*(l.get(i).y-p1.y))<r) l1=i;}
            repaint();
        }
         
        public void mouseClicked(MouseEvent event){
          p=event.getPoint();
          int f=1;
          if(l.size()==0 ){ repaint();l.add(p);}
          else{
              for(int i=0;i<l.size();i++) {
                  if(Math.sqrt((l.get(i).x-p.x)*(l.get(i).x-p.x)+(l.get(i).y-p.y)*(l.get(i).y-p.y))<2*r) f=0;}
              if(f==1){repaint();l.add(p);}  
          }
        }
        public void mouseReleased(MouseEvent event){
        p2=event.getPoint();
        for(int i=0;i<l.size();i++) {
                  if(Math.sqrt((l.get(i).x-p2.x)*(l.get(i).x-p2.x)+(l.get(i).y-p2.y)*(l.get(i).y-p2.y))<r) l2=i;}
        repaint();
        if(l1!=-1&&l2!=-1){al.add(new line(l.get(l1),l.get(l2)));}    }
        public void mouseEntered(MouseEvent event){}
        public void mouseExited(MouseEvent event){}
         public void mouseMoved(MouseEvent event){}
         public void mouseDragged(MouseEvent event){
         p2=event.getPoint();
        }
        
    }
}

spacer.gifwKioL1Zn7VCTUPfeAAG9gD8NvWw737.jpg单击画圆,在任意两圆之间拖动画出带有方向的连线!

相似代码最少,其他的还有弧度法!j_0059.gif