2013-05-13 27 views
0

我在这里有一个情况,我不能自己处理。当p是圆形轮廓时,Java fillPolygon(Polygon p)不起作用?

我想绘制并填充Polygon到JPanel上。我写了Moore-Neighbour Tracing算法(http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/moore.html),用于检测图像中的轮廓。

算法工作得很好,但我想要可视化结果。它在很多情况下适用于我,但是当描绘的形状是圆形时,我的意思是生成的多边形描述了一个圆圈(实际上它是),Java Graphics2D.fillPolygon(Polygon p)无法填充它。它很好地由drawPolygon(Polygon p)绘制,但没有填充。当然需要填充(实际上我正在绘制并将其填充到具有背景颜色的BufferedImage实例中,因此它似乎被“删除”),所以JPanel的示例仅用于测试目的。

我的代码:

package x; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 

public class NewClass extends javax.swing.JFrame { 

    public NewClass() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    private void initComponents() { 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     pack(); 
    } 

    public static void main(String args[]) { 
     NewClass f = new NewClass(); 
     f.getContentPane().add(new Draw(), java.awt.BorderLayout.CENTER); 
     f.setSize(100, 200); 
     f.setVisible(true); 
    } 

    static class Draw extends javax.swing.JPanel { 

     private static final Polygon p; 

     static { 
      p = new Polygon(); 
      p.addPoint(27, 50); 
      p.addPoint(28, 49); 
      p.addPoint(28, 48); 
      p.addPoint(28, 47); 
      p.addPoint(29, 46); 
      p.addPoint(29, 45); 
      p.addPoint(30, 44); 
      p.addPoint(30, 43); 
      p.addPoint(31, 42); 
      p.addPoint(31, 41); 
      p.addPoint(32, 40); 
      p.addPoint(32, 39); 
      p.addPoint(33, 38); 
      p.addPoint(33, 37); 
      p.addPoint(34, 36); 
      p.addPoint(35, 35); 
      p.addPoint(36, 34); 
      p.addPoint(37, 33); 
      p.addPoint(38, 32); 
      p.addPoint(39, 31); 
      p.addPoint(40, 31); 
      p.addPoint(41, 30); 
      p.addPoint(42, 30); 
      p.addPoint(43, 29); 
      p.addPoint(44, 28); 
      p.addPoint(45, 28); 
      p.addPoint(46, 27); 
      p.addPoint(47, 27); 
      p.addPoint(48, 27); 
      p.addPoint(49, 26); 
      p.addPoint(50, 26); 
      p.addPoint(51, 26); 
      p.addPoint(52, 25); 
      p.addPoint(53, 25); 
      p.addPoint(54, 25); 
      p.addPoint(55, 25); 
      p.addPoint(56, 25); 
      p.addPoint(57, 25); 
      p.addPoint(58, 25); 
      p.addPoint(59, 25); 
      p.addPoint(60, 25); 
      p.addPoint(61, 25); 
      p.addPoint(62, 25); 
      p.addPoint(63, 25); 
      p.addPoint(64, 25); 
      p.addPoint(65, 25); 
      p.addPoint(66, 26); 
      p.addPoint(67, 26); 
      p.addPoint(68, 26); 
      p.addPoint(69, 27); 
      p.addPoint(70, 27); 
      p.addPoint(71, 28); 
      p.addPoint(72, 28); 
      p.addPoint(73, 29); 
      p.addPoint(74, 29); 
      p.addPoint(75, 30); 
      p.addPoint(76, 30); 
      p.addPoint(77, 31); 
      p.addPoint(78, 31); 
      p.addPoint(79, 32); 
      p.addPoint(80, 33); 
      p.addPoint(81, 34); 
      p.addPoint(82, 35); 
      p.addPoint(83, 36); 
      p.addPoint(84, 37); 
      p.addPoint(84, 38); 
      p.addPoint(85, 39); 
      p.addPoint(85, 40); 
      p.addPoint(86, 41); 
      p.addPoint(86, 42); 
      p.addPoint(87, 43); 
      p.addPoint(87, 44); 
      p.addPoint(88, 45); 
      p.addPoint(88, 46); 
      p.addPoint(89, 47); 
      p.addPoint(89, 48); 
      p.addPoint(89, 49); 
      p.addPoint(90, 50); 
      p.addPoint(90, 51); 
      p.addPoint(90, 52); 
      p.addPoint(90, 53); 
      p.addPoint(90, 54); 
      p.addPoint(90, 55); 
      p.addPoint(90, 56); 
      p.addPoint(90, 57); 
      p.addPoint(90, 58); 
      p.addPoint(90, 59); 
      p.addPoint(90, 60); 
      p.addPoint(90, 61); 
      p.addPoint(90, 62); 
      p.addPoint(90, 63); 
      p.addPoint(89, 64); 
      p.addPoint(89, 65); 
      p.addPoint(89, 66); 
      p.addPoint(88, 67); 
      p.addPoint(88, 68); 
      p.addPoint(87, 69); 
      p.addPoint(87, 70); 
      p.addPoint(86, 71); 
      p.addPoint(86, 72); 
      p.addPoint(85, 73); 
      p.addPoint(85, 74); 
      p.addPoint(84, 75); 
      p.addPoint(84, 76); 
      p.addPoint(83, 77); 
      p.addPoint(82, 78); 
      p.addPoint(81, 79); 
      p.addPoint(80, 80); 
      p.addPoint(79, 81); 
      p.addPoint(78, 82); 
      p.addPoint(77, 82); 
      p.addPoint(76, 83); 
      p.addPoint(75, 83); 
      p.addPoint(74, 84); 
      p.addPoint(73, 84); 
      p.addPoint(72, 85); 
      p.addPoint(71, 85); 
      p.addPoint(70, 86); 
      p.addPoint(69, 86); 
      p.addPoint(68, 87); 
      p.addPoint(67, 87); 
      p.addPoint(66, 87); 
      p.addPoint(65, 88); 
      p.addPoint(64, 88); 
      p.addPoint(63, 88); 
      p.addPoint(62, 88); 
      p.addPoint(61, 88); 
      p.addPoint(60, 88); 
      p.addPoint(59, 88); 
      p.addPoint(58, 88); 
      p.addPoint(57, 88); 
      p.addPoint(56, 88); 
      p.addPoint(55, 88); 
      p.addPoint(54, 88); 
      p.addPoint(53, 88); 
      p.addPoint(52, 88); 
      p.addPoint(51, 87); 
      p.addPoint(50, 87); 
      p.addPoint(49, 87); 
      p.addPoint(48, 86); 
      p.addPoint(47, 86); 
      p.addPoint(46, 86); 
      p.addPoint(45, 85); 
      p.addPoint(44, 85); 
      p.addPoint(43, 84); 
      p.addPoint(42, 83); 
      p.addPoint(41, 83); 
      p.addPoint(40, 82); 
      p.addPoint(39, 82); 
      p.addPoint(38, 81); 
      p.addPoint(37, 80); 
      p.addPoint(36, 79); 
      p.addPoint(35, 78); 
      p.addPoint(34, 77); 
      p.addPoint(33, 76); 
      p.addPoint(33, 75); 
      p.addPoint(32, 74); 
      p.addPoint(32, 73); 
      p.addPoint(31, 72); 
      p.addPoint(31, 71); 
      p.addPoint(30, 70); 
      p.addPoint(30, 69); 
      p.addPoint(29, 68); 
      p.addPoint(29, 67); 
      p.addPoint(28, 66); 
      p.addPoint(28, 65); 
      p.addPoint(28, 64); 
      p.addPoint(27, 63); 
      p.addPoint(27, 62); 
      p.addPoint(27, 61); 
      p.addPoint(27, 60); 
      p.addPoint(27, 59); 
      p.addPoint(27, 58); 
      p.addPoint(27, 57); 
      p.addPoint(27, 56); 
      p.addPoint(27, 55); 
      p.addPoint(27, 54); 
      p.addPoint(27, 53); 
      p.addPoint(27, 52); 
      p.addPoint(27, 51); 
      p.addPoint(27, 50); 
      p.addPoint(28, 49); 
      p.addPoint(28, 48); 
      p.addPoint(28, 47); 
      p.addPoint(29, 46); 
      p.addPoint(29, 45); 
      p.addPoint(30, 44); 
      p.addPoint(30, 43); 
      p.addPoint(31, 42); 
      p.addPoint(31, 41); 
      p.addPoint(32, 40); 
      p.addPoint(32, 39); 
      p.addPoint(33, 38); 
      p.addPoint(33, 37); 
      p.addPoint(34, 36); 
      p.addPoint(35, 35); 
      p.addPoint(36, 34); 
      p.addPoint(37, 33); 
      p.addPoint(38, 32); 
      p.addPoint(39, 31); 
      p.addPoint(40, 31); 
      p.addPoint(41, 30); 
      p.addPoint(42, 30); 
      p.addPoint(43, 29); 
      p.addPoint(44, 28); 
      p.addPoint(45, 28); 
      p.addPoint(46, 27); 
      p.addPoint(47, 27); 
      p.addPoint(48, 27); 
      p.addPoint(49, 26); 
      p.addPoint(50, 26); 
      p.addPoint(51, 26); 
      p.addPoint(52, 25); 
      p.addPoint(53, 25); 
      p.addPoint(54, 25); 
      p.addPoint(55, 25); 
      p.addPoint(56, 25); 
      p.addPoint(57, 25); 
      p.addPoint(58, 25); 
      p.addPoint(59, 25); 
      p.addPoint(60, 25); 
      p.addPoint(61, 25); 
      p.addPoint(62, 25); 
      p.addPoint(63, 25); 
      p.addPoint(64, 25); 
      p.addPoint(65, 25); 
      p.addPoint(66, 26); 
      p.addPoint(67, 26); 
      p.addPoint(68, 26); 
      p.addPoint(69, 27); 
      p.addPoint(70, 27); 
      p.addPoint(71, 28); 
      p.addPoint(72, 28); 
      p.addPoint(73, 29); 
      p.addPoint(74, 29); 
      p.addPoint(75, 30); 
      p.addPoint(76, 30); 
      p.addPoint(77, 31); 
      p.addPoint(78, 31); 
      p.addPoint(79, 32); 
      p.addPoint(80, 33); 
      p.addPoint(81, 34); 
      p.addPoint(82, 35); 
      p.addPoint(83, 36); 
      p.addPoint(84, 37); 
      p.addPoint(84, 38); 
      p.addPoint(85, 39); 
      p.addPoint(85, 40); 
      p.addPoint(86, 41); 
      p.addPoint(86, 42); 
      p.addPoint(87, 43); 
      p.addPoint(87, 44); 
      p.addPoint(88, 45); 
      p.addPoint(88, 46); 
      p.addPoint(89, 47); 
      p.addPoint(89, 48); 
      p.addPoint(89, 49); 
      p.addPoint(90, 50); 
      p.addPoint(90, 51); 
      p.addPoint(90, 52); 
      p.addPoint(90, 53); 
      p.addPoint(90, 54); 
      p.addPoint(90, 55); 
      p.addPoint(90, 56); 
      p.addPoint(90, 57); 
      p.addPoint(90, 58); 
      p.addPoint(90, 59); 
      p.addPoint(90, 60); 
      p.addPoint(90, 61); 
      p.addPoint(90, 62); 
      p.addPoint(90, 63); 
      p.addPoint(89, 64); 
      p.addPoint(89, 65); 
      p.addPoint(89, 66); 
      p.addPoint(88, 67); 
      p.addPoint(88, 68); 
      p.addPoint(87, 69); 
      p.addPoint(87, 70); 
      p.addPoint(86, 71); 
      p.addPoint(86, 72); 
      p.addPoint(85, 73); 
      p.addPoint(85, 74); 
      p.addPoint(84, 75); 
      p.addPoint(84, 76); 
      p.addPoint(83, 77); 
      p.addPoint(82, 78); 
      p.addPoint(81, 79); 
      p.addPoint(80, 80); 
      p.addPoint(79, 81); 
      p.addPoint(78, 82); 
      p.addPoint(77, 82); 
      p.addPoint(76, 83); 
      p.addPoint(75, 83); 
      p.addPoint(74, 84); 
      p.addPoint(73, 84); 
      p.addPoint(72, 85); 
      p.addPoint(71, 85); 
      p.addPoint(70, 86); 
      p.addPoint(69, 86); 
      p.addPoint(68, 87); 
      p.addPoint(67, 87); 
      p.addPoint(66, 87); 
      p.addPoint(65, 88); 
      p.addPoint(64, 88); 
      p.addPoint(63, 88); 
      p.addPoint(62, 88); 
      p.addPoint(61, 88); 
      p.addPoint(60, 88); 
      p.addPoint(59, 88); 
      p.addPoint(58, 88); 
      p.addPoint(57, 88); 
      p.addPoint(56, 88); 
      p.addPoint(55, 88); 
      p.addPoint(54, 88); 
      p.addPoint(53, 88); 
      p.addPoint(52, 88); 
      p.addPoint(51, 87); 
      p.addPoint(50, 87); 
      p.addPoint(49, 87); 
      p.addPoint(48, 86); 
      p.addPoint(47, 86); 
      p.addPoint(46, 86); 
      p.addPoint(45, 85); 
      p.addPoint(44, 85); 
      p.addPoint(43, 84); 
      p.addPoint(42, 83); 
      p.addPoint(41, 83); 
      p.addPoint(40, 82); 
      p.addPoint(39, 82); 
      p.addPoint(38, 81); 
      p.addPoint(37, 80); 
      p.addPoint(36, 79); 
      p.addPoint(35, 78); 
      p.addPoint(34, 77); 
      p.addPoint(33, 76); 
      p.addPoint(33, 75); 
      p.addPoint(32, 74); 
      p.addPoint(32, 73); 
      p.addPoint(31, 72); 
      p.addPoint(31, 71); 
      p.addPoint(30, 70); 
      p.addPoint(30, 69); 
      p.addPoint(29, 68); 
      p.addPoint(29, 67); 
      p.addPoint(28, 66); 
      p.addPoint(28, 65); 
      p.addPoint(28, 64); 
      p.addPoint(27, 63); 
      p.addPoint(27, 62); 
      p.addPoint(27, 61); 
      p.addPoint(27, 60); 
      p.addPoint(27, 59); 
      p.addPoint(27, 58); 
      p.addPoint(27, 57); 
      p.addPoint(27, 56); 
      p.addPoint(27, 55); 
      p.addPoint(27, 54); 
      p.addPoint(27, 53); 
      p.addPoint(27, 52); 
      p.addPoint(27, 51); 

     } 


     @Override 
     public void paintComponent(Graphics gg) { 
      super.paintComponent(gg); 
      Graphics2D g = (Graphics2D) gg; 
      g.setColor(Color.WHITE); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
      if (p != null) { 
       g.setColor(Color.BLUE); 
       g.fillPolygon(p); 
       g.drawPolygon(p); 
      } 
     } 
    } 
} 

难道我做错了什么?或者我只是“创造”了一种偶数填充规则无法处理的形状?

结果是这样的: Result looks like this:

+0

此代码应与'NullPointerException'崩溃在构造函数中的第一行,因为它是。代码*真的*看起来如何? – gustafc 2013-05-13 11:33:11

+0

为了尽快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 – 2013-05-13 11:34:12

+0

完整示例添加 – Kousalik 2013-05-13 11:53:52

回答

0

你几点描述双圈(即两轮)。显然,fillPolygon不喜欢那样。删除一半的点(只保留下面的部分),它工作正常(见我的截图)。

screenshot

p.addPoint(27, 50); 
p.addPoint(28, 49); 
p.addPoint(28, 48); 
p.addPoint(28, 47); 
p.addPoint(29, 46); 
p.addPoint(29, 45); 
p.addPoint(30, 44); 
p.addPoint(30, 43); 
p.addPoint(31, 42); 
p.addPoint(31, 41); 
p.addPoint(32, 40); 
p.addPoint(32, 39); 
p.addPoint(33, 38); 
p.addPoint(33, 37); 
p.addPoint(34, 36); 
p.addPoint(35, 35); 
p.addPoint(36, 34); 
p.addPoint(37, 33); 
p.addPoint(38, 32); 
p.addPoint(39, 31); 
p.addPoint(40, 31); 
p.addPoint(41, 30); 
p.addPoint(42, 30); 
p.addPoint(43, 29); 
p.addPoint(44, 28); 
p.addPoint(45, 28); 
p.addPoint(46, 27); 
p.addPoint(47, 27); 
p.addPoint(48, 27); 
p.addPoint(49, 26); 
p.addPoint(50, 26); 
p.addPoint(51, 26); 
p.addPoint(52, 25); 
p.addPoint(53, 25); 
p.addPoint(54, 25); 
p.addPoint(55, 25); 
p.addPoint(56, 25); 
p.addPoint(57, 25); 
p.addPoint(58, 25); 
p.addPoint(59, 25); 
p.addPoint(60, 25); 
p.addPoint(61, 25); 
p.addPoint(62, 25); 
p.addPoint(63, 25); 
p.addPoint(64, 25); 
p.addPoint(65, 25); 
p.addPoint(66, 26); 
p.addPoint(67, 26); 
p.addPoint(68, 26); 
p.addPoint(69, 27); 
p.addPoint(70, 27); 
p.addPoint(71, 28); 
p.addPoint(72, 28); 
p.addPoint(73, 29); 
p.addPoint(74, 29); 
p.addPoint(75, 30); 
p.addPoint(76, 30); 
p.addPoint(77, 31); 
p.addPoint(78, 31); 
p.addPoint(79, 32); 
p.addPoint(80, 33); 
p.addPoint(81, 34); 
p.addPoint(82, 35); 
p.addPoint(83, 36); 
p.addPoint(84, 37); 
p.addPoint(84, 38); 
p.addPoint(85, 39); 
p.addPoint(85, 40); 
p.addPoint(86, 41); 
p.addPoint(86, 42); 
p.addPoint(87, 43); 
p.addPoint(87, 44); 
p.addPoint(88, 45); 
p.addPoint(88, 46); 
p.addPoint(89, 47); 
p.addPoint(89, 48); 
p.addPoint(89, 49); 
p.addPoint(90, 50); 
p.addPoint(90, 51); 
p.addPoint(90, 52); 
p.addPoint(90, 53); 
p.addPoint(90, 54); 
p.addPoint(90, 55); 
p.addPoint(90, 56); 
p.addPoint(90, 57); 
p.addPoint(90, 58); 
p.addPoint(90, 59); 
p.addPoint(90, 60); 
p.addPoint(90, 61); 
p.addPoint(90, 62); 
p.addPoint(90, 63); 
p.addPoint(89, 64); 
p.addPoint(89, 65); 
p.addPoint(89, 66); 
p.addPoint(88, 67); 
p.addPoint(88, 68); 
p.addPoint(87, 69); 
p.addPoint(87, 70); 
p.addPoint(86, 71); 
p.addPoint(86, 72); 
p.addPoint(85, 73); 
p.addPoint(85, 74); 
p.addPoint(84, 75); 
p.addPoint(84, 76); 
p.addPoint(83, 77); 
p.addPoint(82, 78); 
p.addPoint(81, 79); 
p.addPoint(80, 80); 
p.addPoint(79, 81); 
p.addPoint(78, 82); 
p.addPoint(77, 82); 
p.addPoint(76, 83); 
p.addPoint(75, 83); 
p.addPoint(74, 84); 
p.addPoint(73, 84); 
p.addPoint(72, 85); 
p.addPoint(71, 85); 
p.addPoint(70, 86); 
p.addPoint(69, 86); 
p.addPoint(68, 87); 
p.addPoint(67, 87); 
p.addPoint(66, 87); 
p.addPoint(65, 88); 
p.addPoint(64, 88); 
p.addPoint(63, 88); 
p.addPoint(62, 88); 
p.addPoint(61, 88); 
p.addPoint(60, 88); 
p.addPoint(59, 88); 
p.addPoint(58, 88); 
p.addPoint(57, 88); 
p.addPoint(56, 88); 
p.addPoint(55, 88); 
p.addPoint(54, 88); 
p.addPoint(53, 88); 
p.addPoint(52, 88); 
p.addPoint(51, 87); 
p.addPoint(50, 87); 
p.addPoint(49, 87); 
p.addPoint(48, 86); 
p.addPoint(47, 86); 
p.addPoint(46, 86); 
p.addPoint(45, 85); 
p.addPoint(44, 85); 
p.addPoint(43, 84); 
p.addPoint(42, 83); 
p.addPoint(41, 83); 
p.addPoint(40, 82); 
p.addPoint(39, 82); 
p.addPoint(38, 81); 
p.addPoint(37, 80); 
p.addPoint(36, 79); 
p.addPoint(35, 78); 
p.addPoint(34, 77); 
p.addPoint(33, 76); 
p.addPoint(33, 75); 
p.addPoint(32, 74); 
p.addPoint(32, 73); 
p.addPoint(31, 72); 
p.addPoint(31, 71); 
p.addPoint(30, 70); 
p.addPoint(30, 69); 
p.addPoint(29, 68); 
p.addPoint(29, 67); 
p.addPoint(28, 66); 
p.addPoint(28, 65); 
p.addPoint(28, 64); 
p.addPoint(27, 63); 
p.addPoint(27, 62); 
p.addPoint(27, 61); 
p.addPoint(27, 60); 
p.addPoint(27, 59); 
p.addPoint(27, 58); 
p.addPoint(27, 57); 
p.addPoint(27, 56); 
p.addPoint(27, 55); 
p.addPoint(27, 54); 
p.addPoint(27, 53); 
p.addPoint(27, 52); 
p.addPoint(27, 51); 
+0

是的,这是由偶数规则引起的,我不能相信我错过了!我专注于此! Thx – Kousalik 2013-05-13 11:56:46

+0

@downvoter,谨慎解释发生了什么问题? – 2013-05-13 14:55:36