ProgrammingCity
ソフト公開と、それに関わるいろいろ. 転送速度が遅くてごめんなさい
サイト内検索
Microsoft Silverlight を取得

ようこそ。自作ソフトを公開しています。2008/10 一部ページのアドレスが変わりました。

RSS / お気に入り追加

profile

Link

friends

ほか

何かしてくれたサイト

便利

  • Keisan
    高精度計算サイト
top > C# > 解の公式による直線と曲線の交点計算

解の公式による直線と曲線の交点計算

\sum^N_{i=0}f_iB^n_i(t)
f_i=ax_i+by_i+c
(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<float> reslist = new List<float>();
            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;
        }