How do I fill a rectangle (or circle) in a matrix?
11 views (last 30 days)
Show older comments
Imagine the following matrix.
1 1 1 1 1 1 1 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
I know the coordinates of the 10's. they are stored in A and B. How do I use the known coordinates of 10's to fill in the 1's within the square of 10's? thanx for help.
I have simplified my problem here. I have extracted the essence of the problem above. But for those interested I'll explain the following. I want to create a filled circle inside a bigger matrix. Since I have the coordinates of the outer circle, I need a way to fill in the inside. My code:
k=zeros(300,300)+200
for theta=0:.001:7;
radius=10
[X,Y] = pol2cart(theta,radius);
A=[round(X)+radius];
B=[round(Y)+radius];
ring = sub2ind(size(K),A,B);
kleur=90;
K(A,B) = kleur;
end
0 Comments
Accepted Answer
Chad Greene
on 8 Jun 2016
Here's one way to fill the space between the top row of 10s and the bottom row of 10s:
K= [1 1 1 1 1 1 1 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1];
for cols = 1:size(K,2);
K(find(K(:,cols)==10,1,'first'):find(K(:,cols)==10,1,'last'),cols) = 10;
end
2 Comments
Chad Greene
on 8 Jun 2016
Yes, I think I can explain it.
size(K)
gives the size of K. If you don't want all the dimensions, you can specify the dimension you want. So
size(K,1)
gives the number of rows in K. Similarly,
size(K,2)
gives the number of columns. The loop says for cols = 1:size(K,2), which is "for every column in K". Here's what it does for every column in K. It says, find the first value of 10 in that column and find the last value of 10 in that column. Then fill every value from the first to the last with 10s. This might be an easier way to read it:
for cols = 1:size(K,2);
startingrow = find(K(:,cols)==10,1,'first');
endingrow = find(K(:,cols)==10,1,'last');
K(startingrow:endingrow,cols) = 10;
end
More Answers (3)
Stephen23
on 8 Jun 2016
Edited: Stephen23
on 8 Jun 2016
No toolboxes and no loops are required:
>> M = [...
1 1 1 1 1 1 1 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1];
>> X = M>1;
>> M(X | cumsum(X)==1) = 10
M =
1 1 1 1 1 1 1 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
Chad Greene
on 8 Jun 2016
If you have the Image Processing toolbox,
K= [1 1 1 1 1 1 1 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 1 1 1 10 1 1 1
1 1 10 10 10 10 10 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1];
K2 = 10*imfill(K==10,'holes')
0 Comments
Azzi Abdelmalek
on 8 Jun 2016
K=ones(30);
theta=0:.001:7;
radius=10
[X,Y] = pol2cart(theta,radius);
A=[round(X)+radius]+1;
B=[round(Y)+radius]+1;
ring = sub2ind(size(K),A',B');
kleur=90;
K(A,B) = kleur;
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!