Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Solved

Posted on 1997-07-02

This is problem I understand his line algorithm but not his circle. This is the one I have got can some one explain what he does with these variables and why he does it. I mean actually explain line by line what he does and why?

//THE CODE

typedef long fixed16_16;

fixed16_16 SIN_ACOS[1024];

/**************************************************************************

* circle_fast *

* Draws a circle by using fixed point numbers and a trigonometry *

* table. *

**************************************************************************/

void circle(int x,int y, int radius, byte color)

{

fixed16_16 n=0,invradius=(1/(float)radius)*0x10000L;

int dx=0,dy=radius-1;

word dxoffset,dyoffset,offset = (y<<8)+(y<<6)+x;

while (dx<=dy)

{

dxoffset = (dx<<8) + (dx<<6);

dyoffset = (dy<<8) + (dy<<6);

VGA[offset+dy-dxoffset] = color; /* octant 0 */

VGA[offset+dx-dyoffset] = color; /* octant 1 */

VGA[offset-dx-dyoffset] = color; /* octant 2 */

VGA[offset-dy-dxoffset] = color; /* octant 3 */

VGA[offset-dy+dxoffset] = color; /* octant 4 */

VGA[offset-dx+dyoffset] = color; /* octant 5 */

VGA[offset+dx+dyoffset] = color; /* octant 6 */

VGA[offset+dy+dxoffset] = color; /* octant 7 */

dx++;

n+=invradius;

dy = (radius * SIN_ACOS[n>>6]) >>16;

}

}

void main()

{

int i;

setvmode(0x13);

for(i=0;i<1024;i++) /* create the sin(arccos(x)) table. */

SIN_ACOS[i]=sin(acos((float)i/1024)) * 0x10000L;

circle(160, 100, 50, 7);

setvmode(0x03);

}

//

THANK YOU VERY MUCH... THIS IS VERY IMPORTANT!!!

//THE CODE

typedef long fixed16_16;

fixed16_16 SIN_ACOS[1024];

/*************************

* circle_fast *

* Draws a circle by using fixed point numbers and a trigonometry *

* table. *

**************************

void circle(int x,int y, int radius, byte color)

{

fixed16_16 n=0,invradius=(1/(float)ra

int dx=0,dy=radius-1;

word dxoffset,dyoffset,offset = (y<<8)+(y<<6)+x;

while (dx<=dy)

{

dxoffset = (dx<<8) + (dx<<6);

dyoffset = (dy<<8) + (dy<<6);

VGA[offset+dy-dxoffset] = color; /* octant 0 */

VGA[offset+dx-dyoffset] = color; /* octant 1 */

VGA[offset-dx-dyoffset] = color; /* octant 2 */

VGA[offset-dy-dxoffset] = color; /* octant 3 */

VGA[offset-dy+dxoffset] = color; /* octant 4 */

VGA[offset-dx+dyoffset] = color; /* octant 5 */

VGA[offset+dx+dyoffset] = color; /* octant 6 */

VGA[offset+dy+dxoffset] = color; /* octant 7 */

dx++;

n+=invradius;

dy = (radius * SIN_ACOS[n>>6]) >>16;

}

}

void main()

{

int i;

setvmode(0x13);

for(i=0;i<1024;i++) /* create the sin(arccos(x)) table. */

SIN_ACOS[i]=sin(acos((floa

circle(160, 100, 50, 7);

setvmode(0x03);

}

//

THANK YOU VERY MUCH... THIS IS VERY IMPORTANT!!!

1 Comment

The x,y coordinates of a circle are:

x= r*cos(n)

y= r*sin(n)

where n is the angle and r the radius (I stick to the variable

naming given in your code); so

n= acos(x/r)

and

y= r*sin(acos(x/r)

This is basically what happens in function 'circle'. The

angle 'n' is incremented by 1/r (i.e. 'invradius') at every

iteration of the loop. Variable 'x' is adjusted directly 'dx++'

and variable 'dy' is adjusted by looking up the appropriate

sin(acos(x/r)) value in the table.

FYI, this is not a very efficient circle drawing algorithm

(and it has nothing to do with Bresenham either).

The original Bresenham alogirhm just needs a couple

of additions and a few shifts per iteration; no precomputed

table of arccosines and sines is needed ...

kind regards,

Jos aka jos@and.nl

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Title | # Comments | Views | Activity |
---|---|---|---|

Retrieve PID of MicrosoftEdge.exe with GetForegroundWindow() | 6 | 145 | |

Lambda for random numbers problem | 7 | 112 | |

How to convert utf32 to utf16 using C++ on Ubuntu Linux 15.10 with the gcc c++11 compiler. | 4 | 202 | |

Issues with C++ Class | 19 | 92 |

Join the community of 500,000 technology professionals and ask your questions.

Connect with top rated Experts

**14** Experts available now in Live!