MATLAB Answers

Use Period Marker to fill circles drawn using viscircles

13 views (last 30 days)
Hi, I am trying to using the period marker to fill circles drawn using viscirlces but I cannot get the sizes to line up exaclty. I want the period marker to be the exact same size as the raidus 12 circle. Below is the code I am using, and I have attached what the figure it produces. Any help would be greatly appreiciated. Thanks!
figure();
% Axis Labels
axis([-100, 100 -100 100]);
fontsize = 12;
xlabel('X', 'Fontsize', fontsize);
ylabel('Y', 'Fontsize', fontsize);
hold on
% Plot Outerboundary Circular Plane
x_c = 0;
y_c = 0;
radii_plane = 80;
radii_vein = 4;
radii_inf_range = 12;
center_plane = [x_c, y_c]; % center point of circular plane
viscircles(center_plane, radii_plane, 'color', 'b');
hold on
% VNA 5076 Start Influence Range Plot
VNA = [0,80;69.2820323027551,40.0000000000000;-69.2820323027551,40.0000000000000;0,-80;-69.2820323027551,-40.0000000000000;69.2820323027551,-40.0000000000000]; % Starting VNA
%VNA = ; % Ending VNA
SizeXY = size(VNA,1);
VNAx = VNA(:,1);
VNAy = VNA(:,2);
plot(VNAx, VNAy, '.', 'color', 'r', 'markersize', pi*6^2);
for i = 1:SizeXY
centers_nodeXY = [VNAx(i), VNAy(i)];
viscircles(centers_nodeXY, radii_inf_range, 'color', 'r');
end

  0 Comments

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 31 May 2020
viscircles draws two lines with the same coordinates but with different line widths (and potentially different colors). This is deliberate in order to draw an "edge" around the circle.
If you ask to plot more than one circle at a time, the coordinate lists are merged together separated by NaN. There is a NaN at the end of the coordinate list even if only one circle is drawn.
What this implies you can retrieve the XData and YData coordinates of the first child of the output of viscircles, get rid of the nan at the end, and fill()
h = viscircles(centers_nodeXY, radii_inf_range, 'color', 'r');
xd = h.Children(1).XData(1:end-1); %leave out the nan
yd = h.Chidren(1).YData(1:end-1);
fill(xd, yd, 'r');
Besides it being easier to get the coordinates correct, there is another reason to do this. When you plot a marker, the markersize you give is screen relative, pi*6^2 where . As you zoom, the marker will stay the same size on the screen. Whereas if you fill() the area will change appropriately.
There is another approach you should consider for filled circles: use rectangle()
recangle([centers_nodeXY-radii_inf_range, 2*radii_inf_range, 2*radii_inf_range], 'Curvature', [1 1], 'FaceColor', 'r', 'EdgeColor', 'r');
The subtraction is because rectangle needs a lower left corner and a width and height, whereas viscircles() uses center and radius.

  2 Comments

Vance Blake
Vance Blake on 1 Jun 2020
Ah Okay I tried using fill() earlier but it just traced lines between the circles and filled in the shape that was traced but now I understand why it did that. Thank you so much for this solution. Is there a situation where it would be more advantageous to use the rectangle solution or is it just personal preference?
Walter Roberson
Walter Roberson on 1 Jun 2020
When I look at the underlying data structures, it is not at all obvious which would be more efficient. It looks as if rectangle() might have some hidden facilities for shading and materials properties, but it is a mystery as to how you would activate those properly anyhow.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by