| INDEX |

半径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) );

交点で円弧を描画するとこんな感じ。

>> source

| INDEX |