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')
댓글 수: 2
참고 항목
카테고리
Help Center 및 File Exchange에서 Lighting, Transparency, and Shading에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!