我在這裏有一個情況,我不能自己處理。當p是圓形輪廓時,Java fillPolygon(Polygon p)不起作用?
我想繪製並填充Polygon到JPanel上。我寫了Moore-Neighbour 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);
}
}
}
}
難道我做錯了什麼?或者我只是「創造」了一種偶數填充規則無法處理的形狀?
結果是這樣的:
此代碼應與'NullPointerException'崩潰在構造函數中的第一行,因爲它是。代碼*真的*看起來如何? – gustafc 2013-05-13 11:33:11
爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-05-13 11:34:12
完整示例添加 – Kousalik 2013-05-13 11:53:52