二个圆(A圆,B圆)半径相同,圆心坐标任意位置(在不同的坐标上),如何计算A与B之间的距离,我需要在二圆之间画线(圆边与圆边之间,不可穿圆),应该如何计算呢?

解决方案 »

  1.   

    假设:圆A圆心到圆B圆心距离为Z,圆A半径为R1,圆B半径为R2
    那么两圆边线最近距离为: Z-R1-R2=最近距离
      

  2.   

    圆心A(Xa,Ya)、B(Xb,Yb)两点
    最近距离,圆A上C(Xc,Yc),圆B上D(Xd,Yd)
    Xc = Xa+(Xb-Xa)*半径/两圆心距离
    Yc = Ya+(Yb-Ya)*半径/两圆心距离Xd = Xb-(Xb-Xa)*半径/两圆心距离
    Yd = Yb-(Yb-Ya)*半径/两圆心距离
      

  3.   

    圆1 坐标 (X1,Y1),半径R1 假设 中心距连线与圆1的交界点为(X11,Y11)
    圆2 坐标(X2,Y2),半径R2  假设 中心距连线与圆2的交界点为(X21,Y21)可以计算出,两圆中心距为A (怎么计算不用我教了吧)那么得到第一组方程
    (X11-X1)平方+(Y11-Y1)平方=R1平方
    (X11-X2)平方+(Y11-Y2)平方=A-R1这样,与圆1的交界点就出来了啊!圆2同理。前提,你要知道你的两个圆的中心点!
      

  4.   

    晕,还是不太明白呀,能不能再具体一点,如有二个圆A和BA和B的半径都是9A的圆心坐标是(20,30)B的圆心坐标是(360,500)如何求出二个圆边最近的距离(起点和终点的坐标)
      

  5.   


    (function(x1, y1){
        return function(x2, y2){
            var l = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
            return function(r1, r2){
                var d = (l - r1 - r2) >> 0;
                d>0 ? alert("最短距离为:" + d) : d==0 ? alert("两园相切!") : alert("两园相交或包含!");
            }
        }
    })
    (x1, y1) //⊙1坐标
    (x2, y2) //⊙2坐标
    (r1, r2) //⊙1和⊙2半径
      

  6.   

    楼主是用什么绘制?canvas?
    直接把demo贴出来,看看怎么加。
      

  7.   

    改错:(function(x1, y1){
        return function(x2, y2){
            var l = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
            return function(r1, r2){
                var d = (l - r1 - r2);
                d>0 ? alert("最短距离为:" + d) : d==0 ? alert("两园相切!") : alert("两园相交或包含!");
            }
        }
    })
    (x1, y1) //⊙1坐标
    (x2, y2) //⊙2坐标
    (r1, r2) //⊙1和⊙2半径
      

  8.   

        var ra=9,rb=9;
        var xa=20,ya=30;
        var xb=360,yb=500;
        
        var k=(yb-ya)/(xb-xa);
        var x1=ra/Math.sqrt(k*k+1)+xa;
        var y1=(x1-xa)/k+ya;
        
        var x2=-ra/Math.sqrt(k*k+1)+xb;
        var y2=(x2-xb)/k+yb;
        alert(k+":"+x1+":"+y1+":"+x2+":"+y2);
      

  9.   


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML xmlns:v="urn:schemas-microsoft-com:vml"><head>
    <title> new document </title>
    <style type="text/css">
    v\:* {Behavior: url(#default#VML);}
    </style>
    </head>
    <body><SCRIPT LANGUAGE="JavaScript">
    <!--//根据二个圆心得到最近边距的起点和终点
    function linePoints(xa,ya,xb,yb,r)
    {
        var ra=r;
    var rb=r;
        
        var k=(yb-ya)/(xb-xa);
        var x1=ra/Math.sqrt(k*k+1)+xa;
        var y1=(x1-xa)/k+ya;
        
        var x2=-ra/Math.sqrt(k*k+1)+xb;
        var y2=(x2-xb)/k+yb;
        return [x1,y1,x2,y2];
    }
    window.onload=function()
    {
    var r=50;  //半径
    //A圆心坐标
    var x1=120,y1=120;
    //B圆心坐标
    var x2=450,y2=450; var pointArr=linePoints(x1,y1,x2,y2,r);
    //画圆A
    document.body.innerHTML+="<v:oval filled=false style='position:absolute;left:"+(x1-r)+"px;top:"+(y1-r)+"px;width:"+(r*2)+"px;height:"+(r*2)+"px'/>";
    //画圆B
    document.body.innerHTML+="<v:oval filled=false style='position:absolute;left:"+(x2-r)+"px;top:"+(y2-r)+"px;width:"+(r*2)+"px;height:"+(r*2)+"px'/>";
    //画线
    document.body.innerHTML+="<v:line strokecolor='red' from='"+pointArr[0]+","+pointArr[1]+"' to='"+pointArr[2]+","+pointArr[3]+"'></v:line>";
    }
    //-->
    </SCRIPT>
    </body>
    </html>
    这样写为什么不对呀?
    怎么算才是正确的?
      

  10.   

    <style type="text/css">
    v\:* {Behavior: url(#default#VML);}
    body{border:0px;padding:0px;margin:0px;}</style>
      

  11.   

    随便定义两园坐标和半径调用下面的函数式:<body></body>
    <script type="text/javascript">
    (function(Fd, Fk, Fx, Fy, Fo, Fl){
        return function(x1, y1, r1){
            return function(x2, y2, r2){
                var c, k, d, Px1, Py1, Px2, Py2;
                c = x2 - x1 < 0;
                k = Fk(x1, x2, y1, y2);
                d = Fd(x1, x2, y1, y2) - r1 - r2;
                Px1 = c ? (x1 - Fx(r1, k)) : (x1 + Fx(r1, k));
                Py1 = c ? (y1 - Fy(r1, k)) : (y1 + Fy(r1, k));
                Px2 = x2 - Fx(r2, k), Py2 = y2 - Fy(r2, k);
                d > 0 ? alert("线段最短距离为:"+d+"\n起始和结束坐标分别为:\n交⊙1("+Px1+","+Py1+")\n交⊙2("+Px2+","+Py2+")")
                : d == 0 ? alert("两园相切!") : alert("两园相交或包含!");
                Fo(x1, y1, r1);
                Fo(x2, y2, r2);
                Fl([Px1>>0,Py1>>0], d>>0, k, c, Fx, Fy);
            }
        }
    })
    (
     function(x1, x2, y1, y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2))},
     function(x1, x2, y1, y2){return (y2-y1)/(x2-x1)},
     function(c, k){return c * Math.cos(Math.atan(k))},
     function(c, k){return c * Math.sin(Math.atan(k))},
     function(x, y, r){
             (function(i){
                    var o = document.createElement("div");
                    o.style.cssText = "position:absolute;width:1px;height:1px;background:#f00;overflow:hidden";
                    o.style.left = x - r * Math.cos(Math.PI*i/180);
                    o.style.top  = y - r * Math.sin(Math.PI*i/180);
                    document.body.appendChild(o);
                    o = null;
                    ++i < 360 && arguments.callee(i)
             })(0)
     },
     function(p, d, k, c, fx, fy){
             (function(i){
                    var o = document.createElement("div");
                    o.style.cssText = "position:absolute;width:1px;height:1px;background:#f00;overflow:hidden";
                    o.style.left = c ? (p[0] - fx(i, k)) : (p[0] + fx(i, k));
                    o.style.top  = c ? (p[1] - fy(i, k)) : (p[1] + fy(i, k));
                    document.body.appendChild(o);
                    o = null;
                    i++ < d && arguments.callee(i)
             })(0)
     }

    (120, 120, 50)
    (450, 450, 50)//(120, 620, 50)
    //(450, 450, 50)//(620, 620, 50)
    //(450, 450, 50)//(450, 120, 50)
    //(450, 450, 50)</script>