Plotting dots on the edges of an object uniformly

5 ビュー (過去 30 日間)
Kerem Asaf Tecirlioglu
Kerem Asaf Tecirlioglu 2017 年 1 月 1 日
コメント済み: Walter Roberson 2017 年 1 月 2 日
Hello, everyone. I wonder is it possible to distribute a specific number of dots on the edges of the acquired image. Think of a circle for instance, is it possible to distribute,like, 8 dots uniformly on the circle ? Note: As in the image i have uploaded. Red circles are the dots etc.(sorry for paint level image :3)

採用された回答

Walter Roberson
Walter Roberson 2017 年 1 月 1 日
You would probably want to set marker_dist to dist_from_start(end)/N where N is the number of dots you want around the edge.
Note that that code does not try to put the markers at corners: it is code for placing the markers at equal distances along the path, where-ever that comes out to be.
  2 件のコメント
Kerem Asaf Tecirlioglu
Kerem Asaf Tecirlioglu 2017 年 1 月 2 日
hello thanks for the answer. But there is an issue it seems quite basic but i couldn't solve it . I get an error message,
Index exceeds matrix dimensions. Error in
marker_x = x(marker_base_pos) .* (1-weight_second) + x(marker_base_pos+1) .* weight_second;
x = [0 5 10];
y = [2 4 1];
dist_from_start = cumsum( [0, sqrt((x(2:end)-x(1:end-1)).^2 + (y(2:end)-y(1:end-1)).^2)] );
a=dist_from_start(end)/5;
marker_dist=a;
marker_locs = marker_dist : marker_dist : dist_from_start(end); %replace with specific distances if desired
marker_indices = interp1( dist_from_start, 1 : length(dist_from_start), marker_locs);
marker_base_pos = floor(marker_indices);
weight_second = marker_indices - marker_base_pos;
marker_x = x(marker_base_pos) .* (1-weight_second) + x(marker_base_pos+1) .* weight_second;
marker_y = y(marker_base_pos) .* (1-weight_second) + y(marker_base_pos+1) .* weight_second;
plot(x, y);
hold on;
plot(marker_x, marker_y, 'r+');
hold off
Walter Roberson
Walter Roberson 2017 年 1 月 2 日
Hmmm, I remember fixing that at the time, but I do not remember what the fix I used then was. One fix would be
x = [0 5 10];
y = [2 4 1];
Number_of_divisions = 5;
dist_from_start = cumsum( [0, sqrt((x(2:end)-x(1:end-1)).^2 + (y(2:end)-y(1:end-1)).^2)] );
a = dist_from_start(end)/Number_of_divisions;
marker_dist = a;
marker_locs = marker_dist : marker_dist : dist_from_start(end); %replace with specific distances if desired
marker_indices = interp1( dist_from_start, 1 : length(dist_from_start), marker_locs);
marker_base_pos = floor(marker_indices);
weight_second = marker_indices - marker_base_pos;
mask = marker_base_pos < length(dist_from_start);
final_x = x(end); final_y = y(end);
final_marker = any(~mask) & (x(1) ~= final_x | y(1) ~= final_y);
marker_x = [x(1), x(marker_base_pos(mask)) .* (1-weight_second(mask)) + x(marker_base_pos(mask)+1) .* weight_second(mask), final_x(final_marker)];
marker_y = [y(1), y(marker_base_pos(mask)) .* (1-weight_second(mask)) + y(marker_base_pos(mask)+1) .* weight_second(mask), final_y(final_marker)];
plot(x, y, marker_x, marker_y, 'r+');
This code also checks to see if the curve is (exactly) closed and in that case avoids plotting the marker twice (because there is already a marker there from the plot from the beginning.)

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

その他の回答 (1 件)

Image Analyst
Image Analyst 2017 年 1 月 2 日
See interparc http://www.mathworks.com/matlabcentral/fileexchange/34874-interparc by John D'Errico. It works for arbitrarily shaped curves in 2D as well as circles.
  1 件のコメント
Walter Roberson
Walter Roberson 2017 年 1 月 2 日
Note: a difference between my code and John's is that my code treats the points as a series of line segments that the markers must sit on, whereas John's code treats the points a subsampling of a curve and interpolates the curve, a more difficult task.
My code is suitable for the case where the points define the path, such as the situation of a vehicle traveling at constant velocity along a map.

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

カテゴリ

Help Center および File ExchangeConvert Image Type についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by