mmd 和 cz 的智慧结晶。某次比赛的时候写的。


/*
1:两个圆相离
2:两个圆外切
3:两个圆内切
4:两个圆相交
5:如果两个圆相含(包括两圆坐标和半径都相同)
*/


int circle_intersect(circle_t A, circle_t B, point_t &ia, point_t &ib)
{
    
if (A.x == B.x && A.y == B.y)
        
return 5;
    
double dd = dist (A.x, A.y, B.x, B.y);
    
if (A.r + B.r + EP < dd)
        
return 1;
    
    
double k, a, b, d, aa, bb, cc, c, drt;
    k 
= A.r;
    a 
= B.x - A.x;
    b 
= B.y - A.y;
    c 
= B.r;
    d 
= sqr(c) - sqr(k) - sqr(a) - sqr(b);
    
    aa 
= 4 * sqr(a) + 4 * sqr(b);
    bb 
= 4 * b * d;
    cc 
= sqr(d) - 4 * sqr(a) * sqr(k);
    
    drt 
= sqr(bb) - 4 * aa * cc;
    
if (drt < 0)
        
return 5;
    drt 
= sqrt (drt);
    ia.y 
= (-bb + drt) / 2 / aa;
    ib.y 
= (-bb - drt) / 2 / aa;
    
if (abs (a) < EP)
    
{
        ia.x 
= sqrt (sqr (k) - sqr (ia.y));
        ib.x 
= -ia.x;
    }

    
else
    
{
        ia.x 
= (2 * b * ia.y + d) / -2 / a;
        ib.x 
= (2 * b * ib.y + d) / -2 / a;
    }

    ia.x 
+= A.x;
    ia.y 
+= A.y;
    ib.x 
+= A.x;
    ib.y 
+= A.y;
    
if (abs (ia.y - ib.y) < EP)
    
{
        
if (abs (A.r + B.r - dd) < EP)
            
return 2;
        
if (abs (dd - (max (A.r, B.r) - min (A.r, B.r))) < EP)
            
return 3;
    }

    
return 4;
}
posted on 2007-09-20 18:34 Felicia 阅读(5822) 评论(7)  编辑 收藏 引用 所属分类: 计算几何
Comments
  • # re: [计算几何]两圆求交点
    Jie
    Posted @ 2007-12-03 18:47
    弱问EP是什么?  回复  更多评论   
  • # re: [计算几何]两圆求交点
    coder
    Posted @ 2008-04-22 11:46
    sqr,sqrt,乘法,等计算很慢的。能不能优化一下?  回复  更多评论   
  • # re: [计算几何]两圆求交点
    hehe
    Posted @ 2008-05-12 19:09
    EP是什么呢  回复  更多评论   
  • # re: [计算几何]两圆求交点
    lala
    Posted @ 2009-02-06 18:05
    我小白,请问sqr是什么?  回复  更多评论   
  • # re: [计算几何]两圆求交点[未登录]
    Felicia
    Posted @ 2009-02-09 07:45
    平方  回复  更多评论   
  • # re: [计算几何]两圆求交点
    感谢
    Posted @ 2009-06-06 00:18
    那个方程真的难解,多谢你的代码  回复  更多评论   
  • # re: [计算几何]两圆求交点[未登录]
    路人甲
    Posted @ 2010-08-27 16:01
    @感谢
    感觉写得有些复杂。令L为两圆心间距,则可以构造三边分别为R1 R2 L的三角形。进而解方程求得十字架各部分的长度(包括割线的长度),再通过向量运算就得到两个交点了。  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理