直線との交点(Bezier Clipping) では、数値計算を行っているが、3次ベジエ曲線なら3次方程式を解いたほうが正確。
直線と曲線との交点を計算するために作る式は、 3次ベジエ曲線の場合、3次の式となる。
(-f0 + f1 – f2 + f3)t3 + (3f0 – 2f1 + f2)t2 +(-3f0 + f1)t + f0 = 0
この式を、 3次方程式を解く で作成した関数を呼んで解く。 その中で、実数解で 0<=t<=1 のものが、交点となる。
//方程式版 public float[] intersection_line(float a, float b, float c) { double f0, f1, f2, f3; f0 = a * pts[0].X + b * pts[0].Y + c; f1 = 3 * (a * pts[1].X + b * pts[1].Y + c); f2 = 3 * (a * pts[2].X + b * pts[2].Y + c); f3 = a * pts[3].X + b * pts[3].Y + c; Complex[] complex = MyMath.cubiceq( -f0 + f1 - f2 + f3, 3 * f0 - 2 * f1 + f2, -3 * f0 + f1, f0); List reslist = new List(); for (int cnt = 0; cnt < 3; cnt++) { if (complex[cnt].real >= 0 && complex[cnt].real <= 1 && Math.Abs(complex[cnt].imag) < 0.0001) { reslist.Add((float)complex[cnt].real); } } float[] result; result = new float[reslist.Count]; for (int cnt = 0; cnt < reslist.Count; cnt++) { result[cnt] = reslist[cnt]; } return result; }