最近总是对计算几何方面的程序比较感兴趣。
多圆求交点,要先对圆两两求交点。
有交点的圆分为相切圆和相交圆。
相切圆求法:
1.根据两圆心求直线
2.求公共弦直线方程
3.求两直线交点即两圆切点。
相交圆求法:
1.求公共弦方程直线。
2.公共弦直线方程和其中一个圆方程联立求解即可。
公共弦直线方程就是两圆方程的差。
结果如下:
matlab代码如下:
main.m:
clear all;close all;clc;
n=20;
cic=rand(n,3); %(x,y,r)
hold on;
for i=1:n-1
for j=i+1:n
cic1=cic(i,:);
cic2=cic(j,:);
p=circleCross(cic1,cic2);
if ~isempty(p)
plot(p(:,1),p(:,2),'.');
end
end
end
for i=1:n
theta=0:0.001:2*pi;
x=cic(i,1)+cic(i,3)*cos(theta);
y=cic(i,2)+cic(i,3)*sin(theta);
plot(x,y,'-');
end
axis equal
circleCross.m:
function p=circleCross(cic1,cic2)
x0=cic1(1);
y0=cic1(2);
r0=cic1(3);
x1=cic2(1);
y1=cic2(2);
r1=cic2(3);
d=sqrt((x0-x1)^2+(y0-y1)^2); %两圆心距离
k1=(y0-y1)/(x0-x1); %连接两圆心直线
b1=y1-k1*x1;
k2=-1/k1; %公共弦方程直线
b2=(r0^2-r1^2-x0^2+x1^2-y0^2+y1^2)/(2*(y1-y0));
p=[];
if d==abs(r1-r0) || d==r1+r0 %相切时的交点
xx=-(b1-b2)/(k1-k2);
yy=-(-b2*k1+b1*k2)/(k1-k2);
p=[xx yy];
elseif abs(r1-r0)<d && d<r1+r0 %相交时的交点
%公共弦方程与其中一个圆的交点
xx1=(-b2* k2 + x1 + k2 *y1 - sqrt(-b2^2 + r1^2 + k2^2 *r1^2 - 2 *b2* k2* x1 - k2^2* x1^2 + 2*b2*y1 + 2*k2*x1*y1 - y1^2))/(1 + k2^2);
yy1=k2*xx1+b2;
xx2=(-b2* k2 + x1 + k2 *y1 + sqrt(-b2^2 + r1^2 + k2^2 *r1^2 - 2 *b2* k2* x1 - k2^2* x1^2 + 2*b2*y1 + 2*k2*x1*y1 - y1^2))/(1 + k2^2);
yy2=k2*xx2+b2;
p=[xx1 yy1;xx2 yy2];
end
end
多圆求交点我只能两两比较了,不知道有没有什么快速的方法。