2009-06-19 5 views
1

Ok, also werde ich versuchen, so beschreibend wie möglich zu sein.Konvertieren von Pixeln in Bezier-Kurven in Actionscript 3

Ich arbeite an einem Projekt für einen Client, der eine Jibjab-Maskierungsfunktion eines hochgeladenen Bildes erfordert.

Ich möchte in der Lage sein, ein Datenbank-speicherbares Objekt zu generieren, das Anker/Steuerpositionen einer Bézier-Form enthält, so dass ich es später herausziehen und das Objekt erneut maskieren kann. Das alles ist ziemlich einfach zu machen, abgesehen von einem Haken: Ich muss das Bezier-Objekt aus einer benutzerdefinierten Zeichnung erstellen.

Bisher ist hier, wie ich denke, der Prozess geht:

auf die Maus nach unten, legen Sie ein neues Sprite, beginFill und moveTo Mausposition.

bei Mausbewegung, Linie zu einer XY-Koordinate.

auf Maus hoch, endFill.

Das alles funktioniert einfach großartig. Ich könnte die Informationen hier einfach speichern, aber ich würde mir ein GIGANTIC-Objekt mit vielen ziemlich nutzlosen x/y-Koordinaten ansehen und keine Möglichkeit, Feinabstimmungen vorzunehmen, ohne die Griffe auf jedem Pixel zu setzen. (Ich auch kann der Benutzer einen Stift-Werkzeug geben ...)

Hier ist, was ich so weit wie Bezierkurve Berechnung Denken geht:

1: Finde heraus, wenn ich eine neue Kurve beginnen müssen , und verfolgen Sie die xy des Pixels in diesem Intervall. Ich stelle mir vor, dass dies nur eine Pixelzahl ist, vielleicht nur eine Zählvariable pro Mausbewegung inkrementieren und eine neue alle x Pixel machen. Das Problem hier ist, einige Kurven wären ungenau, und andere sind unnötig, aber ich brauche wirklich nur einen allgemeinen Bereich, nicht eine exakte Darstellung, so könnte es funktionieren. Ich wäre jedoch glücklicher mit etwas etwas schlauer.

2: nehmen Sie jedes neue x/y, speichern Sie es als Anker, und finden Sie heraus, wohin ein Steuerelement gehen würde, um die Linienkurve zwischen diesem und dem letzten Anker zu machen. Hier werde ich wirklich aufgehängt. Ich bin mir sicher, dass jemand das in Flash gemacht hat, aber keine Menge Googeln kann mir helfen mit dem Weg dies zu erledigen. Ich habe viel skizziert, und mit wenig Mathe kann ich meine Gedanken umhüllen, aber ich finde keine Möglichkeit, Pixel in Beziers umzuwandeln.

Ist das möglich? Alles, was ich wirklich brauche, ist etwas, das der gleichen Form nahe kommt. Ich denke darüber nach, vielleicht nur Anker zu platzieren, wenn der Winkel des nächsten Pixels 180 Grad in Bezug auf die aktuelle Linie oder so ist, und nur die Kante des Bogens zwischen diesen Änderungen zu greifen, aber egal wie sehr ich es versuche, ich kann nicht herausfinden, wie man das funktioniert!

Vielen Dank für Ihre Hilfe, ich werde sicher meine Fortschritte hier posten, wie ich gehen, ich denke, das ist in vielen Anwendungen wirklich nützlich sein könnte, solange es ...

Jesse

tatsächlich machbar ist

Antwort

0

Danke für die Antworten, obwohl ich denke, ich sollte wahrscheinlich genauer über die Anwendung sein, ich brauche wirklich nur einen Umriss für eine Maske, so konvertieren Bilder zu Vektoren oder Polygonen, trotz wie cool das ist, doesn ' t tue wirklich mein Problem beheben. Der lineare Algorithmus der kleinsten Quadrate ist mega cool, ich denke, das könnte näher an dem sein, wonach ich suche.

Ich habe eine grundlegende Workaround gehen jetzt, ich zähle nur Mausbewegungen, dann jedes X (spielt mit ihm, um am meisten wünschenswert Kurve) bewegt sich, ich greife die xy-Position. dann nehme ich jedes andere gespeicherte xy und verwandle es in einen Anker, die restlichen xys werden zu Steuerelementen. Dies führt zu etwas wünschenswerten Ergebnissen, hat aber einige kleinere Probleme, da die Geschwindigkeit, mit der die Maske gezeichnet wird, die Anzahl der Griffe beeinflusst, und es ist wirklich nur ein allgemeiner Bereich, nicht eine genaue Anpassung. Interessanterweise scheinen die Benutzer für präzisere Formen langsamer zu zeichnen, so dass diese Lösung viel besser funktioniert, als ich mir vorgestellt habe, aber sie ist nicht so schön, wie sie sein könnte. Dies wird für den Kunden funktionieren. Obwohl es keinen Grund gibt, es weiter zu verfolgen, mag ich es, neue Dinge zu lernen, und werde einige Zeit außerhalb der Uhrzeiten damit verbringen, lineare Gleichungsgleichungen zu untersuchen und zu sehen, ob ich eine Klasse trommeln kann, die diese Berechnungen durchführt für mich. Wenn irgendjemand über irgendeinen AS3 Code für diese Art von Ding läuft oder etwas von mir mag, lass es mich wissen, dies ist ein interessantes Puzzle.

1

Es klingt nach viel Arbeit, um Pixel in Bezier-Kurven zu verwandeln. Sie könnten versuchen, etwas wie den Linear least squares-Algorithmus zu verwenden. http://en.wikipedia.org/wiki/Linear_least_squares

Ein anderer Takt, könnten Sie Ihre Benutzer stattdessen Vektorgrafiken zeichnen lassen? Auf diese Weise können Sie die Formen einfach in der Datenbank speichern.

Ein weiteres cooles Methode der Raster-Vektor Konvertierung so etwas wie dieses iterative Programm wäre: http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

Viel Glück

1

ich autotrace discuss mit meiner Antwort auf this question Bitmaps in beziers zu konvertieren. Ich empfehle, Ihre Benutzerzeichnung durch dieses Programm auf dem Server zu übergeben. Autotrace macht eine fantastische Arbeit bei der Suche und Vereinfachung, so dass es nicht nötig ist, das Rad hier neu zu erfinden.