| INDEX |

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

>> source

| INDEX |