Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi vernünftiges Freihandzeichnen (https://www.delphipraxis.net/35191-vernuenftiges-freihandzeichnen.html)

TheAn00bis 3. Dez 2004 16:47


vernünftiges Freihandzeichnen
 
Hi,

ich bin gerade dabei eine Art Paint zu schreiben, habe auch Rechteck zeichnen etc schon fertig, eigentlich sollte das Freihandzeichnen ja auch kein Problem darstellen. Ich zeichne einfach auf die aktuelle Mausposition bei MouseMove ein kleines gefülltes Rechteck.

Allerdings scheint das MouseMove zu selten abgefragt zu werden, so dass bei schnelleren Mausbewegungen Lücken entstehen.

Mir sind follgende Möglichkeiten eingefallen:

1. Lücken mit Linien füllen (gefällt absolut nicht, also verworfen)
2. Mausbewegungsgeschwindigkeit verlangsamen (wäre ok, ist das möglich?)
3. eine schnellere Abfrage programmieren (sicherlich mit meinen Kentnissen unmöglich, oder?)

Habt ihr andere Ideen oder Lösungsansetzte für die, die mir eingefallen sind?


P.S.: Wäre schön wenn das ganze unter Delphi4 realisierbar wäre!

Edit: Falls es wichtig ist: Untergrund ist Paintbox

supermuckl 3. Dez 2004 16:53

Re: vernünftiges Freihandzeichnen
 
Ich weis nicht, ob man mit DirectX eine schnellere Abtastrate für die Maus hinbekommt. Aber das wäre ein Ansatz.

Die 2. Möglichkeit wäre, wenn du die "Löcher" nicht mit Linien verbindest, sondern mit einer Spline. Also Kurven, die deine Linien interpoliert berechnen und darstellen.

Ich habe schon in vielen Programmen dieses Problem gesehen. Die haben es bis jetzt alle mit Linien verbunden. Ausser meines wissens in CorelDraw. Da wird eine Freihandlinie "geglättet" nach dem Splineprinzip.

TheAn00bis 3. Dez 2004 17:04

Re: vernünftiges Freihandzeichnen
 
Wahrscheinlich ist diese Methode auch garnicht so schlecht wie ich gedacht habe, als du gesagt hast, dass das die meisten Programme es so machen ist mir aufgefallen, dass Paints Freihandzeichnungen genauso eckig wirken, wie meine.

Vorher kam mir das bei meinem Programm extrem eckig vor, aber wenn es bei Paint genauso ist....

Trotzdem wäre ich weiterhin an einer besseren Lösung interessiert! Geht das Mit der Mausverlangsamerung?

Edit: Hab mir das gerade mal in Flash angeschaut, dort kann ich extrem schnell kurvenförmige Linien ziehen, die dennoch nicht aus Strecken, sondern ausschließlich aus Kurven bestehen.. vll auch diese Spline Methode, werde mich mal ein wenig danach erkundigen.

//Edit: Hab vergessen zu sagen, dass ich hier Linien gemeint habe :oops:

Ben1 3. Dez 2004 18:53

Re: vernünftiges Freihandzeichnen
 
Beim starten des zeichnens startest du einen timer der in ganz kurzen Intervallen die Mausposition abfragt und an die entprechenden Stellen zeichnet.

Is nur so eine Idee, keine Ahnung ob das funktioniert.

TheAn00bis 3. Dez 2004 19:31

Re: vernünftiges Freihandzeichnen
 
Timer schafft nicht weniger als 20ms (auch wenn er auf 1ms gestellt ist), schließt sich somit aus. Was ich mir überlegt habe ist zwei Timer zu nehmen und den einen 10ms später zu starten, und beide auf 1ms zu stellen, dann das Ereignis bei beiden onTimer-Events auszuführen, die ja abwechselnd wären. Allerdings klappt das ganze nicht, da ich nicht weiß, wie ich die um 10ms verzögerte Startzeit festlegen soll.

Könnte man nicht theoretisch unendlich Timer bei onCreate aktivieren, alle auf 1ms(praktisch=20ms), bei dieser Menge würden die doch alle etwas verzögert starten, wenn man jetzt auf alle dieser Timer das "Mausposition finden und dort zeichnen"-Event läge, hätte man dann nicht eine genaue Zeichnung?

Maximus 3. Dez 2004 19:57

Re: vernünftiges Freihandzeichnen
 
Wenn du DirectX benutzt, hab ich jetzt auf anhieb keine Lösung, aber wenn du das mit Canvas realisierst ...

... dan solltest du keine Rechtecke sondern Linien zeichnen
Delphi-Quellcode:
    begin
     Canvas.LineTo(X, Y);
    end;
So hab ich das ganze realisiert und das hat damals gut funktioniert und die MouseMove schnelligkeit hat ausgereicht!

MFG
Maximus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz