Étant donné un tableau de points, il est facile de tracer une ligne à partir de ceux-ci, par exemple en utilisant la classe GraphicsPath.
Par exemple, le tableau suivant de points...
[0]: (0,0)
[1]: (100,0)
[2]: (0,100)
[3]: (100,100)
...décrit une ligne qui ressemble à un Z.
Mais voici le défi : je dois dessiner des coins arrondis avec un rayon de 10 pixels, par exemple. Par coins, j'entends les points de la ligne qui ne sont pas des points de départ ou d'arrivée. Dans ce cas, il y a deux coins à (0,100)
y (100,0)
.
J'ai joué avec des béziers, des courbes et des arcs, dont certains pourraient contenir la solution - je n'ai simplement pas encore pu la trouver moi-même, car je dois être capable de gérer des lignes dessinées dans tous les angles, et pas seulement des lignes horizontales ou verticales.
Fixer le LineJoin
de la Pen
à l'objet Round
n'est pas suffisant, car cela ne se voit qu'avec des stylos plus larges.
Edit : Pour clarifier, je suis bien conscient des capacités de bézier, de courbe et d'arc de la classe GraphicsPath. Je suis à la recherche de conseils plus spécifiques concernant la construction de l'algorithme qui peut prendre n'importe quel nombre de points et les enchaîner avec des coins arrondis.
Solution
J'ai mis au point la fonction suivante qui renvoie un chemin représentant la ligne avec des coins arrondis. La fonction utilise la fonction LengthenLine, que l'on trouve à l'adresse suivante aquí .
protected GraphicsPath GetRoundedLine(PointF[] points, float cornerRadius)
{
GraphicsPath path = new GraphicsPath();
PointF previousEndPoint = PointF.Empty;
for (int i = 1; i < points.Length; i++)
{
PointF startPoint = points[i - 1];
PointF endPoint = points[i];
if (i > 1)
{
// shorten start point and add bezier curve for all but the first line segment:
PointF cornerPoint = startPoint;
LengthenLine(endPoint, ref startPoint, -cornerRadius);
PointF controlPoint1 = cornerPoint;
PointF controlPoint2 = cornerPoint;
LengthenLine(previousEndPoint, ref controlPoint1, -cornerRadius / 2);
LengthenLine(startPoint, ref controlPoint2, -cornerRadius / 2);
path.AddBezier(previousEndPoint, controlPoint1, controlPoint2, startPoint);
}
if (i + 1 < points.Length) // shorten end point of all but the last line segment.
LengthenLine(startPoint, ref endPoint, -cornerRadius);
path.AddLine(startPoint, endPoint);
previousEndPoint = endPoint;
}
return path;
}