How to generate and plot multiple semicircle with fixed endpoints but different radius
4 次查看(过去 30 天)
显示 更早的评论
Hi,
I want to generate a plot with multiple semicircles with fixed endpoints but with different radius...below is the code that I'm using and a figure with the ouput...I want to make the three semicircules to oscillate outwards (like the yellow lines) and inwards (like the red lines) with specific rate...i.e. starting from the first semicircle and moves inwardly to the last one at specific rate (I want to synchronize this motion with some MRI images later on)...I'm still missing the straight line even if I use very high radius...any help would be really appreciated!!!
clc; clear; close all; hold on
%coordinates for semicircle 1
Aa = [11.9; -17.091]; %coordinates of point A
Ba = [13.8; -13.8]; % Same with point B
%coordinates for semicircle 2
Ab = [13.8; -13.8]; %coordinates of point A
Bb = [10; -13.8];
%coordinates for semicircle 3
Ac = [10; -13.8]; %coordinates of point A
Bc = [11.9; -17.091];
Coorda=[Aa Ba];
Coordb=[Ab Bb];
Coordc=[Ac Bc];
Coord=[Coorda,Coordb,Coordc];
F=cell(3,1);
for j=1:3
if j==1
F{j,1}=Coord(:,j:j+1);
elseif j==2
F{j,1}=Coord(:,j+1:j+2);
else
F{j,1}=Coord(:,j+2:j+3);
end
end
for i=1:3
n=0;
for h=1:10
d = norm(F{i,1}(:,1)-F{i,1}(:,2));
R = d/2+n; % Choose R radius >= d/2
C = (F{i,1}(:,2)+F{i,1}(:,1))/2+sqrt(R^2-d^2/4)/d*[0,-1;1,0]*(F{i,1}(:,2)-F{i,1}(:,1)); % Center of circle
a = atan2(F{i,1}(2,1)-C(2),F{i,1}(1,1)-C(1));
b = atan2(F{i,1}(2,2)-C(2),F{i,1}(1,2)-C(1));
b = mod(b-a,2*pi)+a; % Ensure that arc moves counterclockwise
t = linspace(a,b,1000);
x = C(1)+R*cos(t);
y = C(2)+R*sin(t);
plot(x,y,'y-',C(1),C(2),'w*')
axis equal
n=n+0.15;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%for inwards movement
hold on
%coordinates for semicircle 1
Aa = [13.8; -13.8]; %coordinates of point A
Ba = [11.9; -17.091]; % Same with point B
%coordinates for semicircle 2
Ab = [10; -13.8]; %coordinates of point A
Bb = [13.8; -13.8];
%coordinates for semicircle 3
Ac = [11.9; -17.091]; %coordinates of point A
Bc = [10; -13.8];
Coorda=[Aa Ba];
Coordb=[Ab Bb];
Coordc=[Ac Bc];
Coord=[Coorda,Coordb,Coordc];
F=cell(3,1);
for j=1:3
if j==1
F{j,1}=Coord(:,j:j+1);
elseif j==2
F{j,1}=Coord(:,j+1:j+2);
else
F{j,1}=Coord(:,j+2:j+3);
end
end
for i=1:3
n=1.5;
for h=1:10
d = norm(F{i,1}(:,1)-F{i,1}(:,2));
R = d/2+n; % Choose R radius >= d/2
C = (F{i,1}(:,2)+F{i,1}(:,1))/2+sqrt(R^2-d^2/4)/d*[0,-1;1,0]*(F{i,1}(:,2)-F{i,1}(:,1)); % Center of circle
a = atan2(F{i,1}(2,1)-C(2),F{i,1}(1,1)-C(1));
b = atan2(F{i,1}(2,2)-C(2),F{i,1}(1,2)-C(1));
b = mod(b-a,2*pi)+a; % Ensure that arc moves counterclockwise
t = linspace(a,b,1000);
x = C(1)+R*cos(t);
y = C(2)+R*sin(t);
plot(x,y,'r-',C(1),C(2),'w*')
axis equal
n=n+2;
end
end
![Plot-semicircles.jpg](https://www.mathworks.com/matlabcentral/answers/uploaded_files/248051/image.jpeg)
0 个评论
回答(1 个)
Hank
2019-11-13
Thats a neat looking graphic. I don't really understand what its for though. Why don't you just manually draw in the straight line if you need it, as a line and not a circle.
line(Coorda(1,:),Coorda(2,:),'color','k')
line(Coordb(1,:),Coordb(2,:),'color','k')
line(Coordc(1,:),Coordc(2,:),'color','k')
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!