//Uses fixed-point-arithmetic.

I64 x[16], y[16], dx[16], dy[16];

U0 Init()
{
    I64 i;
    F64 theta;

    MemSet(x, 0, sizeof(x));
    MemSet(y, 0, sizeof(y));
    for (i = 0; i < 16; i++)
    {
        theta = Rand*2*pi;
        dx[i] = I32_MAX * Cos(theta);
        dy[i] = I32_MAX * Sin(theta);
    }
}
 
U0 Bounce()
{
    CDC *dc = DCAlias;
    I64  i, ch;

    Init;
    try
    {//Catch <CTRL-ALT-c>
        do
        {
            for (i = 0; i < 16; i++)
            {
                dc->color  =i;
                GrPlot(dc, x[i].i32[1], y[i].i32[1]);
                x[i] += dx[i];
                y[i] += dy[i];
                if (!(0 <= x[i] < Fs->pix_width << 32))
                {
                    x[i] -= dx[i];
                    dx[i] = -dx[i];
                }
                if (!(0 <= y[i] < Fs->pix_height << 32))
                {
                    y[i] -= dy[i];
                    dy[i] = -dy[i];
                }
            }
            Yield;
        }
        while (!(ch = CharScan) || (ch != CH_SHIFT_ESC && ch != CH_ESC));

    }
    catch
        PutExcept;
    DCFill(dc);
    DCDel(dc);
}
 
Bounce;