Circle packed with Circles
이전 댓글 표시
Dear all,
I am wondering how to generate a circle filled with smaller circles? Do I have to calculate all the circle centers or is there a general way how do this numerically? I have the Image Processing Toolbox.
Kind regards,
Carlas Smith
댓글 수: 1
Chandra Kurniawan
2011년 12월 23일
You don't need image processing toolbox.
채택된 답변
추가 답변 (4개)
Chandra Kurniawan
2011년 12월 23일
2 개 추천
Hello,
Did you meant??
With diameter = 3

Or with diameter = 5

Or with diameter = 7

Or any diameter

댓글 수: 7
carlas
2011년 12월 24일
carlas
2011년 12월 24일
carlas
2011년 12월 24일
Pooja Kolati
2016년 2월 18일
편집: Pooja Kolati
2016년 2월 18일
Hi chandra! can you please help me out with the code with which we can pack odd number of circles in the outermost ring of the circle or even number of circles in the entire circle. It is very necessary for me as I am working on it for my main project.
Image Analyst
2016년 2월 18일
Looks like he's not going to. You could do it yourself by adapting the code from the FAQ, or by using the viscircles() function.
Pooja Kolati
2016년 2월 21일
편집: Pooja Kolati
2016년 2월 21일
thank you! But it is still not helping me for packing even number of circles.
Image Analyst
2016년 2월 21일
Did you write any code using the FAQ at all?
You forgot to post it.
Junaid
2011년 12월 23일
Dear Carlas,
The easy way is to use this link. http://www.mathworks.com/matlabcentral/fileexchange/2876-draw-a-circle/content/circle.m
save circle.m in your working directory. Then give input. In example below I will draw three circles.
circle([50,50],15,1000,':');hold on;
circle([50,50],10,1000,':');
circle([50,50],5,1000,':');
If I keep the center same and just change the radius of the circle, we can easily make circle inside the circles.
I hope I understand you well. let me know about this if worked.
댓글 수: 3
carlas
2011년 12월 23일
carlas
2011년 12월 23일
Image Analyst
2011년 12월 23일
Interesting. Looks like the math might be tricky since some cases weren't solved (or "proved optimal") until the late 1960's. Have you tried to get the code from the Wolfram site? Would you be interested in a Monte Carlo solution to get a random configuration?
Image Analyst
2011년 12월 23일
편집: Image Analyst
2020년 1월 17일
Carlas: Someone asked this a year or two ago in the newsgroup. Here is the demo I made for him. It should be a simple matter to check for overlap before plopping down the next circle.
% M-file to place multiple small circles inside a big circle.
% Clean up
close all;
clc;
% Initialize some parameters.
numberOfSmallCircles = 25; % Number of small circles
smallCircleOutsideValue = 0.2;
smallCircleInsideValue = 0.8;
smallCircleRadius = 25; % small circle radius
bigImageWidth = 500;
bigImageHeight = 500; % square area 0f 500*500
bigCircleRadius = 250; % big circle radius
% Initialize an image to hold one single big circle.
bigCircleImage = zeros(bigImageHeight, bigImageWidth);
[x, y] = meshgrid(1:bigImageWidth, 1:bigImageHeight);
bigCircleImage((x - bigImageWidth/2).^2 + (y - bigImageHeight/2).^2 <= bigCircleRadius.^2) = 1;
% Display it in the upper left plot.
subplot(3,2,1);
imshow(bigCircleImage, []);
title('Big Circle Mask');
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
% Initialize an image to hold one single small circle.
smallCircleImage = zeros(2*smallCircleRadius, 2*smallCircleRadius);
[x, y] = meshgrid(1:smallCircleRadius*2, 1:smallCircleRadius*2);
singleCircleImage = zeros(2*smallCircleRadius, 2*smallCircleRadius);
singleCircleImage((x - smallCircleRadius).^2 + (y - smallCircleRadius).^2 <= smallCircleRadius.^2) = smallCircleInsideValue;
% Display it in the upper right plot.
subplot(3,2,2);
imshow(singleCircleImage, []);
title('Single Small Circle (scaled to fit)');
singleWidth = size(singleCircleImage, 2);
singleHeight = size(singleCircleImage, 1);
% Get random coordinates in the big image where
% we will place the upper left corner of the small circle.
widthThatWillFit = bigImageWidth - 2 * smallCircleRadius;
heightThatWillFit = bigImageHeight - 2 * smallCircleRadius;
smallUpperLeftX = widthThatWillFit * rand(numberOfSmallCircles, 1);
smallUpperLeftY = heightThatWillFit * rand(numberOfSmallCircles, 1);
% Initialize an output image to hold many small overlapping circles.
manySmallCircles = zeros(bigImageHeight, bigImageWidth);
% Place the small circles one by one.
for k = 1 : numberOfSmallCircles
% Find the square in the big image where we're going to add a small circle.
x1 = int16(smallUpperLeftX(k));
y1 = int16(smallUpperLeftY(k));
x2 = int16(x1 + singleWidth - 1);
y2 = int16(y1 + singleHeight - 1);
% Add in one small circle to the existing big image.
manySmallCircles(y1:y2, x1:x2) = manySmallCircles(y1:y2, x1:x2) + singleCircleImage;
end
% Make outside the circles the outside color.
manySmallCircles(manySmallCircles == 0) = smallCircleOutsideValue;
% Display it in the lower left plot.
subplot(3,2,3);
imshow(manySmallCircles);
title('Many Small Overlapping Circles');
% Multiply the big circle mask by the many small circles image to clip
% those small circles that lie outside the big circle.
maskedByBigCircle = bigCircleImage .* manySmallCircles;
% Display it in the lower right plot.
subplot(3,2,4);
imshow(maskedByBigCircle);
title('Many Small Circles Masked by Big Circle');
% Take the histogram and display it in the bottom row.
subplot(3,2,5);
hist(maskedByBigCircle(:));
grid on;
title('Histogram of image', 'FontSize', fontSize);

MOHAMMED ALMUBAYEDH
2017년 1월 18일
0 개 추천
is there a way to input the small circle diameter then input the large circle diameter and then get the output of how many circles I can fit
댓글 수: 1
Image Analyst
2017년 1월 18일
As a partial answer, you can use patch() or fill() to place colored rectangles (with some opacity) over the image.
카테고리
도움말 센터 및 File Exchange에서 Image Arithmetic에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!