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);
<!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> 这样写为什么不对呀? 怎么算才是正确的?
那么两圆边线最近距离为: Z-R1-R2=最近距离
最近距离,圆A上C(Xc,Yc),圆B上D(Xd,Yd)
Xc = Xa+(Xb-Xa)*半径/两圆心距离
Yc = Ya+(Yb-Ya)*半径/两圆心距离Xd = Xb-(Xb-Xa)*半径/两圆心距离
Yd = Yb-(Yb-Ya)*半径/两圆心距离
圆2 坐标(X2,Y2),半径R2 假设 中心距连线与圆2的交界点为(X21,Y21)可以计算出,两圆中心距为A (怎么计算不用我教了吧)那么得到第一组方程
(X11-X1)平方+(Y11-Y1)平方=R1平方
(X11-X2)平方+(Y11-Y2)平方=A-R1这样,与圆1的交界点就出来了啊!圆2同理。前提,你要知道你的两个圆的中心点!
(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半径
直接把demo贴出来,看看怎么加。
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半径
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);
<!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>
这样写为什么不对呀?
怎么算才是正确的?
v\:* {Behavior: url(#default#VML);}
body{border:0px;padding:0px;margin:0px;}</style>
<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>