0

我这里有一个情况,我一个人应付不了。

我想在 JPanel 上绘制并填充多边形。我已经编写了 Moore-Neighbor 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);
            }
        }
    }
}

难道我做错了什么 ?或者我只是“创建”了一个形状,哪个奇偶填充规则无法处理?

结果如下所示: 结果如下所示:

4

1 回答 1

0

您的观点描述了一个双圆(即两个圆)。显然,fillPolygon不喜欢这样。删除一半的点(只保留下面的部分),它工作正常(见我的截图)。

截屏

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);
于 2013-05-13T11:48:01.490 回答