半径r0 中心(x0,y0) の円と、半径r1 中心(x1,y1) の円との交点を、ActionScript的に求めてみます。ActionScript的と言っても、プログラムをそれで記述するだけのことですが…
まずは、中心間の距離Lから入ります。
//円座標 var p0:Point = new Point(x0,y0); var p1:Point = new Point(x1,y1); //中心間ベクトル var dv:Point = p1.subtract(p0); //距離 var L:Number = dv.length; //距離がLの場合 if( L==(r0+r1) ){ //交点1つ(接点) }else if( L<(r0+r1) && L>Math.abs(r0-r1) ){ //交点2つ }else{ //交点なし }
接点の場合は、中心間ベクトルの距離r0の地点なので、
//接点座標 dv.normalize( r0 ); dv.offset( p0.x, p0.y ); //dvのx,yが交点
交点が2つの場合、交点の一方Qからベクトルdvに垂線を下ろしたところをptとすると、ふたつの直角三角形p0-pt-Q、p1-pt-Qができます。p0-pt間の長さをtとすると、これらの三角形のQ-ptの長さは等しいので、
r0*r0 – t*t = r1*r1 – (L-t)*(L-t)
↓
r0*r0 – t*t = r1*r1 – L*L – t*t + 2*L*t
↓
t = ( r0*r0 – r1*r1 + L*L )/(2*L)
となります。
tから、p0-Qベクトルとdvベクトルとの角度aを求め、dvベクトルから、±aの座標を求めれば交点になります。
//tを求める var t:Number = 0.5*( r0*r0 - r1*r1 + L*L)/L; //p0-Qベクトルとdvベクトルの角度 var a:Number = Math.acos( t/r0 ); //dvベクトルの角度 var a0:Number = Math.atan2( dv.y, dv.x ); //交点 va q0:Point = new Point( x0 + r0*Math.cos(a0+a), y0 + r0*Math.sin(a0+a) ); va q1:Point = new Point( x0 + r0*Math.cos(a0-a), y0 + r0*Math.sin(a0-a) );
交点で円弧を描画するとこんな感じ。