もう少し交点です。今回は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 [];
}
}