import java.io.*;


/* Точка для алгоритма */
class Points
{
  public float x, y, c_x, c_y;
  public int i_x, i_y;


  /* Конструктор */
  Points (float x, float y)
    {
      this.x = x;
      this.y = y;

      i_x = 0;
      i_y = 0;
      c_x = 0;
      c_y = 0;
    }


  /* Прочитать значение x */
  public float getX ()
    {
      return x;
    }


  /* Прочитать значение y */
  public float getY ()
    {
      return y;
    }


  /* Установить значение x */
  public void setX (float a)
    {
      x = a;
    }


  /* Установить значение y */
  public void setY (float a)
    {
      y = a;
    }


  /* Прочитать значение c_x */
  public float getCX ()
    {
      return c_x;
    }


  /* Прочитать значение c_y */
  public float getCY ()
    {
      return c_y;
    }


  /* Установить значение c_x */
  public void setCX (float a)
    {
      c_x = a;
    }


  /* Установить значение c_y */
  public void setCY (float a)
    {
      c_y = a;
    }


  /* Прочитать значение i_x */
  public int getIX ()
    {
      return i_x;
    }


  /* Прочитать значение i_y */
  public int getIY ()
    {
      return i_y;
    }


  /* Установить значение i_x */
  public void setIX (int a)
    {
      i_x = a;
    }


  /* Установить значение i_y */
  public void setIY (int a)
    {
      i_y = a;
    }
}



class SimplificationAlg
{
  private float eps;
  private double fi;
  private Points pt1, pt2;


  /* Конструктор */
  SimplificationAlg () throws IOException
    {
      eps = 1;
      fi = -Math.PI / 4;

      pt1 = null;
      pt2 = null;
    }


  /* Закрыть файл */
  public void close () throws IOException
    {
      fs.close ();
    }


  /* Обработать новую точку */
  public void nextPoint (float x1, float y1) throws IOException
    {
      float x2, y2;

      x2 = x1 * (float) Math.cos (fi) + y1 * (float) Math.sin (fi);
      y2 = y1 * (float) Math.cos (fi) - x1 * (float) Math.sin (fi);

      if (pt1 == null)
        {
          pt1 = new Points (x1, y1);
          pt2 = new Points (x2, y2);

          return;
        }

      if ((x1 - pt1.getX ()) * (x1 - pt1.getX ()) +
          (y1 - pt1.getY ()) * (y1 - pt1.getY ()) < eps * eps * 2)
        return;

      if (isWayPoint (pt1, x1, y1) | isWayPoint (pt2, x2, y2))
        {
          String str = new String (x1 + " " + x2 + "\n");
          byte buf[] = new byte[str.length ()];

          str.getBytes (0, buf.length, buf, 0);

          fs.write (buf);
        }

      pt1.setX (x1);
      pt1.setY (y1);
      pt2.setX (x2);
      pt2.setX (y2);
    }


  /* Проверка точки поворота */
  private boolean isWayPoint (Points pt, float x, float y)
    {
      int delta_x, delta_y;
      boolean wp = false;

      /* */
      if ((x - pt.getX ()) >= 0)
        delta_x = 1;
      else
        delta_x = -1;

      /* */
      if ((y - pt.getY ()) >= 0)
        delta_y = 1;
      else
        delta_y = -1;

      /* */
      if (delta_x != pt.getIX ())
        {
          if (Math.abs (pt.getCX ()) >= Math.abs (pt.getCY ()))
	    wp = true;

          pt.setCX (0);
          pt.setIX (delta_x);
        }

      /* */
      if (delta_y != pt.getIY ())
        {
          if (Math.abs (pt.getCY ()) >= Math.abs (pt.getCX ()))
	    wp = true;

          pt.setCY (0);
          pt.setIY (delta_y);
        }

      /* */
      pt.setCX (pt.getCX () + x - pt.getX ());
      pt.setCY (pt.getCY () + y - pt.getY ());

      return wp;
    }
}
