传一个小几何程序,小女不才,我记得当时思考了好几天才弄出来,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(); } } }