osu! 绘制线条源码 C#

来源:互联网 发布:椎管螺纹编程实例 编辑:程序博客网 时间:2024/05/05 08:50
internal const int SLIDER_DETAIL_LEVEL = 50;


switch (CurveType)
{
    case CurveTypes.Catmull:
        for (int j = 0; j < sliderCurvePoints.Count - 1; j++)
        {
            Vector2 v1 = (j - 1 >= 0 ? sliderCurvePoints[j - 1] : sliderCurvePoints[j]);
            Vector2 v2 = sliderCurvePoints[j];
            Vector2 v3 = (j + 1 < sliderCurvePoints.Count
                              ? sliderCurvePoints[j + 1]
                              : v2 + (v2 - v1));
            Vector2 v4 = (j + 2 < sliderCurvePoints.Count
                              ? sliderCurvePoints[j + 2]
                              : v3 + (v3 - v2));


            for (int k = 0; k < General.SLIDER_DETAIL_LEVEL; k++)
                path.Add(
                    new Line(Vector2.CatmullRom(v1, v2, v3, v4, (float) k/General.SLIDER_DETAIL_LEVEL),
                             Vector2.CatmullRom(v1, v2, v3, v4,
                                                (float) (k + 1)/General.SLIDER_DETAIL_LEVEL)));
        }
        break;
    case CurveTypes.Bezier:
        Vector2 lastPoint = sliderCurvePoints[0];
        int lastIndex = 0;
        for (int i = 0; i < sliderCurvePoints.Count; i++)
            if ((i > 0 && sliderCurvePoints[i] == sliderCurvePoints[i - 1]) || i == sliderCurvePoints.Count - 1)
            {
                List<Vector2> thisLength = sliderCurvePoints.GetRange(lastIndex, i - lastIndex + 1);


                List<Vector2> points = MathHelper.CreateBezier(thisLength);
                for (int j = 1; j < points.Count; j++)
                    path.Add(new Line(points[j - 1], points[j]));
                lastIndex = i;
            }
        break;
    case CurveTypes.Linear:
        for (int i = 1; i < sliderCurvePoints.Count; i++)
        {
            Line l = new Line(sliderCurvePoints[i - 1], sliderCurvePoints[i]);
            int segments = (int) (l.rho/10);
            for (int j = 0; j < segments; j++)
                path.Add(
                    new Line(l.p1 + (l.p2 - l.p1)*((float) j/segments),
                             l.p1 + (l.p2 - l.p1)*((float) (j + 1)/segments)));
        }
        break;
}


public static Vector2 CatmullRom(Vector2 value1, Vector2 value2, Vector2 value3, Vector2 value4, float amount)
{
    Vector2 vector;
    float num = amount * amount;
    float num2 = amount * num;
    vector.X = 0.5f * ((((2f * value2.X) + ((-value1.X + value3.X) * amount)) + (((((2f * value1.X) - (5f * value2.X)) + (4f * value3.X)) - value4.X) * num)) + ((((-value1.X + (3f * value2.X)) - (3f * value3.X)) + value4.X) * num2));
    vector.Y = 0.5f * ((((2f * value2.Y) + ((-value1.Y + value3.Y) * amount)) + (((((2f * value1.Y) - (5f * value2.Y)) + (4f * value3.Y)) - value4.Y) * num)) + ((((-value1.Y + (3f * value2.Y)) - (3f * value3.Y)) + value4.Y) * num2));
    return vector;
}