matlab练习程序(多圆交点)

最近总是对计算几何方面的程序比较感兴趣。

多圆求交点,要先对圆两两求交点。

有交点的圆分为相切圆和相交圆。

相切圆求法:

  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

多圆求交点我只能两两比较了,不知道有没有什么快速的方法。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序是两相交求交点,输入信息为两心坐标和半径值。如有更好的算法,欢迎交流!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值