传一个小几何程序,小女不才,我记得当时思考了好几天才弄出来,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();
}
}
}
转载于:https://blog.51cto.com/10979088/1721226