iPhone glatte Skizze Zeichnungsalgorithmus

52

Ich arbeite an einer Skizzier-App auf dem iPhone. Ich habe es funktioniert, aber nicht schön, wie hier zu sehen

Und ich suche nach einem Vorschlag, um die Zeichnung zu glätten Was ich gemacht habe, ist, wenn der Benutzer einen Finger auf den Bildschirm legt, den ich

genannt habe %Vor%

Dann sammle ich eine einzelne Berührung in einem Array mit

%Vor%

und wenn der Benutzer einen Finger vom Bildschirm wegläßt, rief ich

an %Vor%

Dann zeichne ich alle Punkte im Array mit

%Vor%

Und jetzt möchte ich die Zeichnung verbessern, um mehr wie "Sketch Book" App zu sein

Ich denke, es gibt etwas mit dem Signalverarbeitungsalgorithmus zu tun, um alle Punkte im Array neu anzuordnen, aber ich bin mir nicht sicher. Jede Hilfe würde sehr geschätzt werden.

Danken im Voraus:)

    
Suwitcha Sugthana 22.02.2011, 09:56
quelle

6 Antworten

19

Der einfachste Weg, um eine Kurve zu glätten, ist die Verwendung einer Bezier-Kurve anstelle von geraden Liniensegmenten. Für die Mathematik dahinter finden Sie diesen Artikel (gezeigt in diese Antwort ), die beschreibt, wie die Kurven berechnet werden, um eine Kurve zu glätten, die durch mehrere Punkte verläuft.

Ich glaube, dass das Kernplot-Framework jetzt die Möglichkeit bietet, die Kurven von Plots zu glätten, also Sie könnte den dort verwendeten Code betrachten, um diese Art der Glättung zu implementieren.

Es gibt keine Zauberei, da diese Glättungsroutinen schnell und relativ einfach zu implementieren sind.

    
Brad Larson 23.02.2011, 18:30
quelle
54
%Vor%     
kyoji 31.03.2011 14:20
quelle
13

Ich liebe das Thema wirklich. Danke für die vielen Implementierungen, insbesondere Krzysztof Zabłocki und Yu-Sen Han. Ich habe die Version von Yu-Sen Han geändert, um die Liniendicke in Abhängigkeit von der Geschwindigkeit des Schwenkens (in der Tat die Entfernung zwischen den letzten Berührungen) zu ändern. Auch habe ich Punktzeichnen implementiert (für touchBegan und touchEnded Orte, die nahe beieinander liegen) Hier ist das Ergebnis:

Um die Liniendicke zu definieren, habe ich eine solche Entfernungsfunktion gewählt:

(Frag mich nicht, warum ... ich tue es nur gut, aber ich bin mir sicher, dass du ein besseres finden kannst)

%Vor%

Noch ein Hinweis. Um sicher zu sein, dass sich die Dicke problemlos ändert, habe ich sie abhängig von der Dicke des vorherigen Segments und einem benutzerdefinierten Coefer begrenzt:

%Vor%     
alexburtnik 24.10.2012 21:51
quelle
2

Danke für die Eingabe. Ich aktualisiere meine Quest hier, weil ich den Platz dafür brauche.

Ich lese sowohl die Lösungen corePlot als auch die Bezier-Kurve auf, die Sie mit wenig Erfolg vorgeschlagen haben.

Für den corePlot kann ich das Graph Plot aus einem Array von int holen, kann aber nichts finden, was mit der Kurvenglättung zusammenhängt.BTW Hier benutze ich CPScatterPlot mit einer Zufallszahl.

wie für Bezier-Kurve, Meine Suche führte mich zu hier Es hat etwas mit der Spline-Implementierung in iOS zu tun

%Vor%

und das Ergebnis, das ich bekomme, ist:

%Vor%

Ich bin nicht wirklich sicher, wie ich von dort aus gehen soll. Also bin ich auch an dieser Front fest: (

Ich habe GLPaint als letzte Ressource gesucht. Es verwendet OpenGLES und verwendet ein "Soft Dot" -Sprite, um die Punkte im Array zu zeichnen. Ich weiß, es ist eher so, als würde man das Problem vermeiden, anstatt es zu beheben. Aber ich denke, ich teile meine Erkenntnisse hier trotzdem.

Das Schwarz ist GLPaint und das weiße ist die alte Methode. Und die letzte ist die Zeichnung von "Sketch Book" App nur zum Vergleichen

Ich versuche immer noch, das richtig zu machen, jeder weitere Vorschlag ist sehr willkommen.

    
Suwitcha Sugthana 24.02.2011 07:58
quelle
2

Ich übersetzte kyojis Antwort in Swift, als wiederverwendbare Unterklasse von UIImageView . Die Unterklasse TouchDrawImageView ermöglicht es dem Benutzer, mit dem Finger auf eine Bildansicht zu zeichnen.

Wenn Sie diese TouchDrawImageView -Klasse zu Ihrem Projekt hinzugefügt haben, öffnen Sie Ihr Storyboard und

  1. Wählen Sie TouchDrawImageView als "Benutzerdefinierte Klasse" Ihrer Bildansicht
  2. aus
  3. Aktivieren Sie die Eigenschaft "Benutzerinteraktion aktiviert" Ihrer Bildansicht

Hier ist der Code von TouchDrawImageView.swift :

%Vor%     
Lars Blumberg 23.09.2017 20:40
quelle
1

Um den albernen Punkt im GLPaint-Code loszuwerden.

Ändern in

%Vor%

diese Funktion

%Vor%

Ich weiß, dass dies nicht die Lösung für unser Problem ist, aber es ist etwas.

    
Olle 24.02.2011 08:44
quelle