clf
%% 输入点坐标
point=[1 3 ;2 6];
%%
x1=(point(1,2)+point(1,1))/2; y1=0;
x2=(point(2,2)+point(2,1))/2; y2=0;
r1=(point(1,2)-point(1,1))/2; r2=(point(2,2)-point(2,1))/2;
d = sqrt((x1-x2)^2+(y1-y2)^2);
d1 = abs(r1-r2);
d2 = r1+r2;
if d < d1
error('大圆包含小圆,没有公切线')
end
if isequal([x1 y1 r1],[x2 y2 r2])
error('两圆重合,有无穷多条公切线')
end
t = linspace(0,2*pi,100);
x = x1+r1*cos(t);
y = y1+r1*sin(t);
wz=find(y>0);
plot(x(wz),y(wz),'r')
hold on
x = x2+r2*cos(t);
y = y2+r2*sin(t);
wz=find(y>0);
plot(x(wz),y(wz),'r')
xmin = min([x1 x2]-[r1 r2])-min([r1 r2])/5;
xmax = max([x1 x2]+[r1 r2])+min([r1 r2])/5;
ymin = min([y1 y2]-[r1 r2])-min([r1 r2])/5;
ymax = max([y1 y2]+[r1 r2])+min([r1 r2])/5;
XYR = [r1 x1 y1;r2 x2 y2];
XYR = sortrows(XYR);
r = XYR(1,1);
R = XYR(2,1);
xy = XYR(1,2:3)';
axis([-1.2*r d+R+0.2*r -R-0.2*r R+0.2*r]);
fun = @(beta)[abs(beta(2))/sqrt(1+beta(1)^2)-r;abs(beta(1)*d+beta(2))/sqrt(1+beta(1)^2)-R];
theta = atan((XYR(2,3)-XYR(1,3))/(XYR(2,2)-XYR(1,2))) + pi*(XYR(1,2) > XYR(2,2));
A = [cos(theta) -sin(theta);sin(theta) cos(theta)];
[k,jieju] = SlopeIntercept(0,r,d,R);
ab = fsolve(fun,[k jieju]);
h = refline(ab);
p=reline(h,A,xy);
k=(p(2,2)-p(2,1))/(p(1,2)-p(1,1));
jiaodu=atand((p(2,2)-p(2,1))/(p(1,2)-p(1,1)));
jieju=p(2,2)-k*p(1,2);
data=[x1 r1;x2 r2];
for i=1:size(data,1)
a=1+k^2;
b=-2*data(i,1)+2*k*jieju;
c=data(i,1)^2+jieju^2-data(i,2)^2;
jiaodian(i,1)=(-b+sqrt(b^2-4*a*c))/(2*a);
jiaodian(i,2)=k*jiaodian(i,1)+jieju;
end
pp=[0 max([x1 x2])+max([r1 r2])];
ppp=k*pp+jieju;
plot(pp(1,:),ppp(1,:))
plot(jiaodian(:,1),jiaodian(:,2),'r*')
axis equal
ymin=0;
ymax=1.6*max([r1,r2]);
xmin=0;
axis([xmin xmax ymin ymax])
clc
JD_JJ=[jiaodu jieju]
jiaodian
clearvars -except JD_JJ jiaodian
评论15