直線と円の交点

Top »

直線ax+by+c=0と、中心(x1,y1)で半径rの円の交点。

解法

//円と直線の交点
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 [];
	}
}

媒介変数による解法

直線上の点を媒介変数tで表示すると

l = a^2 + b^2
x = b t-a c/l …(1)
y = -a t-b c/l …(2)

円の方程式

(x-x1)^2+(y-y1)^2-r1^2 = 0 …(3)

(1),(2)を(3)に代入するとtの二次方程式l t^2+m t+n=0になる。係数を

p = -a c/l-x1
q = -b c/l-y1
m = 2 b p - 2 a q
n = p^2 + q^2 - r1^2

解の公式により

t = (-m±√(m^2-4ln))/(2l) …(4)

(4)を(1),(2)に代入し交点を得る

逆三角関数による解

直線の法線ベクトル:v→ = ( a , b )

円の中心から直線の距離:|v| = -( a*x1 + b*y1 + c )/|v|

X軸に対するvの角度:a0 = atan2(b, a)

図
法線ベクトルと円の中心から交点へのベクトルのなす角:a1 = acos(l/r)

交点は、円の中心から直線への垂線方向±θの円周上にある。

inserted by FC2 system