5(その2):直線と曲線の交点(解の公式)

直線との交点(Bezier Clipping) では、数値計算を行っているが、3次ベジエ曲線なら3次方程式を解いたほうが正確。


(xi, yi は曲線の制御点)

直線と曲線との交点を計算するために作る式は、 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;
        }
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中