• 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

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

  • 相关阅读:
    进程间通讯----消息队列和共享内存方式的实现
    初探 Yii2 的测试模式 index-test.php
    nginx缓存功能的设置
    php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式
    workerman如何写mysql连接池
    Varnish 一般是放在 Nginx 前面还是后面的?
    关于PATH_INFO
    Java8 Lambda表达式
    synchronized的一些记录
    类和实例
  • 原文地址:https://www.cnblogs.com/tiandsp/p/4017845.html
Copyright © 2020-2023  润新知