[net.graphics] yabcap

perry@well.UUCP (Perry S. Kivolowitz) (12/03/85)

The following is an implementation of bresenham's circle algorithm
specifically tailored for use in generating spherical surfaces. It
was part of a posting I sent to net.micro.amiga which simulated a
kinetic toy (ya know, the one with five steel balls. raise one on
one side and...) I do diffuse and specular shading on surfaces
constructed using the below routine. This routine is easily modified
to produce circles instead of scan-line displacements.

/*
** b r e s . c
**
** perry s. kivolowitz - ihnp4!ptsfa!well!perry
**
** not to be distritbuted for commercial use. any distribution
** must included this notice, please.
**
** generate radial  displacements according to bresenham's circle
** algorithm. suitable for running twice, giving a fast spherical
** surface.
**
*/
 
bres(r , array)
register short *array;
register r;
{
   register x , y , d;
 
   x = 0;
   y = r;
   d = 3 - 2 * r;
   while (x < y) {
      *(array + r - y) = x;
      *(array + r - x) = y;
      *(array + r + y - 1) = x;
      *(array + r + x - 1) = y;
      if (d < 0) d += 4 * x + 6;
      else d += 4 * (x - y--) + 10;
      x++;
   }
   if (x == y) {
      *(array + r - y) = x;
      *(array + r + y - 1) = x;
   }
}