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:)
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.
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%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.
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
TouchDrawImageView
als "Benutzerdefinierte Klasse" Ihrer Bildansicht Hier ist der Code von TouchDrawImageView.swift
:
Tags und Links iphone ios drawing quartz-graphics