17using System.Collections.Generic;
33 private List<Vector2> controlPoints;
35 private int curveCount;
43 controlPoints =
new List<Vector2>();
53 controlPoints.Clear();
54 controlPoints.AddRange(newControlPoints);
55 curveCount = (controlPoints.Count - 1) / 3;
60 controlPoints.Clear();
61 controlPoints.AddRange(newControlPoints);
62 curveCount = (controlPoints.Count - 1) / 3;
77 public void Interpolate(List<Vector2> segmentPoints,
float scale)
79 controlPoints.Clear();
81 if (segmentPoints.Count < 2)
86 for (
int i = 0; i < segmentPoints.Count; i++)
90 Vector2 p1 = segmentPoints[i];
91 Vector2 p2 = segmentPoints[i + 1];
93 Vector2 tangent = (p2 - p1);
94 Vector2 q1 = p1 + scale * tangent;
96 controlPoints.Add(p1);
97 controlPoints.Add(q1);
99 else if (i == segmentPoints.Count - 1)
101 Vector2 p0 = segmentPoints[i - 1];
102 Vector2 p1 = segmentPoints[i];
103 Vector2 tangent = (p1 - p0);
104 Vector2 q0 = p1 - scale * tangent;
106 controlPoints.Add(q0);
107 controlPoints.Add(p1);
111 Vector2 p0 = segmentPoints[i - 1];
112 Vector2 p1 = segmentPoints[i];
113 Vector2 p2 = segmentPoints[i + 1];
114 Vector2 tangent = (p2 - p0).normalized;
115 Vector2 q0 = p1 - scale * tangent * (p1 - p0).magnitude;
116 Vector2 q1 = p1 + scale * tangent * (p2 - p1).magnitude;
118 controlPoints.Add(q0);
119 controlPoints.Add(p1);
120 controlPoints.Add(q1);
124 curveCount = (controlPoints.Count - 1) / 3;
130 public void SamplePoints(List<Vector2> sourcePoints,
float minSqrDistance,
float maxSqrDistance,
float scale)
132 if (sourcePoints.Count < 2)
137 Stack<Vector2> samplePoints =
new Stack<Vector2>();
139 samplePoints.Push(sourcePoints[0]);
141 Vector2 potentialSamplePoint = sourcePoints[1];
145 for (i = 2; i < sourcePoints.Count; i++)
148 ((potentialSamplePoint - sourcePoints[i]).sqrMagnitude > minSqrDistance) &&
149 ((samplePoints.Peek() - sourcePoints[i]).sqrMagnitude > maxSqrDistance))
151 samplePoints.Push(potentialSamplePoint);
154 potentialSamplePoint = sourcePoints[i];
158 Vector2 p1 = samplePoints.Pop();
159 Vector2 p0 = samplePoints.Peek();
160 Vector2 tangent = (p0 - potentialSamplePoint).normalized;
161 float d2 = (potentialSamplePoint - p1).magnitude;
162 float d1 = (p1 - p0).magnitude;
163 p1 = p1 + tangent * ((d1 - d2) / 2);
165 samplePoints.Push(p1);
166 samplePoints.Push(potentialSamplePoint);
169 Interpolate(
new List<Vector2>(samplePoints), scale);
183 int nodeIndex = curveIndex * 3;
185 Vector2 p0 = controlPoints[nodeIndex];
186 Vector2 p1 = controlPoints[nodeIndex + 1];
187 Vector2 p2 = controlPoints[nodeIndex + 2];
188 Vector2 p3 = controlPoints[nodeIndex + 3];
199 List<Vector2> drawingPoints =
new List<Vector2>();
201 for (
int curveIndex = 0; curveIndex < curveCount; curveIndex++)
217 return drawingPoints;
228 List<Vector2> drawingPoints =
new List<Vector2>();
230 for (
int i = 0; i < controlPoints.Count - 3; i += 3)
232 Vector2 p0 = controlPoints[i];
233 Vector2 p1 = controlPoints[i + 1];
234 Vector2 p2 = controlPoints[i + 2];
235 Vector2 p3 = controlPoints[i + 3];
249 return drawingPoints;
258 List<Vector2> drawingPoints =
new List<Vector2>();
260 for (
int curveIndex = 0; curveIndex < curveCount; curveIndex++)
262 List<Vector2> bezierCurveDrawingPoints = FindDrawingPoints(curveIndex);
267 bezierCurveDrawingPoints.RemoveAt(0);
270 drawingPoints.AddRange(bezierCurveDrawingPoints);
273 return drawingPoints;
276 List<Vector2> FindDrawingPoints(
int curveIndex)
278 List<Vector2> pointList =
new List<Vector2>();
284 pointList.Add(right);
286 FindDrawingPoints(curveIndex, 0, 1, pointList, 1);
295 int FindDrawingPoints(
int curveIndex,
float t0,
float t1,
296 List<Vector2> pointList,
int insertionIndex)
306 float tMid = (t0 + t1) / 2;
309 Vector2 leftDirection = (left - mid).normalized;
310 Vector2 rightDirection = (right - mid).normalized;
312 if (Vector2.Dot(leftDirection, rightDirection) >
DIVISION_THRESHOLD || Mathf.Abs(tMid - 0.5f) < 0.0001f)
314 int pointsAddedCount = 0;
316 pointsAddedCount += FindDrawingPoints(curveIndex, t0, tMid, pointList, insertionIndex);
317 pointList.Insert(insertionIndex + pointsAddedCount, mid);
319 pointsAddedCount += FindDrawingPoints(curveIndex, tMid, t1, pointList, insertionIndex + pointsAddedCount);
321 return pointsAddedCount;
342 p += 3 * uu * t * p1;
343 p += 3 * u * tt * p2;
float MINIMUM_SQR_DISTANCE
List< Vector2 > GetDrawingPoints0()
List< Vector2 > GetControlPoints()
Vector2 CalculateBezierPoint(int curveIndex, float t)
void SetControlPoints(List< Vector2 > newControlPoints)
List< Vector2 > GetDrawingPoints2()
void SamplePoints(List< Vector2 > sourcePoints, float minSqrDistance, float maxSqrDistance, float scale)
void Interpolate(List< Vector2 > segmentPoints, float scale)
void SetControlPoints(Vector2[] newControlPoints)
List< Vector2 > GetDrawingPoints1()
Credit Erdener Gonenc - @PixelEnvision.