_aと_bを結ぶ線分と_centerを中心とする半径_rの円との交点を求める
int CircleAndLine( point _a, point _b, point _center, value _r, point & _out1, point & _out2 )
{
value a,b,c;
{
Line l = CreateLine( _a - _center ,_b - _center );
a = l.A; b = l.B; c = l.C;
}
value ab = a * a + b * b;
value ac = a * c;
value bc = b * c;
value r = _r *_r * ab - c * c;
if( r < 0 ) return 0;
if( r == 0 ) // l*-ab < r < l*ab
{
value x = - ac / ab;
value y = - bc / ab;
_out1 = _out2 = point( x, y ) + _center;
return OnToLine( _out1, _a, _b ) ? 1 : 0;
}
r = sqrt(r);
value x1 = ( - ac - b * r ) / ab;
value y1 = ( - bc + a * r ) / ab;
value x2 = ( - ac + b * r ) / ab;
value y2 = ( - bc - a * r ) / ab;
_out1 = point(x1,y1) + _center;
_out2 = point(x2,y2) + _center;
int flg= 0;
flg += OnToLine( _out1, _a, _b ) ? 1 : 0;
flg += OnToLine( _out2, _a, _b ) ? 2 : 0;
return flg;
}
