円と円の交点

Top »

半径r1 中心(x1,y1) の円と半径r2 中心(x2,y2) の円との交点。

連立方程式による解法

円の方程式は

(x-x1)^2+(y-y1)^2-r1^2 = 0 …(1)
(x-x2)^2+(y-y2)^2-r2^2 = 0 …(2)

(1)-(2):

(2 x2-2 x1)x + (2 y2 - 2 y1)y + (x1-x2)(x1+x2)+(y1-2)(y1+y2)-(r1-r2)(r1+r2) = 0 …(3)

これは円と円の2つの交点を通る直線になっているので、円と直線の交点の問題に帰着できる。(3)の係数を

a = 2(x2-x1)
b = 2(y2-y1)
c = (x1-x2)(x1+x2)+(y1-y2)(y1+y2)-(r1-r2)(r1+r2)

と計算しておくとax+by+c = 0の形になる。

解法 : 直線と円の交点

JavaScript

若干計算量削減を図ったのが下記のコード
//円と直線の交点
function cli(a,b,c,x1,y1,r){
	var l = a*a+b*b;
	var k = a*x1+b*y1+c;
	var d = l*r*r-k*k;
	if(d>0){
		var ds = Math.sqrt(d);
		var apl = a/l;
		var bpl = b/l;
		var xc = x1-apl*k;
		var yc = y1-bpl*k;
		var xd = bpl*ds;
		var yd = apl*ds;
		return [
			{x:xc-xd,y:yc+yd},
			{x:xc+xd,y:yc-yd}
		];
	}else if(d==0){
		return [{x:x1-a*k/l,y:y1-b*k/l}];
	}else{
		return [];
	}
}
//円と円の交点
function cci(x1,y1,r1,x2,y2,r2){
	var a = x1-x2;
	var b = y1-y2;
	return cli(a,b,0.5*((r1-r2)*(r1+r2)-a*(x1+x2)-b*(y1+y2)),x1,y1,r1);
}

逆三角関数による解法

円の中心間のベクトル : v→ = (x2-x1,y2-y1)

vの長さ:d = |v| = sqrt((x2-x1)^2+(y2-y1)^2)

X軸に対するvの角度 : a = atan2(y2-y1,x2-x1)

図
偏角θは余弦定理により

θ = acos((d^2+r1^2-r2^2)/(2*d*r1))

円の位置関係

if (Math.abs(r1-r2)<d && d<r1+r2) {
	//円は交わっている
	//交点は2つ
} else if ((Math.abs(r1-r2) == d || r1+r2 == d) && d != 0) {
	//円は外接か内接し一致せず
	//交点は1つ
}

交点は円周上のa±θにあるので、

P1 = (r1*cos(a+θ), r1*sin(a+θ))
P2 = (r1*cos(a-θ), r1*sin(a-θ))

inserted by FC2 system