Search code examples
javashapesgraphics2dfillcontour

Java fillPolygon(Polygon p) doesn't work when p is circle contour?


I have here a situation, I can't handle by myself.

I'd like to draw and fill Polygon onto JPanel. I have written Moore-Neighbor Tracing algorithm (http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/moore.html), for detecting contours in image.

Algorithm works just fine, but then I'd like to visualize the result. It works for me in many scenarios, but when the traced shape is circle, I mean the resulting polygon describes a circle (and it realy is), the Java Graphics2D.fillPolygon(Polygon p) is unable to fill it. It is well drawed by drawPolygon(Polygon p), but not filled. And of course a need it filled (actualy I am drawing and filling it in an BufferedImage instance with a background color, so it seems to be "deleted"), so the example with JPanel is just for testing purpose.

My code:

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);
            }
        }
    }
}

Am I doing something wrong ? Or I just "created" a shape, which even-odd filling rule can't handle ?

Result looks like this: Result looks like this:


Solution

  • Your points describe a double circle (that is, two rounds). Apparently, fillPolygon doesn't like that. Remove half of the points (only keep the part below) and it works fine (see my screenshot).

    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);