summaryrefslogtreecommitdiff
path: root/ch.sycoforge.Decal.Demo/BezierUtil.cs
blob: 4784ce76209d1c098235da65cf660df544043aab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System.Collections.Generic;
using UnityEngine;

namespace ch.sycoforge.Decal.Demo;

public static class BezierUtil
{
	public static List<Vector3> InterpolatePath(List<Vector3> path, int segments, float radius, float angleThreshold)
	{
		if (path.Count >= 3)
		{
			List<Vector3> list = new List<Vector3>();
			int num = path.Count - 1;
			list.Add(path[0]);
			int num2 = 0;
			for (int i = 2; i < path.Count; i++)
			{
				Vector3 vector = path[i - 2];
				Vector3 vector2 = path[i - 1];
				Vector3 vector3 = path[i];
				Vector3 vector4 = vector2 - vector;
				Vector3 vector5 = vector3 - vector2;
				float num3 = Mathf.Abs(Vector3.Angle(vector4, vector5));
				if (!(num3 <= angleThreshold))
				{
					float magnitude = vector4.magnitude;
					float magnitude2 = vector5.magnitude;
					vector4.Normalize();
					vector5.Normalize();
					magnitude = Mathf.Min(magnitude * 0.5f, radius);
					magnitude2 = Mathf.Min(magnitude2 * 0.5f, radius);
					Vector3 vector6 = vector2 - vector4 * magnitude;
					Vector3 vector7 = vector2;
					Vector3 vector8 = vector2 + vector5 * magnitude2;
					for (int j = 0; j < segments; j++)
					{
						float num4 = (float)j / ((float)segments - 1f);
						float num5 = 1f - num4;
						Vector3 item = num5 * num5 * vector6 + 2f * num5 * num4 * vector7 + num4 * num4 * vector8;
						list.Add(item);
					}
					num2 = i;
				}
			}
			if (num2 <= num)
			{
				list.Add(path[num]);
			}
			return list;
		}
		return path;
	}

	public static Vector3[] GetBezierApproximation(Vector3[] controlPoints, int outputSegmentCount)
	{
		Vector3[] array = new Vector3[outputSegmentCount + 1];
		for (int i = 0; i < outputSegmentCount; i++)
		{
			float t = (float)i / (float)outputSegmentCount;
			ref Vector3 reference = ref array[i];
			reference = GetBezierPoint(t, controlPoints, 0, controlPoints.Length);
		}
		return array;
	}

	public static Vector3 GetBezierPoint(float t, Vector3[] controlPoints, int index, int count)
	{
		if (count == 1)
		{
			return controlPoints[index];
		}
		Vector3 bezierPoint = GetBezierPoint(t, controlPoints, index - 1, count - 1);
		Vector3 bezierPoint2 = GetBezierPoint(t, controlPoints, index, count - 1);
		Vector3 bezierPoint3 = GetBezierPoint(t, controlPoints, index + 1, count - 1);
		return (1f - t) * (1f - t) * bezierPoint + 2f * (1f - t) * t * bezierPoint2 + t * t * bezierPoint3;
	}
}