The mid-point circle drawing algorithm is an algorithm used to determine the points needed for rasterizing a circle.
We use the mid-point algorithm to calculate all the perimeter points of the circle in the first octant and then print them along with their mirror points in the other octants. This will work because a circle is symmetric about its centre.

The algorithm is very similar to the Mid-Point Line Generation Algorithm. Here, only the boundary condition is different.
For any given pixel (x, y), the next pixel to be plotted is either (x, y+1) or (x-1, y+1). This can be decided by following the steps below.
- Find the mid-point p of the two possible pixels i.e (x-0.5, y+1)
- If p lies inside or on the circle perimeter, we plot the pixel (x, y+1), otherwise if it’s outside we plot the pixel (x-1, y+1)
Boundary Condition : Whether the mid-point lies inside or outside the circle can be decided by using the formula:-
Given a circle centered at (0,0) and radius r and a point p(x,y)
F(p) = x2 + y2 – r2
if F(p)<0, the point is inside the circle
F(p)=0, the point is on the perimeter
F(p)>0, the point is outside the circle

In our program, we denote F(p) with P. The value of P is calculated at the mid-point of the two contending pixels i.e. (x-0.5, y+1). Each pixel is described with a subscript k.
Pk = (Xk — 0.5)2 + (yk + 1)2 – r2
Now,
xk+1 = xk or xk-1 , yk+1= yk +1
∴ Pk+1 = (xk+1 – 0.5)2 + (yk+1 +1)2 – r2
= (xk+1 – 0.5)2 + [(yk +1) + 1]2 – r2
= (xk+1 – 0.5)2 + (yk +1)2 + 2(yk + 1) + 1 – r2
= (xk+1 – 0.5)2 + [ – (xk – 0.5)2 +(xk – 0.5)2 ] + (yk + 1)2 – r2 + 2(yk + 1) + 1
= Pk + (xk+1 – 0.5)2 – (xk – 0.5)2 + 2(yk + 1) + 1
= Pk + (x2k+1 – x2k) – (xk+1 – xk) + 2(yk + 1) + 1
= Pk + 2(yk +1) + 1, when Pk <=0 i.e the midpoint is inside the circle
(xk+1 = xk)
Pk + 2(yk +1) – 2(xk – 1) + 1, when Pk>0 I.e the mid point is outside the circle(xk+1 = xk-1)
The first point to be plotted is (r, 0) on the x-axis. The initial value of P is calculated as follows:-
P1 = (r – 0.5)2 + (0+1)2 – r2
= 1.25 – r
= 1 -r (When rounded off)
Examples:
Input : Centre -> (0, 0), Radius -> 3
Output : (3, 0) (3, 0) (0, 3) (0, 3)
(3, 1) (-3, 1) (3, -1) (-3, -1)
(1, 3) (-1, 3) (1, -3) (-1, -3)
(2, 2) (-2, 2) (2, -2) (-2, -2)

Input : Centre -> (4, 4), Radius -> 2
Output : (6, 4) (6, 4) (4, 6) (4, 6)
(6, 5) (2, 5) (6, 3) (2, 3)
(5, 6) (3, 6) (5, 2) (3, 2)
CPP
#include<iostream>
using namespace std;
void midPointCircleDraw( int x_centre, int y_centre, int r)
{
int x = r, y = 0;
cout << "(" << x + x_centre << ", " << y + y_centre << ") " ;
if (r > 0)
{
cout << "(" << x + x_centre << ", " << -y + y_centre << ") " ;
cout << "(" << y + x_centre << ", " << x + y_centre << ") " ;
cout << "(" << -y + x_centre << ", " << x + y_centre << ")\n" ;
}
int P = 1 - r;
while (x > y)
{
y++;
if (P <= 0)
P = P + 2*y + 1;
else
{
x--;
P = P + 2*y - 2*x + 1;
}
if (x < y)
break ;
cout << "(" << x + x_centre << ", " << y + y_centre << ") " ;
cout << "(" << -x + x_centre << ", " << y + y_centre << ") " ;
cout << "(" << x + x_centre << ", " << -y + y_centre << ") " ;
cout << "(" << -x + x_centre << ", " << -y + y_centre << ")\n" ;
if (x != y)
{
cout << "(" << y + x_centre << ", " << x + y_centre << ") " ;
cout << "(" << -y + x_centre << ", " << x + y_centre << ") " ;
cout << "(" << y + x_centre << ", " << -x + y_centre << ") " ;
cout << "(" << -y + x_centre << ", " << -x + y_centre << ")\n" ;
}
}
}
int main()
{
midPointCircleDraw(0, 0, 3);
return 0;
}
|
C
#include<stdio.h>
void midPointCircleDraw( int x_centre, int y_centre, int r)
{
int x = r, y = 0;
printf ( "(%d, %d) " , x + x_centre, y + y_centre);
if (r > 0)
{
printf ( "(%d, %d) " , x + x_centre, -y + y_centre);
printf ( "(%d, %d) " , y + x_centre, x + y_centre);
printf ( "(%d, %d)\n" , -y + x_centre, x + y_centre);
}
int P = 1 - r;
while (x > y)
{
y++;
if (P <= 0)
P = P + 2*y + 1;
else
{
x--;
P = P + 2*y - 2*x + 1;
}
if (x < y)
break ;
printf ( "(%d, %d) " , x + x_centre, y + y_centre);
printf ( "(%d, %d) " , -x + x_centre, y + y_centre);
printf ( "(%d, %d) " , x + x_centre, -y + y_centre);
printf ( "(%d, %d)\n" , -x + x_centre, -y + y_centre);
if (x != y)
{
printf ( "(%d, %d) " , y + x_centre, x + y_centre);
printf ( "(%d, %d) " , -y + x_centre, x + y_centre);
printf ( "(%d, %d) " , y + x_centre, -x + y_centre);
printf ( "(%d, %d)\n" , -y + x_centre, -x + y_centre);
}
}
}
int main()
{
midPointCircleDraw(0, 0, 3);
return 0;
}
|
Java
class GFG {
static void midPointCircleDraw( int x_centre,
int y_centre, int r)
{
int x = r, y = 0 ;
System.out.print( "(" + (x + x_centre)
+ ", " + (y + y_centre) + ")" );
if (r > 0 ) {
System.out.print( "(" + (x + x_centre)
+ ", " + (-y + y_centre) + ")" );
System.out.print( "(" + (y + x_centre)
+ ", " + (x + y_centre) + ")" );
System.out.println( "(" + (-y + x_centre)
+ ", " + (x + y_centre) + ")" );
}
int P = 1 - r;
while (x > y) {
y++;
if (P <= 0 )
P = P + 2 * y + 1 ;
else {
x--;
P = P + 2 * y - 2 * x + 1 ;
}
if (x < y)
break ;
System.out.print( "(" + (x + x_centre)
+ ", " + (y + y_centre) + ")" );
System.out.print( "(" + (-x + x_centre)
+ ", " + (y + y_centre) + ")" );
System.out.print( "(" + (x + x_centre) +
", " + (-y + y_centre) + ")" );
System.out.println( "(" + (-x + x_centre)
+ ", " + (-y + y_centre) + ")" );
if (x != y) {
System.out.print( "(" + (y + x_centre)
+ ", " + (x + y_centre) + ")" );
System.out.print( "(" + (-y + x_centre)
+ ", " + (x + y_centre) + ")" );
System.out.print( "(" + (y + x_centre)
+ ", " + (-x + y_centre) + ")" );
System.out.println( "(" + (-y + x_centre)
+ ", " + (-x + y_centre) + ")" );
}
}
}
public static void main(String[] args) {
midPointCircleDraw( 0 , 0 , 3 );
}
}
|
Python3
def midPointCircleDraw(x_centre, y_centre, r):
x = r
y = 0
print ( "(" , x + x_centre, ", " ,
y + y_centre, ")" ,
sep = " ", end = " ")
if (r > 0 ) :
print ( "(" , x + x_centre, ", " ,
- y + y_centre, ")" ,
sep = " ", end = " ")
print ( "(" , y + x_centre, ", " ,
x + y_centre, ")" ,
sep = " ", end = " ")
print ( "(" , - y + x_centre, ", " ,
x + y_centre, ")" , sep = "")
P = 1 - r
while x > y:
y + = 1
if P < = 0 :
P = P + 2 * y + 1
else :
x - = 1
P = P + 2 * y - 2 * x + 1
if (x < y):
break
print ( "(" , x + x_centre, ", " , y + y_centre,
")" , sep = " ", end = " ")
print ( "(" , - x + x_centre, ", " , y + y_centre,
")" , sep = " ", end = " ")
print ( "(" , x + x_centre, ", " , - y + y_centre,
")" , sep = " ", end = " ")
print ( "(" , - x + x_centre, ", " , - y + y_centre,
")" , sep = "")
if x ! = y:
print ( "(" , y + x_centre, ", " , x + y_centre,
")" , sep = " ", end = " ")
print ( "(" , - y + x_centre, ", " , x + y_centre,
")" , sep = " ", end = " ")
print ( "(" , y + x_centre, ", " , - x + y_centre,
")" , sep = " ", end = " ")
print ( "(" , - y + x_centre, ", " , - x + y_centre,
")" , sep = "")
if __name__ = = '__main__' :
midPointCircleDraw( 0 , 0 , 3 )
|
C#
using System;
class GFG {
static void midPointCircleDraw( int x_centre,
int y_centre, int r)
{
int x = r, y = 0;
Console.Write( "(" + (x + x_centre)
+ ", " + (y + y_centre) + ")" );
if (r > 0)
{
Console.Write( "(" + (x + x_centre)
+ ", " + (-y + y_centre) + ")" );
Console.Write( "(" + (y + x_centre)
+ ", " + (x + y_centre) + ")" );
Console.WriteLine( "(" + (-y + x_centre)
+ ", " + (x + y_centre) + ")" );
}
int P = 1 - r;
while (x > y)
{
y++;
if (P <= 0)
P = P + 2 * y + 1;
else
{
x--;
P = P + 2 * y - 2 * x + 1;
}
if (x < y)
break ;
Console.Write( "(" + (x + x_centre)
+ ", " + (y + y_centre) + ")" );
Console.Write( "(" + (-x + x_centre)
+ ", " + (y + y_centre) + ")" );
Console.Write( "(" + (x + x_centre) +
", " + (-y + y_centre) + ")" );
Console.WriteLine( "(" + (-x + x_centre)
+ ", " + (-y + y_centre) + ")" );
if (x != y)
{
Console.Write( "(" + (y + x_centre)
+ ", " + (x + y_centre) + ")" );
Console.Write( "(" + (-y + x_centre)
+ ", " + (x + y_centre) + ")" );
Console.Write( "(" + (y + x_centre)
+ ", " + (-x + y_centre) + ")" );
Console.WriteLine( "(" + (-y + x_centre)
+ ", " + (-x + y_centre) + ")" );
}
}
}
public static void Main()
{
midPointCircleDraw(0, 0, 3);
}
}
|
PHP
<?php
function midPointCircleDraw( $x_centre ,
$y_centre ,
$r )
{
$x = $r ;
$y = 0;
echo "(" , $x + $x_centre , "," , $y + $y_centre , ")" ;
if ( $r > 0)
{
echo "(" , $x + $x_centre , "," , - $y + $y_centre , ")" ;
echo "(" , $y + $x_centre , "," , $x + $y_centre , ")" ;
echo "(" ,- $y + $x_centre , "," , $x + $y_centre , ")" , "\n" ;
}
$P = 1 - $r ;
while ( $x > $y )
{
$y ++;
if ( $P <= 0)
$P = $P + 2 * $y + 1;
else
{
$x --;
$P = $P + 2 * $y -
2 * $x + 1;
}
if ( $x < $y )
break ;
echo "(" , $x + $x_centre , "," , $y + $y_centre , ")" ;
echo "(" ,- $x + $x_centre , "," , $y + $y_centre , ")" ;
echo "(" , $x + $x_centre , "," , - $y + $y_centre , ")" ;
echo "(" ,- $x + $x_centre , "," , - $y + $y_centre , ")" , "\n" ;
if ( $x != $y )
{
echo "(" , $y + $x_centre , "," , $x + $y_centre , ")" ;
echo "(" ,- $y + $x_centre , "," , $x + $y_centre , ")" ;
echo "(" , $y + $x_centre , "," , - $x + $y_centre , ")" ;
echo "(" ,- $y + $x_centre , "," , - $x + $y_centre , ")" , "\n" ;
}
}
}
midPointCircleDraw(0, 0, 3);
?>
|
Javascript
<script>
function midPointCircleDraw(x_centre , y_centre , r) {
var x = r, y = 0;
document.write( "(" + (x + x_centre) + ", " + (y + y_centre) + ")" );
if (r > 0) {
document.write( "(" + (x + x_centre) + ", " + (-y + y_centre) + ")" );
document.write( "(" + (y + x_centre) + ", " + (x + y_centre) + ")" );
document.write( "(" + (-y + x_centre) + ", " + (x + y_centre) + ")<br/>" );
}
var P = 1 - r;
while (x > y) {
y++;
if (P <= 0)
P = P + 2 * y + 1;
else {
x--;
P = P + 2 * y - 2 * x + 1;
}
if (x < y)
break ;
document.write( "(" + (x + x_centre) + ", " + (y + y_centre) + ")" );
document.write( "(" + (-x + x_centre) + ", " + (y + y_centre) + ")" );
document.write( "(" + (x + x_centre) + ", " + (-y + y_centre) + ")" );
document.write( "(" + (-x + x_centre) + ", " + (-y + y_centre) + ")<br/>" );
if (x != y) {
document.write( "(" + (y + x_centre) + ", " + (x + y_centre) + ")" );
document.write( "(" + (-y + x_centre) + ", " + (x + y_centre) + ")" );
document.write( "(" + (y + x_centre) + ", " + (-x + y_centre) + ")" );
document.write( "(" + (-y + x_centre) + ", " + (-x + y_centre) + ")<br/>" );
}
}
}
midPointCircleDraw(0, 0, 3);
</script>
|
Output:
(3, 0) (3, 0) (0, 3) (0, 3)
(3, 1) (-3, 1) (3, -1) (-3, -1)
(1, 3) (-1, 3) (1, -3) (-1, -3)
(2, 2) (-2, 2) (2, -2) (-2, -2)
Time Complexity: O(x – y)
Auxiliary Space: O(1)
References : Midpoint Circle Algorithm
Image References : Octants of a circle, Rasterised Circle, the other images were created for this article by the geek
Thanks Tuhina Singh and Teva Zanker for improving this article.
This article is contributed by Nabaneet Roy. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.