How to create a transparent, rectangular patch with rounded corners?

조회 수: 374 (최근 30일)
It would be helpful to create a transparent, rectangular patch with rounded corners. This could be acheived with something like this:
h = rectangle('Position', [x1, y1, x2, y2], ...
'Curvature', 0.2, ...
'FaceColor', 'r', ...
'EdgeColor', 'r');
Unfortunately, rectangle properties do not include FaceAlpha and EdgeAlpha. Patch objects do, so I thought that I could get the XData and YData properties of the rectangle object from which to create a patch object. No dice; wasn't able to find these properties.
Again, the desired features are: transparency + rounded corners + face color

채택된 답변

Afiq Azaibi
Afiq Azaibi 2024년 4월 26일
이동: Adam Danz 2024년 5월 8일
Starting in R2024a, rectangle supports controling its transparency using the FaceAlpha property:
bar(magic(4));
r = rectangle(Position=[1.5,0,1,12],FaceColor='r',FaceAlpha=.3,Curvature=[.4 .4]);

추가 답변 (5개)

Jon
Jon 2019년 9월 18일
You can use the rectangle function if you give the color as a triple instead of a string and add a fourth argument which specifices the alpha. Here, the alpha is 0.7.
h = rectangle('Position', [x1, y1, x2, y2], ...
'Curvature', 0.2, ...
'FaceColor', [1, 0, 0, 0.7], ...
'EdgeColor', [1, 0, 0, 0.7]);
  댓글 수: 3
Carlos Herrera
Carlos Herrera 2023년 2월 24일
This worked great. Thank you!
jon erickson
jon erickson 2024년 5월 15일
4th color argument -brilliant solution for those of us with older versions. Thank you!

댓글을 달려면 로그인하십시오.


Jan
Jan 2019년 1월 16일
편집: Jan 2019년 1월 16일
A rectangle object does not have XData and YData properties and it does not allow to set the transparency by Alpha blending. This means clearly, that you cannot use rectangle to solve your problem, although it looks almost like you want it.
All you need is to define the XData and YData according to your inputs. The equations for the rounded corners can be obtained by some simple equations. I'm not sure, how the "Curvature" of rectangle objects is defined. It should be easy to find the required circles, but it is a tedius work.
  댓글 수: 1
Chris L'Esperance
Chris L'Esperance 2019년 2월 17일
Thanks! Getting confirmation that there wasn't an obvious solution was helpful.

댓글을 달려면 로그인하십시오.


Chris L'Esperance
Chris L'Esperance 2019년 2월 17일
This seems like a relatively efficient way to build the polygon which can be plotted as a line or patch. If this is unneccesarily complex, please feel free to point out.
figure;
axis equal
hold on
X = [300, 600];
Y = [100, 200];
radius = 0.05;
edge_color = 'k';
% compute the dx
dx = X(1,2) - X(1,1);
% compute the dy
dy = Y(1,2) - Y(1,1);
% reduce X and Y by radius
X_reduced = [X(1,1) + (radius .* dx), ...
X(1,2) - (radius .* dx)];
Y_reduced = [Y(1,1) + (radius .* dx), ...
Y(1,2) - (radius .* dx)];
d_theta = pi/50;
theta = 0:d_theta:pi/2;
% initialize the complete series
x_rect = [];
y_rect = [];
% for each corner solve the circle equation
for vertex=1:4
% start at top right vertex, the arc that we want to first will run
% from 0 to pi/2 radians
% we cycle through the vertices in a counter-clockwise sense so that
% as we increment theta by pi/2, we arrive at the arc corresponding
% to the rounded corner
if (vertex == 1)
% top right
x = max(X_reduced); y = max(Y_reduced);
elseif (vertex == 2)
% top left
x = min(X_reduced); y = max(Y_reduced);
elseif (vertex == 3)
% bottom left
x = min(X_reduced); y = min(Y_reduced);
elseif (vertex == 4)
% bottom right
x = max(X_reduced); y = min(Y_reduced);
end
% plot circle arc
xunit = (radius .* dx) * cos(theta) + x;
yunit = (radius .* dx) * sin(theta) + y;
% add current sector to series
x_rect = cat(2, x_rect, xunit);
y_rect = cat(2, y_rect, yunit);
% increment theta
theta = theta + pi/2;
end
% close the polygon
x_rect = cat(2, x_rect, x_rect(1,1));
y_rect = cat(2, y_rect, y_rect(1,1));
plot(x_rect, y_rect, ...
'Color', edge_color);

Walter Roberson
Walter Roberson 2019년 2월 17일

H W
H W 2023년 6월 5일
IN YOU FIGURE, you select the input rectange, open Attribute checker, set the facealpha. ok!

카테고리

Help CenterFile Exchange에서 Polygons에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by