How to draw a circle with stars in C++?

19,719

enter image description here

The code below is a simple way of drawing a circle without using fancy functions to jump to any arbitrary chosen x or y position.

#include <iostream>
#include <math.h>

using namespace std;

int pth (int x,int y)  {
    return sqrt (pow(x,2)+pow(y,2));
 }

int main ( )  {

    int c=0;
    int r=10;

    const int width=r;
    const int length=r*1.5;

    for (int y=width;y >= -width;y-=2)  {
        for (int x=-length;x <= length;x++)  {

            if ((int) pth(x,y)==r) cout << "*";
            else cout << " ";

         }
         cout << "\n";
     }
     cin.get();

return 0;
 }

If you want more advanced code and you are on the windows platform and you use Visual Studio to create programs then the code below would be of intrest.

It uses functions like SetConsoleCursorPosition() to set x and y positions, SetConsoleTextAttribute() to set colors. The code draws lines , pixels, rectangles and circles in the console text window.

enter image description here

#include<stdio.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <windows.h>

using namespace std;

void gotoxy(int x, int y);
void setcolor(WORD color);
void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor);
void clearscreen();
void drawpixel( unsigned char x, unsigned char y, unsigned char Color);
void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character);
void drawcircle(int x, int y, int a, int b, int color);
void drawline(int x0, int y0, int x1, int y1, int color);
void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol);
void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]);
void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,unsigned char bkcol,char text_[]);
void drawcolorpalette();



int main(void){

    setcolor(15);
    clearscreen();
    drawwindow(3,2,77,15,31,31,31,"a window is drawn");

    int X = 40;
    int Y = 12;
    int rad = 8;
    int col = 15;
    double deg = 0;

    // draw a circle using sin( ) and cos( )
    do {
         X = (int) (rad * cos(deg));
         Y = (int) (rad * sin(deg));
         drawpixel2 (40+X, 12+Y,  col, '*' );
         deg +=  0.005;
    }   while (deg <= 6.4);




    drawcircle(60, 10, 8, 8, 15);

    drawline(1,1,77,22,15);

    gotoxy(40,4);
    cout<<"Another circle is drawn.";


    gotoxy(60,22);
    cout<<"A Line is drawn.";

    gotoxy(20,13);
    cout<<"A circle is drawn.";



    setcolor(7);
    gotoxy(1,23);
    cin.ignore();
    cin.get();

return 0;
}


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

void gotoxy(int x, int y){
    COORD coord;
    coord.X = x; coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    return;
}

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

void setcolor(WORD color){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}


//
//     colors:
//     0 = Black
//     1 = Blue
//     2 = Green
//     3 = Cyan
//     4 = Red
//     5 = Magenta
//     6 = Yellow
//     7 = LightGray
//     8 = DarkGray
//     9 = LightBlue
//     10 = LightGreen
//     11 = LightCyan
//     12 = LightRed
//     13 = LightMagenta
//     14 = LightYellow
//     15 = White


//

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

void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor){
   int color=16*BackGroundColor+ForeGroundColor;
   setcolor(color);
}

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

void clearscreen(){
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
    return;
}

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

void drawpixel( unsigned char x, unsigned char y, unsigned char Color){
        setcolor(Color);
        gotoxy(x,y);printf("Û");
}

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

void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character){
        setcolor(Color);
        gotoxy(x,y);printf("%c",character);
}

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

void drawcircle(int x, int y, int a, int b, int color){
    int wx, wy;
    int thresh;
    int asq = a * a;
    int bsq = b * b;
    int xa, ya;

    drawpixel(x, y+b, color);
    drawpixel(x, y-b, color);

    wx = 0;
    wy = b;
    xa = 0;
    ya = asq * 2 * b;
    thresh = asq / 4 - asq * b;

    for (;;) {
        thresh += xa + bsq;

        if (thresh >= 0) {
            ya -= asq * 2;
            thresh -= ya;
            wy--;
        }

        xa += bsq * 2;
        wx++;

        if (xa >= ya)
          break;


        drawpixel(x+wx, y-wy, color);
        drawpixel(x-wx, y-wy, color);
        drawpixel(x+wx, y+wy, color);
        drawpixel(x-wx, y+wy, color);
    }

    drawpixel(x+a, y, color);
    drawpixel(x-a, y, color);

    wx = a;
    wy = 0;
    xa = bsq * 2 * a;

    ya = 0;
    thresh = bsq / 4 - bsq * a;

    for (;;) {
        thresh += ya + asq;

        if (thresh >= 0) {
            xa -= bsq * 2;
            thresh = thresh - xa;
            wx--;
        }

        ya += asq * 2;
        wy++;

        if (ya > xa)
          break;

        drawpixel(x+wx, y-wy, color);
        drawpixel(x-wx, y-wy, color);
        drawpixel(x+wx, y+wy, color);
        drawpixel(x-wx, y+wy, color);
    }
}

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

void drawline(int x0, int y0, int x1, int y1, int color){
    int pix = color;
    int dy = y1 - y0;
    int dx = x1 - x0;
    int stepx, stepy;

    if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
    if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
    dy <<= 1;                                                  // dy is now 2*dy
    dx <<= 1;                                                  // dx is now 2*dx

  drawpixel( x0, y0,pix);
    if (dx > dy) {
        int fraction = dy - (dx >> 1);                         // same as 2*dy - dx
        while (x0 != x1) {
            if (fraction >= 0) {
                y0 += stepy;
                fraction -= dx;                                // same as fraction -= 2*dx
            }
            x0 += stepx;
            fraction += dy;                                    // same as fraction -= 2*dy
            drawpixel( x0, y0,pix);
        }
    } else {
        int fraction = dx - (dy >> 1);
        while (y0 != y1) {
            if (fraction >= 0) {
                x0 += stepx;
                fraction -= dy;
            }
            y0 += stepy;
            fraction += dx;
            drawpixel( x0, y0,pix);
        }
    }
}

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


void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[])
{  
    unsigned i,j,m;
    {

       m=(sx-x);                       //differential
       j=m/8;                          //adjust
       j=j-1;                          //more adjustment
       gotoxy(x,y);printf("É");       //Top left corner of box
       gotoxy(sx,y);printf("»");      //Top right corner of box
       gotoxy(x,sy);printf("È");      //Bottom left corner of box
       gotoxy(sx,sy);printf("¼");     //Bottom right corner of box

       for (i=x+1;i<sx;i++)
       {
          gotoxy(i,y);printf("Í");     // Top horizontol line
          gotoxy(i,sy);printf("Í");    // Bottom Horizontal line
       }

       for (i=y+1;i<sy;i++)
       {
          gotoxy(x,i);printf("º");     //Left Vertical line
          gotoxy(sx,i);printf("º");    //Right Vertical Line
       }

          gotoxy(x+j,y);printf(text_); //put Title
          gotoxy(1,24);
    }
}

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

void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol)
{
    int x,y;
    setcolor(bkcol);                       //Set to color bkcol

    for (y=y1;y<y2;y++)                    //Fill Y Region Loop
    {
        for (x=x1;x<x2;x++)               //Fill X region Loop
        {
          gotoxy(x,y);printf(" ");       //Draw Solid space
        }
    }
}

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

void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,
         unsigned char col, unsigned char col2,unsigned char bkcol,char text_[])
{
    drawfilledrectangle(x,y,sx,sy,bkcol);
    drawframe(x,y,sx,sy,col,col2,text_);
}

void drawcolorpalette()
{
    for (int i=0;i<16;i++)
    {
        for (int j=0;j<16;j++)
        {
            setForeGroundAndBackGroundColor(i,j);
            gotoxy(i*4,j);printf("%d",(i*j)+1);


        }

    }

}
Share:
19,719
Jim_dddd
Author by

Jim_dddd

Updated on June 04, 2022

Comments

  • Jim_dddd
    Jim_dddd over 1 year

    I'm new to C++ and I'm doing a practice question. What I did:

    for (int i = 0; i < 2 * r; i++) {
        for (int j = 0; j < 2 * r; j++) {
            if (i == sqrt((static_cast<int> (r))^2 - j^2)) {
                cout << "*";
            } else {
                cout << " ";
            }
        }
        cout << endl;
    }
    

    However, it does not draw me anything. :(