![]() |
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:
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.
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; Was wäre effizienter? Ein fertiges Bild mit mehreren Kacheln malen? danke und ligrü tom |
Re: Raster auf Canvas zeichnen
MoveTo
LineTo mit
Delphi-Quellcode:
bzw. andere (F1 drücken)!
Pen.Style := psDot;
|
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 |
Re: Raster auf Canvas zeichnen
Falls du auch auf Fremdkomponenten zugreifen würdest, such mal hier im Forum nach TMathBitmap (oder so ähnlich...) ;)
|
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.
|
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.
|
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 |
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 |
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 04:18 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