もう少し交点です。今回は2次のベジェ曲線と直線の交点です。
とはいえ、この交点は、直線の式に、ベジェの式を代入すれば素直に求めることができます。
始点p0、終点p1、コントロール点cpの2次ベジェ曲線のx,yは、
//t = 0 to 1 x → p0.x*(1-t)*(1-t) + 2*cp.x*t*(1-t) + p1.x*t*t y → p0.y*(1-t)*(1-t) + 2*cp.y*t*(1-t) + p1.y*t*t
ですが、これを直線「ax+by+c=0」に代入すると、tについての2次式になります。
ax+by+c=0 ↓ (b*p1.y+a*p1.x+b*p0.y+a*p0.x-2*b*cp.y-2*a*cp.x)*t*t + (-2*b*p0.y-2*a*p0.x+2*b*cp.y+2*a*cp.x)*t + b*p0.y+a*p0.x+c = 0
この方程式を解いて、tが0~1であれば交点があることになります。
関数で書くと、こんな感じです。
/** * ベジェ曲線と直線の交点 * ベジェ曲線:始点p0,終点p1,コントロール点cp * 直線:ax+by+c=0 * * @return ベジェ曲線のt値 */ function intersection( p0:Point, p1:Point, cp:Point, a:Number, b:Number, c:Number ):Array{ var m:Number = b*p1.y + b*p0.y + a*p1.x + a*p0.x - 2*b*cp.y - 2*a*cp.x; var n:Number = -2*b*p0.y - 2*a*p0.x + 2*b*cp.y + 2*a*cp.x; var l:Number = b*p0.y + a*p0.x + c; //判別式 var D:Number = n*n - 4*m*l; if( D>0 ){ D = Math.sqrt(D); var t0:Number = 0.5*(-n+D)/m; var t1:Number = 0.5*(-n-D)/m; var result:Array = new Array(); //解が0~1にあれば交点 if( t0>=0 && t0<=1 ){ result.push( t0 ); } if( t1>=0 && t1<=1 ){ result.push( t1 ); } return result; }else if(D==0){ var t2:Number = 0.5*-n/m; if( t2>=0 && t2<=1 ){ return [ t2 ]; }else{ return [] } }else{ //交点なし return []; } }