直線との交点(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;
}


