结果图: 代码: import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; import javax.swing.JFrame; public class test { private static int dbline = 20; private static int currentPoint = 1; private static ArrayList<Integer> lineCountList = new ArrayList<Integer>(); private static int lineNumber, pointIndex; private static int x, y; private static JFrame f = new JFrame(); public static void main(String args[]) throws IOException { inti(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(500, 500); f.setVisible(true); f.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { Graphics g = f.getLayeredPane().getGraphics(); g.setColor(Color.DARK_GRAY); g.drawLine(0, 250, 500, 250); g.drawLine(250, 0, 250, 500); int oldx=-1,oldy=-1; while (currentPoint <= 80) { int[] locate=getPointLocate(); int dx,dy; dx=250+locate[0]*40; dy=250-locate[1]*40; g.setColor(Color.green); g.fillArc(dx, dy, 8, 8, 0, 360); g.setColor(Color.red); if(oldx!=-1&&oldy!=-1){ g.drawLine(oldx, oldy, dx, dy); } oldx=dx; oldy=dy; g.setColor(Color.blue); g.drawString(""+currentPoint, dx, dy); g.setColor(Color.red); currentPoint++; } } }); } private static void inti() { lineCountList.clear(); for (int i = 1; i < dbline; i++) { int currentLineCount = 2 * i; lineCountList.add(currentLineCount); } } public static void getLineNumber() { int algPoint = currentPoint; for (int o : lineCountList) { if (algPoint > o) algPoint = algPoint - o; else { pointIndex = algPoint; lineNumber = o / 2; return; } } } private static int [] getPointLocate() { getLineNumber(); boolean isEven = (lineNumber % 2 == 0); boolean isLittle; int pointLocate = pointIndex - (lineNumber + 1); if (pointLocate <= 0) isLittle = true; else isLittle = false; if (isEven && isLittle) { y = lineNumber / 2; x = lineNumber / 2 - (pointIndex - 1); } if (isEven && !isLittle) { x = -lineNumber / 2; y = lineNumber / 2 - pointLocate; } if (!isEven && isLittle) { y = -(lineNumber - 1) / 2; x = -(lineNumber - 1) / 2 + (pointIndex - 1); } if (!isEven && !isLittle) { x = (lineNumber + 1) / 2; y = -(lineNumber - 1) / 2 + pointLocate; } int [] locate=new int[]{x,y}; return locate; } }