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;
}
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;
}
- osu! 绘制线条源码 C#
- C#开发教程--线条绘制篇
- C#开发教程--线条绘制篇
- 绘制线条
- 绘制线条
- 绘制线条与条形图的python脚本实例源码
- 积累绘制的线条!
- 信手绘制线条刚体
- MFC绘制不规则线条
- iOS绘制线条
- DrictX 绘制线条
- MFC之绘制线条
- VC++之绘制线条
- 椭圆线条绘制动画
- VC++之绘制线条
- 【VC++】003绘制连续线条-扇形线条
- [DFB] 移动鼠标绘制线条
- Drawing Lines(绘制线条)
- 警惕“伪桌面虚拟化技术”来袭
- IBatis初步学习
- 那些被遗漏的Objective-C保留字
- WLib框架使用注意事项
- c语言enum
- osu! 绘制线条源码 C#
- Android-Looper类
- C++ vector详细用法
- 11gR2 Grid Infrastructure Installation prerequisites On Windows
- 【网站安全】网站通常面临的几种安全威胁及应对方式【总结版】
- 2-sat总结
- 内省和javaBean的学习
- iOS设计模式(01):观察者
- eclipse常用快捷键