直線 a*x + b*y + c = 0 と二次ベジェ曲線(x1,y1,x2,y2,x3,y3)の交点は高々2つある。
ベジェ曲線の数式
x = x(t) = (x3-2*x2+x1)*t^2 + 2*(x2-x1)*t + x1
y = y(t) = (y3-2*y2+y1)*t^2 + 2*(y2-y1)*t + y1
を直線の数式 a*x + b*y + c = 0 に代入すると、tについての二次方程式となる。
a*((x3-2*x2+x1)*t^2+2*(x2-x1)*t+x1) + b*((y3-2*y2+y1)*t^2+2*(y2-y1)*t+y1) + c = 0
展開して整理する
(a*(x3-2*x2+x1)+b*(y3-2*y2+y1))*t^2 + 2*(a*(x2-x1)+b*(y2-y1))*t + a*x1+b*y1+c = 0
l*t^2+m*t+n = とみなすと係数l,m,nは
l = a*(x3-2*x2+x1)+b*(y3-2*y2+y1)
m = 2*(a*(x2-x1)+b*(y2-y1))
n = a*x1+b*y1+c
判定して、二次方程式の解の公式に代入する。
delta = m^2-4*l*n
- delta>0のとき、解は2つ。t = (-m±sqrt(delta))/(2*l)
- delta=0のとき、解は1つ。t = -m/(2*l)
- delta<0のとき、解はない。
得られたtが0~1ではない場合はベジェ曲線の範囲外なので解ではない。tをベジェ曲線の数式に代入し交点x,yを得る。