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