我在设计图标时遇到了数学问题,我正在寻找一个JavaScript解决方案.
我拿了2个圆圈,每个圆圈的半径和位置都不同,还有一个点.我想知道包含两个圆圈的最小圆圈并沿着这一点.
红色圆圈是我想知道的圆圈
想要一个像这样的功能:
function calculate(c1x, c1y, c1r, c2x, c2y, c2r, px, py){
//Calculation
return {
x: outX,
y: outY,
r: outR
};
}
Run Code Online (Sandbox Code Playgroud)
有很多退化的情况:一个圆圈在另一个圆圈内,依此类推.
对于最一般的情况 - 大圆触及两个小圆并经过这一点 - 我们需要为三个未知数求解三个方程的系统cx, cy, R:
(px - cx)^2 + (py - cy)^2 = R^2
(cx1 - cx)^2 + (cy1 - cy)^2 = (R-r1)^2
(cx2 - cx)^2 + (cy2 - cy)^2 = (R-r2)^2
Run Code Online (Sandbox Code Playgroud)
您可以尝试用纸和笔来解决它,或者使用一些程序进行符号计算,如Maple,Mathematica,Matlab,MathCad等.
PS略微简化计算,从所有值中减去点坐标,求解系统
cx^2 + cy^2 = R^2
(cx1' - cx)^2 + (cy1' - cy)^2 = (R-r1)^2
(cx2' - cx)^2 + (cy2' - cy)^2 = (R-r2)^2
Run Code Online (Sandbox Code Playgroud)
并将px,py添加到结果中