Punkte mit gleichem Abstand zeichnen!

  • Antworten:8
Nimrare
  • Forum-Beiträge: 26

29.08.2014, 12:31:54 via Website

Hallo Leute!

Ich habe folgendes Problem. In meiner App kann man auf dem Canvas Linien zeichnen.
Das funktioniert so, dass ich beim onTouch Event beim Darüberswipen die Fingerposition abnehme und als Punkte speichere. Diese Punkte verbinde ich dann am Canvas durch Linien.
Da die Punkte der Linie äquidistant sein sollen habe ich mir überlegt, dass ein neuer Punkt nur dann gespeichert wird wenn er einen gewissen Abstand zum vorherigen hat. Also einfach den Abstand zum vorherigen Punkt mit einer if Bedingung checken.

Leider passiert folgendes. Der Abstand der Punkte wird zwar nie kleiner als der, den ich in der if Bedingung vorgebe. Egal wie langsam ich über den Bildschirm streiche. Das passt! Allerdings werden die Punktabstände größer wenn ich schnell über den Bildschirm streiche. Ich nehme an, dass dies mit der Abtastfrequenz des onTouch Events zusammenhängt, aber wie kann ich das lösen.

Ich möchte gerne, egal wie schnell ich über den Bildschirm streiche, eine äquidistante Punktemenge erhalten.

Schon mal vielen Dank!

Antworten
Georg C.
  • Forum-Beiträge: 235

29.08.2014, 23:15:25 via Website

Hi,

... Ich nehme an, dass dies mit der Abtastfrequenz des onTouch Events
zusammenhängt ...

Klar; - hier greifst du schon aber ziemlich tief in die "native Hardware Welt?".

NUN;
Benutzt dein Thread! im "Abfragen Modus" (also um die Koordinate herauszufinden) wirklich die volle Rechne- Kapazität?! -> Synchronized.
Eine Auslagerung (Buffering) mit ne Synchronisation, sollte eigentlich ausreichend sein, um dein Problem zu lösen.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Nimrare
  • Forum-Beiträge: 26

30.08.2014, 13:54:41 via Website

Danke, das werde ich mal probieren.
Allerdings wird diese 'erhöhte' Abtastgeschwindigkeit dann auch auf allen Geräten verschieden sein, oder?

Vielleicht sollte ich die Punkteliste einfach nur im Nachhinein homogenisieren.

Antworten
Georg C.
  • Forum-Beiträge: 235

30.08.2014, 23:30:28 via Website

Allerdings wird diese 'erhöhte' Abtastgeschwindigkeit dann auch auf
allen Geräten verschieden sein, oder?

Mein Vorschlag berührt die "Oberflächenprogrammierung" -> also java to Android API.
Hat mit: > 'erhöhte' Abtastgeschwindigkeit < nichts zu tun!
Die "Abtastfrequenz" - ist bei jedem Gerät ... intern festgelegt; und .... ist für "Oberflächenprogrammierer" ... irrelevant!

Vielleicht sollte ich die Punkteliste einfach nur im Nachhinein
homogenisieren.

? - hast du schon nicht erwähnt, dass du die Koordinaten in einer > if Bedingung < prüfst?
hmm ...
Zwei zugehörige Punkte müssen miteinander identifiziert werden -> KLAR!
Das gilt AUCH! für die allgemeine homogene Koordinaten Definition.

Schilde bitte dein Problem/e etwas präziser.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Nimrare
  • Forum-Beiträge: 26

01.09.2014, 11:56:29 via Website

Naja, ich habs jetzt folgendermaßen gelöst.

Wenn ich mit dem Finger über den Bildschirm fahre, werden die überstrichenen Punkte gespeichert.
Dabei legt eine if-Bedingung über die euklidische Norm den Mindestabstand der Punkte fest.

Fahre ich nun einigermaßen langsam über das Display, sieht die Linie auch sehr schön aus, mit gleichmäßigen Abständen.

Ist man jedoch zu schnell, werden die Abstände zwischen einigen Punkten etwas weiter als ich das gerne hätte.
Um dies zu lösen wird die Punktemenge am Ende des Zeichenvorgangs an eine Reperaturmethode übergeben.
Diese betrachtet immer zwei aufeinanderfolgende Punkte und überprüft den Abstand. Wenn er nicht passen sollte werden Punkte eingefügt oder so verschoben, dass am Ende diesselbe Linie herauskommt und schön homogen verteilte Punkte hat.

Du kannst dir die App 'Swush' im PlayStore ansehen, wenn du möchtest.

— geändert am 01.09.2014, 12:27:00

Antworten
Jakob N.
  • Forum-Beiträge: 282

01.09.2014, 12:33:56 via App

Habe mir deine App einmal angesehen.
Ist nicht schlecht ;)
Nur wo zeichnest du da genau deine Punkte? Hast du nicht Path verwendet? (Linie)
Und verwendest du eine Libary oder die SurfaceView?

EDIT: spiel hängt sich auf, wenn man Back-Taste drückt!!!!

— geändert am 01.09.2014, 12:37:54

LG Jakob

Antworten
Nimrare
  • Forum-Beiträge: 26

01.09.2014, 12:49:02 via Website

Danke für dein Feedback Jakob.

Ich nehme die Punkte im onTouch Event ab, i.e. die Fingerposition, und sende diese Punkteliste an den CanvasView dieser Activity.
Also ich instanziere in onCreate den CanvasView und setze ihn dann mit setContentView() statt zb. dem xml Stylesheet.

Die Punkte verbinde ich dann eben durch Linien, aber das ist nur optisch schöner. Intern wird mit Punktelisten gerechnet.

Darf ich fragen was für ein Handy du hast?
Ich habe nämlich das onBackPressed Event überschrieben um die Zurückfunktion zu deaktivieren.
Getestet hab ich das am Nexus 5 mit KitKat und einem Sony XPeria ArcS wo es zu keinen Abstürzen kam.
Bzw. gibt es eine spezielle Activity wo die App abstürzt oder ist es egal wo man den Back Button drückt.

Schonmal danke! :)

Antworten
Jakob N.
  • Forum-Beiträge: 282

01.09.2014, 14:49:47 via App

Gut, mit Path kann man meines Wissens nicht auf die einzelnen Punkte später zugreifen.

Habe ein Samsung Galaxy SIII mit Android 4.3! Ganz egal welche Activity.

EDIT: Fehlalarm!! Es handelt sich um die Menü-Taste! Habe gerade noch einmal getestet.

— geändert am 01.09.2014, 14:54:05

LG Jakob

Antworten
Nimrare
  • Forum-Beiträge: 26

01.09.2014, 17:02:43 via Website

Hmm, sehr eigenartig. Ich werd mich mal diesbezüglich schlau machen, aber danke für die Info!

Antworten