我用java编的多边形裁剪程序,但是有时候能运行,有时候不能运行,大虾帮看下
这是线段裁剪的类,我不知道哪里出问题了……这里我采用了Point intersection(Point p1, Point p2, Point p3, Point p4) 这个函数来进行输入线段和多边形每条线段之间的求交点,当没有交点的时候就返回(0,0),各位大虾快帮我看下阿,想了好几天了,压抑阿
程序代码:
class cutall extends JFrame { JLabel title1, title2, title3, title4; JTextField t1, t2, t3, t4, t5; JPanel pane, pan, pa,pb; int width = getToolkit().getScreenSize().width, minx = -width / 2, maxx = width / 2; int height = getToolkit().getScreenSize().height, miny = -height / 2, maxy = height / 2; JButton butt; int rows, rotate[] = new int[1];// rows表示点数 JTable table; Object a[][]; Object name[] = { "横坐标", "纵坐标" }; cutall() { pane = new JPanel(); pan = new JPanel(); pa = new JPanel(); pb =new JPanel(); pane.setLayout(new GridLayout(5, 1)); title1 = new JLabel("范围(" + minx + "," + miny + ")到(" + maxx + "," + maxy + ")"); title2 = new JLabel( " 请按照顺时针或者逆时针输入多边形所有点"); title4 = new JLabel("请输入线段的两个端点坐标:"); title3 = new JLabel("输入截线段多边形点的个数,回车确认 "); butt = new JButton("设置完成"); t1 = new JTextField(10); t2 = new JTextField(5); t3 = new JTextField(5); t4 = new JTextField(5); t5 = new JTextField(5); pa.add(title4); pa.add(t2); pa.add(t3); pb.add(title1); pb.add(t4); pb.add(t5); pane.add(pa); pane.add(pb); pan.add(title3); pan.add(t1); t1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rows = Integer.parseInt(t1.getText()); a = new Object[rows][2]; for (int i = 0; i < rows; i++) { for (int j = 0; j < 2; j++) a[i][j] = 0; } table = new JTable(a, name); table.setRowHeight(20); getContentPane().removeAll(); add(pane, BorderLayout.NORTH); add(butt, BorderLayout.SOUTH); add(new JScrollPane(table), BorderLayout.CENTER); validate(); } }); butt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Point p1 = new Point(Integer.parseInt(t2.getText()), Integer .parseInt(t3.getText())); Point p2 = new Point(Integer.parseInt(t4.getText()), Integer .parseInt(t5.getText())); new cut(a, p1, p2); } }); pane.add(pan); pane.add(title2); add(pane, BorderLayout.NORTH); add(butt, BorderLayout.SOUTH); add(new JScrollPane(table), BorderLayout.CENTER); setBounds(440, 250, 400, 300); setTitle("线段裁剪的基本设置"); setVisible(true); setResizable(false); } } class cut extends JFrame { Object a[][]; Point p1, p2; int i, j, x, y; int width = getToolkit().getScreenSize().width, minx = -width / 2, maxx = width / 2; int height = getToolkit().getScreenSize().height, miny = -height / 2, maxy = height / 2; public cut(Object a[][], Point p1, Point p2) { this.p1 = p1; this.p2 = p2; this.a = a; add(new cutpolygo()); setTitle("线段的裁剪设置"); setLocation(0, 0); setSize(width, height); setVisible(true); setVisible(true); setVisible(true); setResizable(false); } class cutpolygo extends JPanel { public void paintComponent(Graphics g) { int j = 0, c, d, len[] = new int[20]; Point pp[] = new Point[20]; Point p3, p4, p0 = new Point(0, 0), p5 = new Point(0, 0); Graphics2D t = (Graphics2D) g; Polygon p = new Polygon(); p1.x=p1.x+maxx; p1.y=maxy-p1.y; p2.x=p2.x+maxx; p2.y=maxy-p2.y; for (int i = 0; i < a.length; i++) { x = Integer.parseInt(a[i][0].toString()) + maxx; y = -Integer.parseInt(a[i][1].toString()) + maxy; p.addPoint(x, y); p3 = new Point(x, y); c = Integer.parseInt(a[(i + 1) % a.length][0].toString())+ maxx; d = -Integer.parseInt(a[(i + 1) % a.length][1].toString())+ maxy; p4 = new Point(c, d); pp[j] = intersection(p1, p2, p3, p4); if (pp[j] != p0) j++; } t.drawPolygon(p); t.setColor(Color.red); t.drawLine(p1.x, p1.y, p2.x, p2.y); for (int s = 0; s < j; s++) len[s] = (p1.x - pp[s].x) * (p1.x - pp[s].x) + (p1.y - pp[s].y) * (p1.y - pp[s].y); for (int n = 0; n < j - 1; n++) { for (int m = 0; m < j - n - 1; m++) { if (len[m] > len[m + 1]) { p5 = pp[m]; pp[m] = pp[m + 1]; pp[m + 1] = p5; } } } for (i = 0; i < j; i = i + 2) { t.setColor(Color.green); t.drawLine(p1.x, p1.y, pp[i].x, pp[i].y); } t.setColor(Color.green); t.drawLine(p2.x, p2.y, pp[i-1].x, pp[i-1].y); } } Point intersection(Point p1, Point p2, Point p3, Point p4) { Point p = new Point(0, 0); float x1 = p1.x, x2 = p2.x, x3 = p3.x, x4 = p4.x; float y1 = p1.y, y2 = p2.y, y3 = p3.y, y4 = p4.y; float d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); if (d == 0) return p; float pre = (x1 * y2 - y1 * x2), post = (x3 * y4 - y3 * x4); float x = (pre * (x3 - x4) - (x1 - x2) * post) / d; float y = (pre * (y3 - y4) - (y1 - y2) * post) / d; if (x < Math.min(x1, x2) || x > Math.max(x1, x2) || x < Math.min(x3, x4) || x > Math.max(x3, x4)) return p; if (y < Math.min(y1, y2) || y > Math.max(y1, y2) || y < Math.min(y3, y4) || y > Math.max(y3, y4)) return p; Point ret = new Point(); ret.x = (int) x; ret.y = (int) y; return ret; } }