Java fillPolygon (Polygon p) не работает, когда p является контуром круга?

У меня тут ситуация, сама не справлюсь.

Я хотел бы нарисовать и заполнить Polygon на JPanel. Я написал алгоритм трассировки соседей Мура (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);
            }
        }
    }
}

Я делаю что-то неправильно ? Или я просто «создал» фигуру, с которой правило четного-нечетного заполнения не может справиться?

Результат выглядит так: Результат выглядит так:


person Kousalik    schedule 13.05.2013    source источник
comment
Этот код должен падать с NullPointerException в первой строке конструктора, как есть. Как выглядит код действительно?   -  person gustafc    schedule 13.05.2013
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 13.05.2013
comment
Добавлен полный пример   -  person Kousalik    schedule 13.05.2013


Ответы (1)


Ваши очки описывают двойной круг (то есть два круга). Видимо, 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);
person Vincent van der Weele    schedule 13.05.2013
comment
Да, это вызвано правилом чет-нечет, я не могу поверить, что пропустил это! Я ориентировался на это! Спасибо - person Kousalik; 13.05.2013