Le curve di Bézier sono curve parametriche usate in moltissimi software di modellazione grafica (es. Photoshop, CorelDraw, modellatori 3D,...) con la caratteristica di essere derivabili infinitamente.
Questo assicura che una curva di Bézier non presenta punti angolosi e si mostra sempre estremamente morbida, analiticamente gestibile, facilmente programmabile.
Rhinoceros 3D è l'ambiente ideale per implementare queste curve o qualsiasi cosa abbia a che fare con il CAD (per via delle sue librerie Rhinocommon).
Sopra vedete la costruzione grafica di una curva 2D di grado 3 avente 4 punti di controllo (detti CV) generata con la seguente "definizione" Grasshopper:
Una curva di Bézier come questa
si può implementare facilmente con l'algoritmo di De Casteljau che possiamo tradurre in C# nel seguente modo:
CLASSE PER IL CALCOLO DI UN PUNTO DELLA CURVA PER DATO VALORE DI t
public class DeCasteljau
{
// Calcola un punto sulla curva di Bezier utilizzando l'algoritmo di De Casteljau
public static Point3d GetCasteljauPoint(List<Point3d> points, double t)
{
if (points.Count == 1)
return points[0]; //alla fine della ricorsione ritorna questo punto
List<Point3d> intermediatePoints = new List<Point3d>();
for (int i = 0; i < points.Count - 1; i++)
{
double x = ((1 - t) points[i].X + t points[i + 1].X);
double y = ((1 - t) points[i].Y + t points[i + 1].Y);
double z = ((1 - t) points[i].Z + t points[i + 1].Z);
intermediatePoints.Add(new Point3d(x, y, z));
}
return GetCasteljauPoint(intermediatePoints, t);
}
}
La suddetta classe può essere chiamata nel seguente modo: List<Point3d> puntiCurvaBezier = new List<Point3d>();
Point3d puntoSullaCurva = new Point3d(0, 0, 0);
for (double t = 0; t <= 1; t += 0.001)
{
puntoSullaCurva = DeCasteljau.GetCasteljauPoint(controlPoints, t);
puntiCurvaBezier.Add(puntoSullaCurva);
Polyline polilinea = new Polyline(puntiCurvaBezier);
A = polilinea;
}
Il file GH con il codice suddetto può essere scaricato al seguente link
コメント