/** Program to draw a mystery shape with points. */
public class MysteryShape {
    /**
     * Main method for the mystery shape program.
     * @param args Ignored
     */
    public static void main(String[] args) {

        PointDisplay w = new PointDisplay(2, 10000);
        int halfWidth = w.getWidth() / 2;
        int halfHeight = w.getHeight() / 2;

        int numPoints = 0;
        for(double t = 0; t < 28*Math.PI; t += 0.03) {
            int xPixel = halfWidth + (int)(0.3*x(t));
            int yPixel = halfHeight - (int)(0.3*y(t));
            w.addPointAt(xPixel, yPixel);
            numPoints++;
        }
        System.out.println(numPoints);
    }
    
    private static double x(double t) {
        return ((976.0/11*Math.sin(t + 11.0/7) + 1.0/11*Math.sin(2*t + 27.0/8)
                 + 79.0/8*Math.sin(3*t + 11.0/7) + 1.0/14*Math.sin(4*t + 37.0/10)
                 + 46.0/13*Math.sin(5*t + 8.0/5) + 1.0/27*Math.sin(6*t + 38.0/11)
                 + 9.0/5*Math.sin(7*t + 19.0/12) + 1.0/22*Math.sin(8*t + 57.0/17)
                 + 11.0/10*Math.sin(9*t + 8.0/5) + 1/41.0*Math.sin(10*t + 7.0/2)
                 + 8.0/11*Math.sin(11*t + 13.0/8) + 1.0/28*Math.sin(12*t + 25.0/9)
                 + 6.0/11*Math.sin(13*t + 8.0/5) + 1.0/76*Math.sin(14*t + 37.0/13)
                 + 2.0/5*Math.sin(15*t + 8.0/5) + 1.0/76*Math.sin(16*t + 23.0/9)
                 + 3.0/10*Math.sin(17*t + 8.0/5) + 1.0/4*Math.sin(19*t + 19.0/12)
                 + 1.0/5*Math.sin(21*t + 13.0/8) + 1.0/6*Math.sin(23*t + 8.0/5)
                 + 1.0/80*Math.sin(24*t + 41.0/12) + 1.0/7*Math.sin(25*t + 12.0/7)
                 + 1.0/76*Math.sin(26*t + 17.0/5) + 1.0/8*Math.sin(27*t + 13.0/8)
                 + 1.0/9*Math.sin(29*t + 22.0/13) + 1.0/82*Math.sin(30*t + 37.0/12)
                 + 1.0/10*Math.sin(31*t + 32.0/19) + 1.0/12*Math.sin(33*t + 5.0/3)
                 + 1.0/95*Math.sin(34*t + 34.0/11) + 1.0/13*Math.sin(35*t + 27.0/16)
                 + 1.0/15*Math.sin(37*t + 13.0/8) + 1.0/17*Math.sin(39*t + 19.0/12)
                 + 1.0/19*Math.sin(41*t + 22.0/13) + 1.0/21*Math.sin(43*t + 27.0/16)
                 - 2426.0/21)*h(27*Math.PI - t)*h(t - 23*Math.PI)
                + (-1.0/14*Math.sin(14.0/9 - 13*t) - 1.0/7*Math.sin(11.0/7 - 12*t)
                   - 1.0/30*Math.sin(11.0/7 - 10*t) - 2.0/9*Math.sin(11.0/7 - 9*t)
                   - 3.0/7*Math.sin(11.0/7 - 6*t) - 19.0/14*Math.sin(11.0/7 - 2*t)
                   + 41.0/14*Math.sin(t + 11.0/7) + 1.0/10*Math.sin(3*t + 11.0/7)
                   + 1.0/6*Math.sin(4*t + 11.0/7) + 1.0/5*Math.sin(5*t + 11.0/7)
                   + 1.0/5*Math.sin(7*t + 11.0/7) + 1.0/6*Math.sin(8*t + 11.0/7)
                   + 2.0/9*Math.sin(11*t + 11.0/7) + 1.0/8*Math.sin(14*t + 11.0/7)
                   + 1.0/94*Math.sin(15*t + 11.0/7)
                   - 516.0/5)*h(23*Math.PI - t)*h(t - 19*Math.PI)
                + (-51.0/8*Math.sin(14.0/9 - 11*t) - 1.0/6*Math.sin(16.0/15 - 10*t)
                   - 1.0/4*Math.sin(1 - 9*t) - 1.0/6*Math.sin(1 - 6*t)
                   - 3.0/8*Math.sin(11.0/8 - 4*t) - 419.0/6*Math.sin(14.0/9 - 3*t)
                   + 4681.0/10*Math.sin(t + 11.0/7) + 12.0/7*Math.sin(2*t + 18.0/11)
                   + 71.0/8*Math.sin(5*t + 33.0/7) + 106.0/7*Math.sin(7*t + 8.0/5)
                   + 5.0/13*Math.sin(8*t + 30.0/7) + 6.0/13*Math.sin(12*t + 25.0/17)
                   + 11.0/7*Math.sin(13*t + 19.0/12) + 7.0/15*Math.sin(14*t + 20.0/11)
                   + 16.0/5*Math.sin(15*t + 8.0/5) + 1.0/17*Math.sin(16*t + 10.0/7)
                   + 676.0/9)*h(19*Math.PI - t)*h(t - 15*Math.PI)
                + (-14.0/9*Math.sin(3.0/2 - 16*t) - 27.0/11*Math.sin(34.0/23 - 13*t)
                   - 71.0/18*Math.sin(29.0/19 - 12*t) - 46.0/31*Math.sin(11.0/7 - 9*t)
                   - 2.0/7*Math.sin(8.0/9 - 8*t) - 37.0/10*Math.sin(17.0/11 - 7*t)
                   - 449.0/9*Math.sin(11.0/7 - 3*t) + 1359.0/8*Math.sin(t + 11.0/7)
                   + 137.0/8*Math.sin(2*t + 33.0/7) + 58.0/7*Math.sin(4*t + 14.0/9)
                   + 187.0/12*Math.sin(5*t + 11.0/7) + 265.0/33*Math.sin(6*t + 47.0/10)
                   + 31.0/15*Math.sin(10*t + 18.0/11) + 2.0/9*Math.sin(11*t + 27.0/16)
                   + 2.0/5*Math.sin(14*t + 11.0/7) + 3.0/5*Math.sin(15*t + 37.0/8)
                   + 1387.0/6)*h(15*Math.PI - t)*h(t - 11*Math.PI)
                + (1961.0/15*Math.sin(t + 9.0/11) + 23.0/10*Math.sin(2*t + 43.0/13)
                   + 141.0/11*Math.sin(3*t + 12.0/5) + 51.0/26*Math.sin(4*t + 25.0/6)
                   + 50.0/9*Math.sin(5*t + 9.0/8) + 3.0/2*Math.sin(6*t + 34.0/9)
                   + 9.0/4*Math.sin(7*t + 38.0/15)
                   - 725.0/7)*h(11*Math.PI - t)*h(t - 7*Math.PI)
                + (-16.0/13*Math.sin(1.0/12 - 9*t) - 483.0/22*Math.sin(10.0/9 - 2*t)
                   + 4069.0/37*Math.sin(t + 3.0/8) + 35.0/4*Math.sin(3*t + 12.0/7)
                   + 17.0/4*Math.sin(4*t + 29.0/7) + 2.0/7*Math.sin(5*t + 11.0/8)
                   + 18.0/7*Math.sin(6*t + 76.0/17) + 2*Math.sin(7*t + 9.0/8)
                   + 13.0/8*Math.sin(8*t + 2.0/9)
                   - 856.0/5)*h(7*Math.PI - t)*h(t - 3*Math.PI)
                + (-8.0/5*Math.sin(94.0/93 - 14*t) - 75.0/37*Math.sin(11.0/7 - 13*t)
                   - 19.0/13*Math.sin(6.0/7 - 7*t) + 5163.0/13*Math.sin(t + 1.0/18)
                   + 394.0/9*Math.sin(2*t + 2.0/9) + 227.0/7*Math.sin(3*t + 31.0/9)
                   + 197.0/9*Math.sin(4*t + 43.0/13) + 13.0/3*Math.sin(5*t + 1.0/8)
                   + 279.0/20*Math.sin(6*t + 1.0/2) + 95.0/21*Math.sin(8*t + 31.0/8)
                   + 44.0/9*Math.sin(9*t + 70.0/19) + 29.0/8*Math.sin(10*t + 88.0/87)
                   + 31.0/11*Math.sin(11*t + 28.0/27) + 25.0/26*Math.sin(12*t + 8.0/15)
                   + 21.0/10*Math.sin(15*t + 8.0/7) + 11.0/8*Math.sin(16*t + 3.0/4)
                   + 649.0/9)*h(3*Math.PI - t)*h(t + Math.PI))
            * h(Math.sqrt(Math.signum(Math.sin(t/2))));
    }

    private static double y(double t) {
        return (-724.0/7*h(27*Math.PI -t)*h(t - 23*Math.PI)
                + (638.0/7*Math.sin(t + 33.0/7) + 1.0/5*Math.sin(2*t + 38.0/9)
                   + 72.0/7*Math.sin(3*t + 33.0/7) + 1.0/6*Math.sin(4*t + 17.0/10)
                   + 40.0/11*Math.sin(5*t + 33.0/7) + 1.0/13*Math.sin(6*t + 22.0/5)
                   + 25.0/14*Math.sin(7*t + 47.0/10) + 1.0/11*Math.sin(8*t + 17.0/9)
                   + 7.0/6*Math.sin(9*t + 47.0/10) + 1.0/51*Math.sin(10*t + 21.0/10)
                   + 2.0/3*Math.sin(11*t + 33.0/7) + 5.0/9*Math.sin(13*t + 47.0/10)
                   + 1.0/14*Math.sin(14*t + 5.0/3) + 3.0/8*Math.sin(15*t + 47.0/10)
                   - 543.0/5)*h(23*Math.PI -t)*h(t - 19*Math.PI)
                + (-1.0/15*Math.sin(7.0/6 - 13*t) + 11.0/9*Math.sin(t + 32.0/7)
                   + 1303.0/6*Math.sin(2*t + 11.0/7) + 6.0/17*Math.sin(3*t + 17.0/5)
                   + 1146.0/13*Math.sin(4*t + 19.0/12) + 11.0/12*Math.sin(5*t + 20.0/11)
                   + 217.0/24*Math.sin(6*t + 11.0/7) + 5.0/13*Math.sin(7*t + 41.0/21)
                   + 31.0/8*Math.sin(8*t + 14.0/9) + 12.0/13*Math.sin(9*t + 41.0/9)
                   + 138.0/11*Math.sin(10*t + 8.0/5) + 5.0/7*Math.sin(11*t + 23.0/13)
                   + 52.0/7*Math.sin(12*t + 8.0/5) + 3.0/11*Math.sin(14*t + 9.0/7)
                   + 1.0/5*Math.sin(15*t + 17.0/10) + 5.0/2*Math.sin(16*t + 19.0/12)
                   - 8123.0/31)*h(19*Math.PI -t)*h(t - 15*Math.PI)
                + (-1.0/3*Math.sin(31.0/21 - 16*t) - 28.0/13*Math.sin(11.0/7 - 14*t)
                   - 18.0/7*Math.sin(26.0/17 - 12*t) - 1.0/3*Math.sin(25.0/17 - 11*t)
                   - 287.0/23*Math.sin(14.0/9 - 8*t) - 32.0/9*Math.sin(3.0/2 - 7*t)
                   - 38.0/9*Math.sin(11.0/7 - 6*t) - 279.0/10*Math.sin(11.0/7 - 4*t)
                   - 1843.0/9*Math.sin(11.0/7 - 2*t) - 173.0/5*Math.sin(17.0/11 - t)
                   + 25.0/4*Math.sin(3*t + 16.0/11) + 31.0/8*Math.sin(5*t + 8.0/5)
                   + 52.0/11*Math.sin(9*t + 11.0/7) + 9.0/8*Math.sin(10*t + 23.0/5)
                   + 4.0/9*Math.sin(13*t + 14.0/11) + 17.0/6*Math.sin(15*t + 8.0/5)
                   - 1618.0/13)*h(15*Math.PI -t)* h(t - 11*Math.PI)
                + (-45.0/8*Math.sin(11.0/16 - 5*t) - 4848.0/37*Math.sin(5.0/7 - t)
                   + 19.0/11*Math.sin(2*t + 17.0/12) + 294.0/19*Math.sin(3*t + 29.0/7)
                   + 26.0/11*Math.sin(4*t + 5.0/6) + 15.0/11*Math.sin(6*t + 3.0/5)
                   + 25.0/7*Math.sin(7*t + 37.0/9)
                   - 1216.0/11)*h(11*Math.PI -t)*h(t - 7*Math.PI)
                + (-13.0/9*Math.sin(22.0/15 - 7*t) - 993.0/7*Math.sin(3.0/4 - t)
                   + 44.0/3*Math.sin(2*t + 13.0/12) + 353.0/44*Math.sin(3*t + 17.0/7)
                   + 26.0/3*Math.sin(4*t + 87.0/44) + 41.0/6*Math.sin(5*t + 32.0/7)
                   + 13.0/6*Math.sin(6*t + 47.0/11) + 19.0/7*Math.sin(8*t + 17.0/16)
                   + 14.0/11*Math.sin(9*t + 31.0/8)
                   + 4031.0/9)*h(7*Math.PI - t)*h(t - 3*Math.PI)
                + (-5.0/8*Math.sin(4.0/5 - 15*t) - 8.0/11*Math.sin(9.0/11 - 14*t)
                   - 43.0/21*Math.sin(1 - 7*t) - 433.0/31*Math.sin(7.0/5 - 5*t)
                   - 37.0/5*Math.sin(11.0/9 - 3*t) - 1873.0/9*Math.sin(34.0/23 -t)
                   + 631.0/8*Math.sin(2*t + 22.0/13) + 23.0/5*Math.sin(4*t + 16.0/9)
                   + 61.0/8*Math.sin(6*t + 16.0/9) + 41.0/13*Math.sin(8*t + 9.0/5)
                   + 28.0/9*Math.sin(9*t + 50.0/11) + 11.0/8*Math.sin(10*t + 3.0/5)
                   + 3.0/2*Math.sin(11*t + 33.0/7) + 13.0/8*Math.sin(12*t + 75.0/37)
                   + 3.0/8*Math.sin(13*t + 27.0/8) + 7.0/8*Math.sin(16*t + 13.0/6)
                   + 1231.0/5)*h(3*Math.PI - t)*h(t + Math.PI))
            * h(Math.sqrt(Math.signum(Math.sin(t/2))));
    }

    private static double h(double x) {
        return x < 0 ? 0 : 1;
    }
}
