Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Raster auf Canvas zeichnen (https://www.delphipraxis.net/109527-raster-auf-canvas-zeichnen.html)

cltom 3. Mär 2008 08:33


Raster auf Canvas zeichnen
 
Hej DP,

für ein "Zeichenprogramm" möchte ich einen Raster machen. Das "snap-to-grid" geht gut, kein Problem mit dem üblichen (x div raster) * raster. Was jedoch nicht gut läuft, ist die grafische Darstellung. Diese mache ich einfach durch zwei Schleifen.

Delphi-Quellcode:
  for rx := 0 to (img_main.Width div gridsize) do
    for ry := 0 to (img_main.Height div gridsize) do
      img_main.Canvas.Pixels[rx*gridsize,ry*gridsize] := clGrey;
das geht auch, ist aber bei schnellem neuzeichnen (etwa beim bewegen von objekten) ineffizient. das heisst, das neuzeichnen wird extrem verlangsamt. Natürlich auch, sind ja rund 1 Mio. Schleifendurchläufe.

Was wäre effizienter? Ein fertiges Bild mit mehreren Kacheln malen?

danke und ligrü
tom

Kroko1999 3. Mär 2008 13:05

Re: Raster auf Canvas zeichnen
 
MoveTo
LineTo mit
Delphi-Quellcode:
Pen.Style := psDot;
bzw. andere (F1 drücken)!

cltom 6. Mär 2008 05:47

Re: Raster auf Canvas zeichnen
 
Hej Kroko,

ok, danke. Das verringert natürlich die Zahl der Schleifendurchläufe ganz ordentlich und bringt auch ein wenig (gar nicht so viel wie erwartet) schnellere Reaktion. Leider ist es noch nicht wirklich befriedigend schnell und leider ist es auch nicht ganz das, was geplant war, nämlich einzelne Gitterpunkte, nicht gepunktete Linien.

gibt's noch Alternativen?

danke
tom

rawsoul 6. Mär 2008 06:29

Re: Raster auf Canvas zeichnen
 
Falls du auch auf Fremdkomponenten zugreifen würdest, such mal hier im Forum nach TMathBitmap (oder so ähnlich...) ;)

mkinzler 6. Mär 2008 06:40

Re: Raster auf Canvas zeichnen
 
Man könnte das Raster einmalig erzeugen in ein Offscreen-Image kopieren und dieses vor dem Neuzeichnen in den Canvas kopieren.

mquadrat 6. Mär 2008 07:43

Re: Raster auf Canvas zeichnen
 
Würde das auch einmal auf ein Bitmap zeichnen und dann immer nur reinkopieren. Ich würde allerdings den gesamten Zeichenprozess dann auf ein weiteres Bitmap zeichnen und erst wenn das komplett ist das dann auf deinen Ausgabecanvas kopieren. Flackern praktisch null.

DelphiKlaus 6. Mär 2008 08:00

Re: Raster auf Canvas zeichnen
 
Hallo,

auf was für eine Komponente zeichnest Du das Raster? Sieht mir nach einem Bitmap aus. Versuch es mal mit einer PaintBox.

Ich habe eine Anwendung, die ein Raster mit 10 Pixeln Abstand auf den Canvas einer Paintbox zeichnet. Bei einer Bildgröße von 1200 mal 1000 Pixeln geht die CPU-Auslastung im Taskmanager mal für eine Sekunde auf 4% hoch. Es ist auch keine Verzögerung zu bemerken. Wenn ich in meinem Zeichenprogramm mit der Maus ein Element verschiebe, wird immer alles neu gezeichnet. Trotzdem läuft die Maus absolut ruckfrei und es wird alles sauber aktualisiert.

MfG

Klaus

cltom 7. Mär 2008 12:12

Re: Raster auf Canvas zeichnen
 
Danke für Eure Antworten.

Als Zeichenfläche habe ich ein normales TImage. Flackern ist kein Problem, auch nicht, dass der Raster zu lange brauchen würde, das ist beim einmaligen Zeichnen kein Problem. Aber beim verschieben von Objekten (wo ich auch die gesamte Zeichenfläche neu zeichnen lasse), wird's dann sehr langsam.

offscreen zeichnen und reinkopieren klingt vernünftig, das werde ich mal testen.

danke
ligrü
tom

stahli 7. Mär 2008 12:29

Re: Raster auf Canvas zeichnen
 
Ich würde es auch wie DelphiKlaus mit einer PaintBox versuchen und diese über das Image legen.
Die Paintbox transparent lassen und nur einmalig (und bei Größenänderungen) die Punkte neu zeichnen.
Mausbehandlungen komplett ausschließen (Maus-Transparent).

Dann sind die Punkte optisch für den Nutzer vorhanden, aber berühren nicht Dein eigentliches Bild.

stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

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