У меня тут ситуация, сама не справлюсь.
Я хотел бы нарисовать и заполнить 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);
}
}
}
}
Я делаю что-то неправильно ? Или я просто «создал» фигуру, с которой правило четного-нечетного заполнения не может справиться?
Результат выглядит так:
NullPointerException
в первой строке конструктора, как есть. Как выглядит код действительно? - person gustafc   schedule 13.05.2013