Code covered by the BSD License  

Highlights from
Circle pixel coordinates using mid-point algorithm

4.5

4.5 | 2 ratings Rate this file 33 Downloads (last 30 days) File Size: 2.67 KB File ID: #33844
image thumbnail

Circle pixel coordinates using mid-point algorithm

by

 

20 Nov 2011 (Updated )

Return the optimal pixel coordinates of a circle, given its center and radius.

| Watch this File

File Information
Description

GETMIDPOINTCIRCLE return the x,y pixel coordinates of a circle
 
  [x y] = getmidpointcircle(x0, y0, radius) returns the pixel coordinates
  of the circle centered at pixel position [x0 y0] and of the given integer
  radius. The mid-point circle algorithm is used for computation
  (http://en.wikipedia.org/wiki/Midpoint_circle_algorithm).
 
  This function is aimed at image processing applications, where the
  integer pixel coordinates matter, and for which one pixel cannot be
  missed or duplicated. In that view, using rounded trigonometric
  coordinates generated using cosine calls are inadequate. The mid-point
  circle algorithm is the answer.
 
  Accent is made on performance. We compute in advance the number of point
  that will be generated by the algorithm, to pre-allocate the coordinates
  arrays. I have tried to do this using a MATLAB class implementing the
  iterator pattern, to avoid computing the number of points in advance and
  still be able to iterate over circle points. However, it turned out that
  repeated function calls is extremely expansive, and the class version of
  this function is approximately 1000 times slower. With this function, you
  can get the pixel coordinates of a circle of radius 1000 in 0.16 ms, and
  this time will scale linearly with increasing radius (e.g. it takes
  0.16 s for a radius of 1 million).
 
  Also, this functions ensure that sorted coordinates are returned. The
  mid-point algorithm normally generates a point for the 8 circles octants
  in one iteration. If they are put in an array in that order, the [x y]
  points will jump from one octant to another. Here, we ensure that they
  are returned in order, starting from the top point, and going clockwise.
 
  EXAMPLE
 
  n_circles = 20;
  color_length = 100;
  image_size = 128;
  max_radius = 20;
  
  I = zeros(image_size, image_size, 3, 'uint8');
  colors = hsv(color_length);
  
  for i = 1 : n_circles
      
      x0 = round( image_size * rand);
      y0 = round( image_size * rand);
      radius = round( max_radius * rand );
      
      [x y] = getmidpointcircle(x0, y0, radius);
      
      index = 1 ;
      for j = 1 : numel(x)
          xp = x(j);
          yp = y(j);
          
          if ( xp < 1 || yp < 1 || xp > image_size || yp > image_size )
              continue
          end
          I(xp, yp, :) = round( 255 * colors(index, :) );
          index = index + 1;
          if index > color_length
              index = 1;
          end
      end
      
  end
  
  imshow(I, []);
  

MATLAB release MATLAB 7.12 (R2011a)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (2)
18 Feb 2014 Jun

nice work

09 Apr 2013 Juan

It works well, thanks for uploading

Updates
21 Feb 2013

Adds an analytical expression for the predicted number of data points, needed to pre-allocate arrays correctly. Gives a minor performance boost.

Contact us