Matlab 版 (精华区)
发信人: zjliu (秋天的萝卜), 信区: Matlab
标 题: Re: 求三个圆的外切圆算法,谢谢!!!
发信站: 哈工大紫丁香 (Sun Nov 14 14:44:06 2004), 转信
我用数值方法(二分法)写了个程序,可能有不足的地方,希望你调试后指出
另外这个程序还可以计算三个圆分离的情况:比如
[x,y,r]=ivanhit2(-2,-2,1,6,2,0,1,1,1);
function [x,y,r]=ivanhit2(x1,y1,x2,y2,x3,y3,r1,r2,r3);
% 三个圆的外切圆算法
% 已知两两外切的三个圆(圆心和半径已知),求这三个圆的外切圆
% (即求圆心坐标和半径)
% Examples:
% [x,y,r]=ivanhit(2,0,0,6,-2,0,2,sqrt(6^2+2^2)-2,2);
% See also inline
% close all
FF=inline('sqrt((x-x1)^2+(y-y1)^2)-r1','x','y','x1','y1','r1');
x0=mean([x1,x3]);
y0=mean([y1,y3]);
xp=x2-x0;
yp=y2-y0;
A=atan((y3-y1)/(x3-x1));
K=[cos(A),sin(A);-sin(A),cos(A)]*[xp;yp];
x22=K(1);
y22=K(2);
c=sqrt((x1-x3)^2+(y1-y3)^2)/2;
a=(r1-r3)/2;
b=sqrt(c^2-a^2);
xf=inline('a*sqrt(y^2/b^2+1)','y','a','b');
ymin=0;
ymax=y22;
y=mean([ymin,ymax]);
x=xf(y,a,b);
x11=-c;
y11=0;
tf1=FF(x,y,x11,y11,r1);
tf2=FF(x,y,x22,y22,r2);
while abs(tf1-tf2)>10^(-2); % 10^(-2)是数值解的精度,你可以再改变
if tf1>tf2;
ymax=y;
else
ymin=y;
end
y=mean([ymin,ymax]);
x=xf(y,a,b);
tf1=FF(x,y,x11,y11,r1);
tf2=FF(x,y,x22,y22,r2);
end
K=[cos(-A),sin(-A);-sin(-A),cos(-A)]*[x;y];
x=K(1);
y=K(2);
x=x+x0;
y=y+y0;
r=tf1;
t=0:.1:2.1*pi;
figure;
plot(x1+r1*cos(t),y1+r1*sin(t));
hold on
plot(x2+r2*cos(t),y2+r2*sin(t));
plot(x3+r3*cos(t),y3+r3*sin(t));
plot(x+r*cos(t),y+r*sin(t),'r');
axis equal
【 在 ivanhit (ivan) 的大作中提到: 】
: 已知两两外切的三个圆(圆心和半径已知),求这三个圆的外切圆(即求圆心坐标和半径),不
: 知有什么好方法?本人采用matlab的符号计算求解,但因是二次方程,每个未知数都有两个
: 解
: ...................
--
╔═══════════════════╗
║★★★★★友谊第一 比赛第二★★★★★║
╚═══════════════════╝
※ 修改:·zjliu 于 Nov 14 18:38:06 修改本文·[FROM: 202.118.229.*]
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.*]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.692毫秒