Paso 1 - Genera N + 1 puntos interpolando la curva en incrementos de 1 / N. N debe ser lo suficientemente grande como para obtener buenos resultados visuales, pero lo suficientemente pequeño como para ser fácilmente calculado. Un valor de 50 debería estar bien para la mayoría de las situaciones, pero debería ajustarse para su caso específico. Llamaré a esto los "puntos interpolados".
Alternativamente, puede generar una lista corta de segmentos y dividir recursivamente cada segmento que sea más largo que la longitud máxima deseada del segmento (inicialmente debe generar al menos cuatro segmentos para tener en cuenta las curvas S donde el inicio está muy cerca del final).
Paso 2 - "Camina la línea" usando los puntos interpolados y el espacio que deseas entre cada punto.
Lo dejaré aquí mi código de Unidad:
public static Vector2[] InterpolateBezier(Vector2 start, Vector2 startControlPoint,
Vector2 end, Vector2 endControlPoint, int segments)
{
Vector2[] interpolated = new Vector2[segments + 1];
interpolated[0] = start;
interpolated[segments] = end;
float step = 1f / segments;
for (int i = 1; i < segments; i++)
{
interpolated[i] = GetBezierPosition(start, startControlPoint, end,
endControlPoint, i * step);
}
return interpolated;
}
public static Vector2 GetBezierPosition(Vector2 start, Vector2 startControlPoint,
Vector2 end, Vector2 endControlPoint, float t)
{
float omt = 1f - t;
float omt2 = omt * omt;
float t2 = t * t;
return
start * (omt2 * omt) +
startControlPoint * (3f * omt2 * t) +
endControlPoint * (3f * omt * t2) +
end * (t2 * t);
}
public static List<Vector2> WalkLine(Vector2[] points, float spacing, float offset = 0)
{
List<Vector2> result = new List<Vector2>();
spacing = spacing > 0.00001f ? spacing : 0.00001f;
float distanceNeeded = offset;
while (distanceNeeded < 0)
{
distanceNeeded += spacing;
}
Vector2 current = points[0];
Vector2 next = points[1];
int i = 1;
int last = points.Length - 1;
while (true)
{
Vector2 diff = next - current;
float dist = diff.magnitude;
if (dist >= distanceNeeded)
{
current += diff * (distanceNeeded / dist);
result.Add(current);
distanceNeeded = spacing;
}
else if (i != last)
{
distanceNeeded -= dist;
current = next;
next = points[++i];
}
else
{
break;
}
}
return result;
}
t
en, digamos, 100 pasos, y mida las distancias entre los puntos resultantes. Luego, interpola a lo largo de esta polilínea como desees.