circle.h

//
// circle.h
//  defines the functions to draw circle.
//

#ifndef CIRCLE_H
#define CIRCLE_H

#include <windows.h>

typedef struct tagCircle
{
  int x;
  int y;
  int radius;
} Circle;


/* set the window handle */
void SetWindowHandle(HWND);

/* set pixel 
  @parms int x xposition
  @parms int y yposition
  @parms Color color of the pixel.
  @returns void
*/
void Circle_SetPixel(int,int,COLORREF&);


/* circle dawing function
   
   @parms int x x position of the circle to be drawn
   @parms int y center y position.
   @parms int radius radius of the circle.

 */
void DrawCircle(int,int,int);

#endif // END CIRCLE_H

circle.cpp

#include <windows.h>
#include "circle.h"

/* set window handle */
static HWND sHwnd;
void SetWindowHandle(HWND hwnd)
{
  sHwnd=hwnd; 
}

static COLORREF sDefaultColor=RGB(255,0,0);

/* SetPixel */
void Circle_SetPixel(int x,int y,COLORREF& color=sDefaultColor)
{
  if(sHwnd==NULL){
    MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
    exit(0);
  }

  HDC hdc=GetDC(sHwnd);
    SetPixel(hdc,x,y,color);
  ReleaseDC(sHwnd,hdc);
  return;
  // NEVERREACH //
}

#define PLOT_ALL_EIGHT(x,y,x1,y1)  { Circle_SetPixel(x+x1,y+y1);Circle_SetPixel(y+x1,x+y1);\
                                    Circle_SetPixel(-x+x1,y+y1);Circle_SetPixel(-y+x1,x+y1);\
                                    Circle_SetPixel(-x+x1,-y+y1);Circle_SetPixel(-y+x1,-x+y1);\
                                    Circle_SetPixel(x+x1,-y+y1);Circle_SetPixel(y+x1,-x+y1);}


/* DrawCircle */
void DrawCircle(int x,int y,int radius)
{
  int yk =radius;
  int xk=0;
  double pk=5.0/4-radius;   // you may wonder why I used the double floating point arithmetic here.
                            // the answer is in modern computing architecture encourages the use of floating 
                            // point math.

  while(yk>=xk)
  {
    PLOT_ALL_EIGHT(xk,yk,x,y)
    if(pk>=0)
    {
      pk+=2*xk -2*yk +5;
      xk=xk+1;
      yk=yk-1;
    }else
    {
      pk+=2*xk+3;
      xk=xk+1;
      yk=yk;
    }    
  }  
}

main.cpp

//
// main.cpp
//   The file that consists the WinMain and the WndProc. 
//   
//
#include <windows.h>
#include "circle.h"


/* forward declarations */
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
  static TCHAR szAppName[] =TEXT("circle");
  WNDCLASS wndclass; 
     wndclass.style         = CS_HREDRAW|CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
  
  // Register the window //
  if(!RegisterClass(&wndclass))
  {
    MessageBox(NULL,"Registering the class failled","Error",MB_OK|MB_ICONERROR);
    exit(0);
  }
  
  // CreateWindow //           
  HWND hwnd=CreateWindow(szAppName,"Circle Algorithm",
WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         NULL,
                         NULL,
                         hInstance,
                         NULL);
   if(!hwnd)
   {
     MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);
     exit(0);
   }
   // ShowWindow and UpdateWindow //
   ShowWindow(hwnd,iCmdShow);
   UpdateWindow(hwnd);

   // Message Loop //
   MSG msg;
   while(GetMessage(&msg,NULL,0,0))
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }

  /* return no error to the operating system */
  return 0;
}



/* Window Procedure WndProc */
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch(message)
  {
    
    case WM_PAINT:
       SetWindowHandle(hwnd);
       DrawCircle(100,100,100);
       return 0;    
    case WM_CLOSE: // FAIL THROUGH to call DefWindowProc
       break;
     
    case WM_DESTROY:
       PostQuitMessage(0);
       return 0;
    default:
       break; // FAIL to call DefWindowProc //
  }
  return DefWindowProc(hwnd,message,wParam,lParam);
}

compile.bat

echo off
g++ -c -o main.o main.cpp -g
g++ -c -o circle.o circle.cpp -g
REM linking........
g++ -o circle_algorithm.exe main.o circle.o -mwindows -g
echo on

please note that you need mingw installed and your paths have been setten inorder to use compile.bat directly. Otherwise modify the compile.bat to compile it using microsoft C++ compiler cl.exe.


--Happy Coding--

179 Views
About the Author

well I love technology and want to implement new and make the human life easy.ppl say I am kind thanks and I love to hear that.In programming I am not a expert , but love expertise advice , I want to listen and debug and read than code.My #1 programming language is C++. and I love VLSI and FPGA electronic subjects too.Currently I am a 3rd year student of BIT externaland I just completing my degree in informationtechnology. My favourate linux distro is slax. (there is an old story if you know RH you know RH ,if you know slax you know linux) and I love programming with the xlib and still learning it.In this semester we have a compiler theory , AI as subjects. I love those subjects. and Open,and want to think and implement something new. and my idea about the technology is Technologyshould be easily accessible , low cost , and reliable and should make the human life easy.and I living in the bambalapitiya city north colombo sri lanka.where is a best place to learn electronics. :S