J'essaie de faire un outil "pinceau" dans AS3 (pur, pas flex) qui simule l'écriture manuscrite, faisant des traits pour être lisses au lieu de coincé. Ensuite, la trace doit être réduite à des courbes bévéreuses cubiques pouvant être glissées et déformées, affectant le trajet préalablement dessiné (comme l'outil de stylo d'illustrateur). P>
Je suive le mouvement de la souris pour obtenir un ensemble de points pour dessiner le chemin. Pour autant que je sache, je dois faire un chemin B-Spline en utilisant cet ensemble de points. Ensuite, je devrais le réduire aux courbes cubes bézier (en ajoutant la fonctionnalité 'Tool Stylo' sur le chemin). P>
J'ai déjà développé l'outil de stylo, à l'aide d'un algorithme qui réduit les Béziers cubes aux Béziers quadratiques (puis à l'aide de la fonction Flash Curveto). Mais je n'ai aucune idée de la façon de créer une SPLINE B (ou une autre simplification), puis de la réduire aux courbes de Bézier. P>
Connaissez-vous un moyen d'accomplir cela? P>
4 Réponses :
Le JhotDraw est un projet OpenSource en Java pour dessiner. Il convertit des dessins à la main gratuits en courbes cubes bézier. La source est disponible - téléchargez et traduisez. N'ayez pas peur de la taille du projet: vous n'avez besoin que de quelques classes, à savoir:
(?<!Math\.)\b(max|min|abs|sqrt|PI|cos|sin|atan2)\( Math.$1(
J'ai vérifié la bibliothèque et ça a l'air génial. L'exemple d'application de tirage à l'échantillon fait exactement ce que je veux. Merci pour la référence.
Voici les regextes dont je parlais.
Quel travail génial !! J'ai déjà commencé à porter le code Java à AS3, il ne semble pas être une tâche difficile, mais cela accélérera énormément le processus. Merci beaucoup.
Assurez-vous de poster le port sur GitHub ou GoogleCode, je cherchais exactement cela, plus tôt aujourd'hui. :)
J'ai utilisé cette fonction une fois.
public function multicurve(g: Graphics, args: Array, closed: Boolean): void { var mid: Array = args.slice(); //make dublicate var i: uint; var point: Point; var nextPoint: Point; var numPoints: uint = mid.length; if (numPoints == 2) { g.moveTo(mid[0].x, mid[0].y); g.lineTo(mid[1].x, mid[1].y); return; } var Xpoint: Array = new Array(); var Ypoint: Array = new Array(); for (i = 1; i < numPoints - 2; i++) { point = mid[i]; nextPoint = mid[i+1]; Xpoint[i] = 0.5*(nextPoint.x + point.x); Ypoint[i] = 0.5*(nextPoint.y + point.y); } if (closed) { Xpoint[0] = 0.5*(mid[1].x + mid[0].x); Ypoint[0] = 0.5*(mid[1].y + mid[0].y); Xpoint[i] = 0.5*(mid[i+1].x + mid[i].x); Ypoint[i] = 0.5*(mid[i+1].y + mid[i].y); Xpoint[i+1] = 0.5*(mid[i+1].x + mid[0].x); Ypoint[i+1] = 0.5*(mid[i+1].y + mid[0].y); mid.push(new Point(mid[0].x, mid[0].y)); Xpoint[i+2] = Xpoint[0]; Ypoint[i+2] = Ypoint[0]; } else { Xpoint[0] = mid[0].x; Ypoint[0] = mid[0].y; Xpoint[i] = mid[i+1].x; Ypoint[i] = mid[i+1].y; mid.pop(); numPoints--; } g.moveTo(Xpoint[0], Ypoint[0]); for (i = 1; i < numPoints; i++) { point = mid[i]; g.curveTo(point.x, point.y, Xpoint[i], Ypoint[i]); } if (closed) { g.curveTo(mid[0].x, mid[0].y, Xpoint[i], Ypoint[i]); } }
Vous ne savez pas si vous avez spécifiquement besoin de Beziers, mais cet outil de spline Catmull-ROM est plutôt génial: http://www.motiondraw.com/md/as_samples/t/ Catmullromspline / Tween.html P>
Il y a un algorithme dans une bibliothèque C qui fait ce que vous demandez: http://tog.acm.org/resources/graphicsgems/gems/fitcurves.c p>
Il s'agit d'un algorithme assez complexe qui simplifie votre géométrie en convertissant une liste de nombreux points en une liste de quelques courbes de bézier approchées, transformant essentiellement des gribouillis en courbes très lisses. Il a une quantité ajustable de mou, et fonctionne en trouvant la moins grande quantité de courbes de Bézier qui correspondent à votre ensemble de points dans un certain mou. Donc, plus vous définissez le mou de l'algorithme, le plus lisse (mais potentiellement moins précis) de votre écriture. P>
Hey! Merci! Cela a l'air bien! J'utilise déjà l'algorithme JhotDraw (simplifié) et cela fonctionne à peu près comme le code que vous m'avez lié. Cependant, je vais aussi regarder cela aussi. Et il semble qu'il y ait plus de sources sur le site Web où le fichier est. Merci encore pour la référence!
Mise à jour rapide: La bibliothèque FitCurves a fonctionné, mais si je faisais le problème encore, je l'aborderais différemment. Tout d'abord, je devais modifier la bibliothèque pour gérer une écriture rapide, une écriture rapide semble être un bon moyen de faire pression sur le test d'un tel algorithme. Plus important encore, je ferais un algorithme de temps réel qui calcule une courbe à la fois que vous dessinez. Je garderais la partie centrale de FitCurves, qui est un algorithme qui renvoie une seule courbe qui correspond le mieux à un ensemble de points et personnalisez le reste.
Lien maintenant mort. Archivé ici: web .Archive.org / Web / 20090805204502 / http: //tog.acm.org/resour CES / ... et cela ressemble à la nouvelle liaison officielle: GITUB.COM/ERICH666/Graphicsgems/blob/Master/gems/fitcurves. C / * Un algorithme pour automatiquement Courbes numérisées adaptées par Philip J. Schneider de "Gemmes Gems", Pressocramces, 1990 * /
Je cherche la même chose, mais JavaScript, connaissez-vous?