private void disk_line () {
    double r, theta;

    // loops
    r = inner_radius;
    for (int l=0; l<=loops; l++, r+=dr) {
      gl.begin (GL.LINE_LOOP);

      theta = 0;
      for (int s=0; s<slices; s++, theta+=dtheta) {
        float x = (float) (r * Math.sin (theta));
        float y = (float) (r * Math.cos (theta));
        gl.vertex2f (x, y);
      }

      gl.end ();
    }


    // spokes
    theta = 0;
    for (int s=0; s<slices; s++, theta+=dtheta) {
      double x = (float) Math.sin (theta);
      double y = (float) Math.cos (theta);
      gl.begin (GL.LINE_STRIP);

      r = inner_radius;            
      for (int l=0; l<=loops; l++, r+=dr) {
        gl.vertex2f ((float) (r*x), (float) (r*y));
      }

      gl.end ();
    }
  }