Java fillPolygon(Polygon p)当p是circle contour?

时间:2023-02-09 16:10:13

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.

我想在JPanel上画和填充多边形。我已经编写了moore邻居跟踪算法(http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/moore.html),用于检测图像中的轮廓。

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.

算法很好,但是我想把结果可视化。它在很多情况下对我都适用,但是当跟踪的形状是圆形时,我的意思是生成的多边形描述了一个圆(实际上是),Java Graphics2D。fillPolygon(Polygon p)无法填满它。它是用拉伸多边形(多边形p)绘制的,但没有填充。当然,还需要填充它(实际上,我正在用一个背景颜色在BufferedImage实例中填充它,所以它看起来是“删除”的),所以带有JPanel的示例只是为了测试目的。

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: Java fillPolygon(Polygon p)当p是circle contour?

结果是这样的:

1 个解决方案

#1


0  

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

你的观点描述了一个双环(即两轮)。显然,fillPolygon不喜欢。删除一半的点(只保留下面的部分),它可以正常工作(见我的截图)。

Java fillPolygon(Polygon p)当p是circle contour?

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

#1


0  

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

你的观点描述了一个双环(即两轮)。显然,fillPolygon不喜欢。删除一半的点(只保留下面的部分),它可以正常工作(见我的截图)。

Java fillPolygon(Polygon p)当p是circle contour?

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