New functions for vgagl

Search this archive.

From: Jay Link (jlink@interlink-bbs.com)
Date: Sat 04 Dec 1999 - 17:38:09 IST


Hi Everyone,

I am planning on submitting the following two functions to Matan for
inclusion into SVGAlib 1.4.1. Please let me know if you recommend any
changes, fixes, or improvements.

gl_fillcircle() is essentially gl_circle, only filled.

gl_bcircle() is the Bresenham algorithm contributed by Chris Atenasio,
which can be filled or unfilled. It looks good in 320 x 200, which is why
I think it's worthwhile. Keep in mind that WIDTH and HEIGHT are defined
internally by vgagl.


void gl_fillcircle(int sx, int sy, int r, int c)
{
    int x = 0,
        y = r,
        d = 1 - r;

    if (r < 1) {
	gl_setpixel(sx, sy, c);
	return;
    }
    if (__clip)
	if (sx + r < __clipx1 || sx - r > __clipx2
	    || sy + r < __clipy1 || sy - r > __clipy2)
	    return;
    gl_line(sx + x, sy + y, sx - x, sy + y, c);
    gl_line(sx + x, sy - y, sx - x, sy - y, c);
    gl_line(sx + y, sy + x, sx - y, sy + x, c);
    gl_line(sx + y, sy - x, sx - y, sy - x, c);
    while (x < y)
    {
        if (d < 0)
        {
            d += x * 2 + 3;
        } else {
            d += x * 2 - y * 2 + 5;
            y--;
        }
        x++;
        gl_line(sx + x, sy + y, sx - x, sy + y, c);
        gl_line(sx + x, sy - y, sx - x, sy - y, c);
        gl_line(sx + y, sy + x, sx - y, sy + x, c);
        gl_line(sx + y, sy - x, sx - y, sy - x, c);
    }
}


void gl_bcircle(int sx, int sy, int r, int c, int fill)
{
    int x = 0,
        y = r,
        d = 2 * (1 - r);

    if (r < 1) {
	gl_setpixel(sx, sy, c);
	return;
    }
    if (__clip)
	if (sx + r < __clipx1 || sx - r > __clipx2
	    || sy + r < __clipy1 || sy - r > __clipy2)
	    return;
    while (y >= 0)
    {
        if (fill == 0)
        {
            gl_setpixel(sx + x, sy + y, c);
            gl_setpixel(sx + x, sy - y, c);
            gl_setpixel(sx - x, sy + y, c);
            gl_setpixel(sx - x, sy - y, c);
        } else {
            gl_line(sx + x, sy + y, sx - x, sy + y, c);
            gl_line(sx + x, sy - y, sx - x, sy - y, c);
        }
        if ((d + y) > 0)
        {
            y--;
            d -= (2 * y * WIDTH / HEIGHT) - 1;
        }
        if (x > d)
        {
            x++;
            d += (2 * x) + 1;
        }
    }
}


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:22 IST