Best way of drawing multiple circles and updating their position

13 ビュー (過去 30 日間)
Raldi
Raldi 2018 年 5 月 12 日
回答済み: Walter Roberson 2018 年 5 月 12 日
What is the best way to draw a variable number of circles in a plot and update their position?
I have tried
F = rectangle('Position', [(Xpositions - radius) ...
(Ypositions - radius) radius*2 radius*2], ...
'Curvature', [1, 1], 'LineStyle', '--', ...
'EdgeColor', 'r', 'LineWidth', 3);
but since I have multiple circles I would have to create a for loop to draw each circle.
F = viscircles([Xpositions, Ypositions], ...
radii, 'LineStyle', '--', 'EdgeColor', 'r', 'LineWidth', 3);
seems to work fine and draw the circles, but it does not provide of a way to update the positions of the circles.
  2 件のコメント
KALYAN ACHARJYA
KALYAN ACHARJYA 2018 年 5 月 12 日
Are you looking for co-centric circles?
Raldi
Raldi 2018 年 5 月 12 日
No in fact they have different positions in the plot

サインインしてコメントする。

採用された回答

Ameer Hamza
Ameer Hamza 2018 年 5 月 12 日
編集済み: Ameer Hamza 2018 年 5 月 12 日
The easiest is to use rectangle() and use handle F to update the Position property
F.Position = [x y r r]; % specify a new psition
F.Position = [x_ y_ r_ r_]; % specify a new psition
everytime you update Position property, the figure will be updated with the new position.
In older MATLAB version use
set(F, 'Position', [x y r r])
In case of for loop, create an array of handles,
% inside for loop
F(i) = rectangle('Position', [(Xpositions - radius) ...
(Ypositions - radius) radius*2 radius*2], ...
'Curvature', [1, 1], 'LineStyle', '--', ...
'EdgeColor', 'r', 'LineWidth', 3);
and then set the property using F(1), F(2), ... instead of F to change a particular circle.
  3 件のコメント
Raldi
Raldi 2018 年 5 月 12 日
So there is no way of skipping the for loop? I will keep doing some tests in case I figure something out and let you know, thanks.
Ameer Hamza
Ameer Hamza 2018 年 5 月 12 日
編集済み: Ameer Hamza 2018 年 5 月 12 日
Yes, you will need to use for loops. rectangle is a separate graphics object and a call to rectangle() can only create one rectangle. So to draw multiple, a for loop is necessary.
An alternate will be arrayfun, but that is also a fancy way of writing for loop. And in this particular case will not result in any speedup because the actual time-consuming task in your case is the creation of graphics object itself.

サインインしてコメントする。

その他の回答 (2 件)

Image Analyst
Image Analyst 2018 年 5 月 12 日
The easiest way is to use viscircles() in the Image Processing Toolbox.

Walter Roberson
Walter Roberson 2018 年 5 月 12 日
You need a loop or arrayfun() to create multiple rectangle. But once you have those, you can unpdate the positions more compactly.
v = [rectangle('Position', [1 2 1 1]); rectangle('Position', [4 3 2 2])]; %create vector of them somehow
newpos = num2cell(horzcat(v.Position)*2,2); %calculate new positions
[v.Position] = deal(newpos{:}); %and... action

カテゴリ

Help Center および File ExchangeSurface and Mesh Plots についてさらに検索

タグ

製品


リリース

R2016b

Community Treasure Hunt

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

Start Hunting!

Translated by