Discussion:
Diagramm anzeigen
(zu alt für eine Antwort)
Hans-Peter Diettrich
2014-06-05 14:55:10 UTC
Permalink
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches Diagramm
anzeigen, nur Punkte und Verbindungen?

Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm
zeichnen läßt, und einen Container für die Anzeige. Geht das auch in
einem, z.B. eine PaintBox? Damit bin ich allerdings nicht
weitergekommen, bekomme überhaupt nichts angezeigt :-(

DoDi
Marc Santhoff
2014-06-05 15:01:27 UTC
Permalink
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches
Diagramm anzeigen, nur Punkte und Verbindungen?
Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm
zeichnen läßt, und einen Container für die Anzeige. Geht das auch in
einem, z.B. eine PaintBox? Damit bin ich allerdings nicht
weitergekommen, bekomme überhaupt nichts angezeigt :-(
Einfach den "Canvas" eines TPanel (in einem TPanel für den Rand)
benutzen?

Marc
M. Behrendt
2014-06-05 15:15:40 UTC
Permalink
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches Diagramm
anzeigen, nur Punkte und Verbindungen?
Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm
zeichnen lï¿oeï¿oet, und einen Container fï¿oer die Anzeige. Geht das auch in
einem, z.B. eine PaintBox? Damit bin ich allerdings nicht
weitergekommen, bekomme ï¿oeberhaupt nichts angezeigt :-(
DoDi
oder einfach auf den Canvas vom TForm zeichnen, nicht schön geht aber ;)
Jens Köhler
2014-06-05 15:25:11 UTC
Permalink
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches Diagramm
anzeigen, nur Punkte und Verbindungen?
DoDi
Hallo,

sowas?

Canvas.MoveTo(0, 20);
for x := 1 to 50 do
begin
{PaintBox1.}Canvas.LineTo(x * 5, random(130));
end;

Jens
M. Behrendt
2014-06-05 15:25:18 UTC
Permalink
aus einem alten Projekt

type
TFGraph = class(TForm)
...

procedure TFGraph.zeichne;
begin
with canvas do
begin
repaint;
moveto(round(Lu.p.x/10)+xversatz,yversatz-round(Lu.p.y/10));

oder auch über ein Image auf einem Form
type
TFchart = class(TForm)
Image1: TImage;
...

fchart.show;
fchart.canvas.pixels[t,round(fchart.height-30-futter.ananzahl*fcharthoehe_mult)]:=50;
Pen.Color:=1000;
lineto(round(L2.p.x/10)+xversatz,yversatz-round(L2.p.y/10));
Heinrich Wolf
2014-06-17 17:18:46 UTC
Permalink
"M. Behrendt" <***@gmx.de> schrieb im Newsbeitrag news:8d11279c-4fe3-403d-a418-***@googlegroups.com...
aus einem alten Projekt

type
TFGraph = class(TForm)
...

procedure TFGraph.zeichne;
begin
with canvas do
begin
repaint;
moveto(round(Lu.p.x/10)+xversatz,yversatz-round(Lu.p.y/10));

oder auch über ein Image auf einem Form
type
TFchart = class(TForm)
Image1: TImage;
...

fchart.show;
fchart.canvas.pixels[t,round(fchart.height-30-futter.ananzahl*fcharthoehe_mult)]:=50;
Pen.Color:=1000;
lineto(round(L2.p.x/10)+xversatz,yversatz-round(L2.p.y/10));

Hab mich schon gefreut, dass jemand ein TImage ins Spiel bringt :-)
Aber dann macht er nichts mit dem TImage :-(

Was in eine PaintBox, Form, Panel, ... gezeichnet wird, geht beim nächsten
automatischen Neuzeichnen verloren. Bei TImage nicht.

Heiner

Jan K.
2014-06-05 15:48:48 UTC
Permalink
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches Diagramm
anzeigen, nur Punkte und Verbindungen?
Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm zeichnen
läßt, und einen Container für die Anzeige. Geht das auch in einem, z.B.
eine PaintBox? Damit bin ich allerdings nicht weitergekommen, bekomme
überhaupt nichts angezeigt :-(
Zeichne im OnPaint Ereignis der Paintbox auf dessen Canvas, sonst
verschwindet der Inhalt wenn zB ein anderes Formular drüber war.
Hans-Peter Diettrich
2014-06-05 16:41:11 UTC
Permalink
Post by Jan K.
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches Diagramm
anzeigen, nur Punkte und Verbindungen?
Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm
zeichnen läßt, und einen Container für die Anzeige. Geht das auch in
einem, z.B. eine PaintBox? Damit bin ich allerdings nicht
weitergekommen, bekomme überhaupt nichts angezeigt :-(
Zeichne im OnPaint Ereignis der Paintbox auf dessen Canvas, sonst
verschwindet der Inhalt wenn zB ein anderes Formular drüber war.
Genau das wollte ich vermeiden, durch Form.DoubleBuffer oder Verwendung
einer Bitmap. Aber irgendwas mache ich da wohl noch falsch.
Möglicherweise löscht sich die PaintBox selbst, wenn OnPaint nicht
überschrieben ist?

DoDi
Peter
2014-06-05 17:39:43 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Jan K.
Post by Hans-Peter Diettrich
Ich stehe gerade auf dem Schlauch. Wie kann ich ein einfaches
Diagramm anzeigen, nur Punkte und Verbindungen?
Vermutlich brauche ich dazu eine Bitmap, in die sich das Diagramm
zeichnen läßt, und einen Container für die Anzeige. Geht das auch
in einem, z.B. eine PaintBox? Damit bin ich allerdings nicht
weitergekommen, bekomme überhaupt nichts angezeigt :-(
Zeichne im OnPaint Ereignis der Paintbox auf dessen Canvas, sonst
verschwindet der Inhalt wenn zB ein anderes Formular drüber war.
Genau das wollte ich vermeiden, durch Form.DoubleBuffer oder
Verwendung einer Bitmap. Aber irgendwas mache ich da wohl noch
falsch. Möglicherweise löscht sich die PaintBox selbst, wenn OnPaint
nicht überschrieben ist?
Eine TPaintbox hat keinen Speicher für das, was man auf ihr zeichnet,
sie ist einfach ein Wrapper für den display context des TWincontrols,
auf dem sie liegt. Und der display context eines Fensters ist wiederrum
nur ein Wrapper für einen Teil des Bildschirms, und der ist halt nur
einen Pixel "tief".

Zeichne auf eine TBitmap und zeige die im OnPaint-Event der paintbox
auf selbiger an. Oder nimm ein TImage, das macht im Prinzip genau das
unter der Oberfläche.
--
Peter Below
Hans-Peter Diettrich
2014-06-05 21:25:02 UTC
Permalink
Post by Peter
Zeichne auf eine TBitmap und zeige die im OnPaint-Event der paintbox
auf selbiger an. Oder nimm ein TImage, das macht im Prinzip genau das
unter der Oberfläche.
Danke, jetzt funktioniert's, mit einem TImage :-)

Eigentlich hatte ich von TPaintBox erwaret was TImage implementiert...

DoDi
Peter
2014-06-06 06:02:22 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Peter
Zeichne auf eine TBitmap und zeige die im OnPaint-Event der paintbox
auf selbiger an. Oder nimm ein TImage, das macht im Prinzip genau
das unter der Oberfläche.
Danke, jetzt funktioniert's, mit einem TImage :-)
Eigentlich hatte ich von TPaintBox erwaret was TImage implementiert...
Tja, das Leben ist halt voll von unerfüllten Erwartungen ;-)...
--
Peter Below
Hans-Peter Diettrich
2014-06-06 09:31:47 UTC
Permalink
Post by Peter
Post by Hans-Peter Diettrich
Post by Peter
Zeichne auf eine TBitmap und zeige die im OnPaint-Event der paintbox
auf selbiger an. Oder nimm ein TImage, das macht im Prinzip genau
das unter der Oberfläche.
Danke, jetzt funktioniert's, mit einem TImage :-)
Eigentlich hatte ich von TPaintBox erwaret was TImage implementiert...
Tja, das Leben ist halt voll von unerfüllten Erwartungen ;-)...
Ooch, wenn ich in dieser Gruppe eine Frage stelle, dann bekomme ich
eigentlich immer eine passende Antwort, meistens von Dir :-)

Und wenn wir schon dabei sind:

Wie (womit) würdest Du ein scrollbares (ggf. skalierbares) Diagramm
implementieren? Nach einem ersten Blick auf meine Daten sind schon die
vorgegebenen Punkte so viele, daß auch bei Fullscreen kaum mehr Platz
für Verbindungslinien (Splines) frei bleibt, ich muß also auch
Ausschnitte anzeigen können.

Irgendwie beschleicht mich da der Verdacht, daß eine vollständige Bitmap
in einer ScrollBox zu groß werden könnte. Andererseits erfordert die
Darstellung eines Spline eine gewisse Rechenzeit, da wäre ein Puffer
doch ganz nett. Oder ein (skalierbarer) Metafile, oder JPEG?

Gibt es zu diesen Themen (XE) Samples, die ich mir mal anschauen könnte?


Ansonsten wünsche ich allen schöne Pfingsten, das Wetter scheint dieses
Jahr ja besonders gut zu werden. Da sehne ich mich nach meiner Zeit als
(Alt-)Pfadfinder zurück, zu unseren Pfingstlagern mit Lagerfeuer und
viel Bier, und einem extra Kochzelt nebst zugehörigen Köchinnen...

DoDi
Alfred Gemsa
2014-06-06 11:24:28 UTC
Permalink
Post by Hans-Peter Diettrich
Ooch, wenn ich in dieser Gruppe eine Frage stelle, dann bekomme ich
eigentlich immer eine passende Antwort, meistens von Dir :-)
Wie (womit) würdest Du ein scrollbares (ggf. skalierbares) Diagramm
implementieren? Nach einem ersten Blick auf meine Daten sind schon die
vorgegebenen Punkte so viele, daß auch bei Fullscreen kaum mehr Platz
für Verbindungslinien (Splines) frei bleibt, ich muß also auch
Ausschnitte anzeigen können.
Irgendwie beschleicht mich da der Verdacht, daß eine vollständige Bitmap
in einer ScrollBox zu groß werden könnte. Andererseits erfordert die
Darstellung eines Spline eine gewisse Rechenzeit, da wäre ein Puffer
doch ganz nett. Oder ein (skalierbarer) Metafile, oder JPEG?
Ich versuche mal, mich zu äußern, auch wenn ich nicht Peter bin.

Wenn ich dich richtig verstehe, bereitest du deine Grafik in einer
Bitmap auf und zeichest diese im OnPaint-Event der Paintbox, also irgenwie:

Paintbox.Draw(x,y, Bitmap); // Die Bitmap auf Position x,y der Paintbox
abbilden)

oder:

Du kopierst über BitBlt die Bitmap in die Paintbox.

Skaliertes Darstellen der Bitmap geht über

StretchBltT(<many parameters>)

Über die Abbildungsparameter (x/y der Bitmap auf 0/0 der Paintbox
abbilden, gewünschte Breite/Höhe der Bitmap auf Breite Höhe der Paintbox
anpassen) kriegst du eigentlich jeden Ausschnitt der Bitmap auf die
Fläche der Paintbox abgebidet.

HTH, Alfred.
Hans-Peter Diettrich
2014-06-06 13:10:31 UTC
Permalink
Post by Alfred Gemsa
Post by Hans-Peter Diettrich
Ooch, wenn ich in dieser Gruppe eine Frage stelle, dann bekomme ich
eigentlich immer eine passende Antwort, meistens von Dir :-)
Wie (womit) würdest Du ein scrollbares (ggf. skalierbares) Diagramm
implementieren? Nach einem ersten Blick auf meine Daten sind schon die
vorgegebenen Punkte so viele, daß auch bei Fullscreen kaum mehr Platz
für Verbindungslinien (Splines) frei bleibt, ich muß also auch
Ausschnitte anzeigen können.
Irgendwie beschleicht mich da der Verdacht, daß eine vollständige Bitmap
in einer ScrollBox zu groß werden könnte. Andererseits erfordert die
Darstellung eines Spline eine gewisse Rechenzeit, da wäre ein Puffer
doch ganz nett. Oder ein (skalierbarer) Metafile, oder JPEG?
Ich versuche mal, mich zu äußern, auch wenn ich nicht Peter bin.
Aber gerne :-)
Post by Alfred Gemsa
Wenn ich dich richtig verstehe, bereitest du deine Grafik in einer
Ich benutze ein TImage, das erzeugt die Bitmap bei Bedarf automatisch.
Alle Ausgaben in MyImage.Canvas landen dann in der Bitmap.
Post by Alfred Gemsa
Skaliertes Darstellen der Bitmap geht über
StretchBltT(<many parameters>)
Das würde nur funktionieren, wenn die Bitmap das Bild in hoher Auflösung
enthält, sonst werden nur Pixels zu Klötzchen aufgeblasen. Und genau da
kommen mir Bedenken, was die Größe einer solchen Bitmap betrifft. Bei
(derzeit, Beispieldaten) 1000 Punkten können das 10000*10000 Pixel oder
noch mehr werden! Eigentlich wäre eine Vektordarstellung besser geeignet
als eine Bitmap, aber gibt's dafür schon fertige Komponenten? Ein
Mittelweg wäre ein Metafile, das probiere ich vielleicht auch noch.

Ich denke jetzt über eine Ausschnittsvergrößerung mit 2 Parametern
(SpinEdit...) nach, einen für den Startpunkt und einen für die Anzahl
der anzuzeigenden Knoten und dazwischenliegenden Spline-Segmenten. Das
wird noch richtig tricky, weil für die Darstellung 2 parametrierte
Splines für X und Y notwendig werden, Z (Höhe) lasse ich mal weg. Und
das noch für interpolierende bzw. approximierende Splines, mit
einstellbarer Approximation. So weit bin ich noch garnicht, aber das ist
der Teil der (selbst gestellten) Aufgabe, der mich überhaupt erst zur
Ausgabe von Diagrammen gebracht hat.

Wenn's funktioniert, könnte mit dem Programm ein in GPS-Koordinaten
aufgezeichneter Weg rekonstruiert werden. Dann sollte noch eine Karte
druntergelegt werden, damit sich die Zuverlässigkeit der Rekonstruktion
beurteilen läßt - das war der eigentliche Aufhänger für dieses Programm,
der Vergleich von Tacho- und GPS-Streckenangaben. Hoffentlich kommt da
was Besseres heraus als bei meinem letzten Versuch (vor 25 Jahren) mit
einem Kreisel - da befand sich das Auto nach einer Runde auf dem Skidpad
20 Meter unter dem Boden, fast auf dem Dach liegend. Nach Wochen hat
sich dann herausgestellt, daß der gelieferte Kreisel für so eine
Anwendung garnicht gedacht war, und die gemessenen Werte schlicht
unbrauchbar waren :-(

DoDi
M. Behrendt
2014-06-06 19:50:05 UTC
Permalink
... Bei
(derzeit, Beispieldaten) 1000 Punkten kï¿oennen das 10000*10000 Pixel oder
noch mehr werden! Eigentlich wï¿oere eine Vektordarstellung besser geeignet
als eine Bitmap, aber gibt's dafï¿oer schon fertige Komponenten? Ein ...
wenn ich als fachkundiger Laie mal was dazu beitragen darf
bei den Bildgrößen und den Mengen an darzustellenden Werten wirds doch sicher irgendwann eng mit der Darstellungs-Geschwindigkeit

wie wärs denn mit OpenGL in 2D? Die Punkte als Vertices speichern und dann den gewünschten Ausschnitt darstellen, alles Vektorgrafik und recht fix, skalierbar, verschiebbar, drehbar, usw.

auf DelphiGL.com gibts passende Delphi-header und ein passendes 2D-Tutorial
http://wiki.delphigl.com/index.php/Tutorial_2D

ich benutze dies selbst in einer meiner "sinnvollen" Anwendungungen, jedoch hier aus Geschwindigkeitsgründen, zeichne aber das Diagramm zur Zeitreihe noch auf ein zusätzliches Timage (siehe geposteter Code in einer früheren Antwort), da diese weder umfangreich ist noch sehr schnell sein muss
Hans-Peter Diettrich
2014-06-06 20:45:08 UTC
Permalink
... Bei
(derzeit, Beispieldaten) 1000 Punkten kï¿oennen das 10000*10000 Pixel oder
noch mehr werden! Eigentlich wï¿oere eine Vektordarstellung besser geeignet
als eine Bitmap, aber gibt's dafï¿oer schon fertige Komponenten?
Ein ....
wenn ich als fachkundiger Laie mal was dazu beitragen darf bei den
Bildgrößen und den Mengen an darzustellenden Werten wirds doch sicher
irgendwann eng mit der Darstellungs-Geschwindigkeit
Nicht unbedingt. Wenn die Abstände der Punkte klein werden, bei der
Darstellung aller Punkte ca. 1-2 Pixel, dann fällt für die Berechnung
der Verbindunslinien kaum Rechenzeit an. Wenn man hineinzoomt, dann
werden zwar die darzustellenden Kurvenstücke länger, doch nimmt deren
Anzahl entsprechend ab. Deshalb sollte so eine Darstellung den
Clipping-Bereich berücksichtigen, und Rechnungen für alle Linien und
Punkte überspringen, die gerade sowieso nicht sichtbar sind.
wie wärs denn mit OpenGL in 2D? Die Punkte als Vertices speichern und
dann den gewünschten Ausschnitt darstellen, alles Vektorgrafik und
recht fix, skalierbar, verschiebbar, drehbar, usw.
auf DelphiGL.com gibts passende Delphi-header und ein passendes
2D-Tutorial http://wiki.delphigl.com/index.php/Tutorial_2D
Danke, werde ich mir mal ansehen :-)

Es sieht allerding für meine Zwecke nach overkill aus, da ich ja nur 1-2
Kurven darstellen möchte, ohne überlappende Objekte, Texturen etc.

DoDi
M. Behrendt
2014-06-06 21:51:17 UTC
Permalink
Es sieht allerding f�r meine Zwecke nach overkill aus, da ich ja nur 1-2
Kurven darstellen m�chte, ohne �berlappende Objekte, Texturen etc.
wenn man das vorhandene Projekt aus dem Tutorial nimmt und sich die Routinen anpasst ist das einfach einzubauen
(das hab sogar ich geschafft, also muss das einfach sein)

ich arbeite auch ohne diesen ganzen Graphik-Zusatzkrams, ich brauche nur die sehr schnelle Darstellung/Zeichnung von sehr vielen Punkten, und da ist OpenGL um Lääängen schneller als das Setzen von Punkten auf den Canvas

Skalierungen und Verschiebungen müssten ebenfalls in null,nix gezeichnet werden
Peter
2014-06-06 17:06:22 UTC
Permalink
Post by Hans-Peter Diettrich
Wie (womit) würdest Du ein scrollbares (ggf. skalierbares) Diagramm
implementieren? Nach einem ersten Blick auf meine Daten sind schon
die vorgegebenen Punkte so viele, daß auch bei Fullscreen kaum mehr
Platz für Verbindungslinien (Splines) frei bleibt, ich muß also auch
Ausschnitte anzeigen können.
Irgendwie beschleicht mich da der Verdacht, daß eine vollständige
Bitmap in einer ScrollBox zu groß werden könnte.
Die Befürchtung ist durchaus berechtigt. Windows garantiert nur das man
eine Bitmap in der Größe des Bildschirms anlegen kann. Für größere ist
man der Gnade des Videotreibers ausgeliefert, aber die meisten gängigen
Grafikkarten können schon größere Bitmaps anlegen. Aber das ist
eigentlich nicht nötig, jedenfalls nicht, wenn die Konstruktion der
Grafik nicht sehr zeitaufwendig ist.
Post by Hans-Peter Diettrich
Gibt es zu diesen Themen (XE) Samples, die ich mir mal anschauen könnte?
Kann so spontan keine nennen.

Ich würde die Grafik in einem Metafile generieren, das auf den
MM_HIMETRICS or MM_TWIPS mapping mode konfiguriert ist. Man kann dann
einen Ausschnitt auf einem anderen Canvas anzeigen in dem man die
Koordinaten für den Ursprung und den Skalierungsfaktor für StretchDraw
entsprechend manipuliert.

Leider bietet Delphi für etwas anspruchsvollere Grafiken keinen so
guten Support. Du solltest dich mal mit dem Windows GDI direkt
beschäftigen, besonders mit mapping modes oder world coordinate
transforms. Für die meisten GDI-Funktionen kann man einfach ein
Canvas.Handle als HDC übergeben. Sie Dir mal die Dokumentation für
Funktionen wie SetmapMode und SetWorldtransform an. Damit kann man sich
ein auf die jeweilige Problemstellung angepasstes Koordinatensystem für
eine Canvas definieren und dann ohne mühsame Umrechnungen von
Koordinaten zeichnen.

Metafiles sind die beste Annäherung an Vektorgrafiken die Windows nativ
bietet. Ein Metafile ist quasi eine "Aufnahme" der Zeichenoperationen,
die man auf dem Metafilecanvas durchführt. Wenn man das Metafile auf
einem anderen Canvas zeichnet werden einfach die gespeicherten
GDI-Operationen auf diesem Canvas ausgeführt. Was dabei etwas
verwirrend ist ist aber die Abhängigkeit des Ergebnisses von dem
Koordinatensystem bei der "Aufnahme" und dem Koordinatensystem des
Ziel-Canvas.
--
Peter Below
Carsten Thumulla
2014-06-06 17:19:07 UTC
Permalink
Post by Peter
Post by Hans-Peter Diettrich
Irgendwie beschleicht mich da der Verdacht, daß eine vollständige
Bitmap in einer ScrollBox zu groß werden könnte.
Die Befürchtung ist durchaus berechtigt. Windows garantiert nur das man
eine Bitmap in der Größe des Bildschirms anlegen kann. Für größere ist
man der Gnade des Videotreibers ausgeliefert, aber die meisten gängigen
Grafikkarten können schon größere Bitmaps anlegen. Aber das ist
eigentlich nicht nötig, jedenfalls nicht, wenn die Konstruktion der
Grafik nicht sehr zeitaufwendig ist.
Böse!

Kann man das nicht testen? Anlegeversuch mit Fehlerabfang ergibt die
Größe der möglichen Bitmap.


ct
Hans-Peter Diettrich
2014-06-06 20:59:46 UTC
Permalink
Post by Peter
Ich würde die Grafik in einem Metafile generieren, das auf den
MM_HIMETRICS or MM_TWIPS mapping mode konfiguriert ist. Man kann dann
einen Ausschnitt auf einem anderen Canvas anzeigen in dem man die
Koordinaten für den Ursprung und den Skalierungsfaktor für StretchDraw
entsprechend manipuliert.
Danke für die Tips :-)
Post by Peter
Leider bietet Delphi für etwas anspruchsvollere Grafiken keinen so
guten Support. Du solltest dich mal mit dem Windows GDI direkt
beschäftigen, besonders mit mapping modes oder world coordinate
transforms. Für die meisten GDI-Funktionen kann man einfach ein
Canvas.Handle als HDC übergeben. Sie Dir mal die Dokumentation für
Funktionen wie SetmapMode und SetWorldtransform an. Damit kann man sich
ein auf die jeweilige Problemstellung angepasstes Koordinatensystem für
eine Canvas definieren und dann ohne mühsame Umrechnungen von
Koordinaten zeichnen.
Mit GDI habe ich mich beim Einstieg in Win3.0 näher befaßt, und erst
neulich eine Druckausgabe von Formularen mit entsprechender Umskalierung
auf die Druckerauflösung ausprobiert. Das Ergebnis entsprach leider
nicht den Erwartungen, da AFAIR eingebettete Grafiken (Bitmaps?)
unskaliert blieben, und auch der Umbruch von multi-line Controls (mit
WordWrap) nicht immer zu den Druckerfonts gepaßt hat. Bei meiner
jetzigen Anwendung gibt es zum Glück keine derartigen Stolpersteine.

Momentan kratze ich noch an der Oberfläche, d.h. wie ich Ausgaben
überhaupt mit Delphi Komponenten zustande bekomme. Dabei fällt mir ein,
daß die Splines ja für jede Auflösung neu dargestellt werden müssen,
entsprechend der Länge der Kurven in Pixeln. Das spricht dann doch sehr
gegen Metafiles mit festem (vorberechnetem) Inhalt.
Post by Peter
Metafiles sind die beste Annäherung an Vektorgrafiken die Windows nativ
bietet. Ein Metafile ist quasi eine "Aufnahme" der Zeichenoperationen,
die man auf dem Metafilecanvas durchführt. Wenn man das Metafile auf
einem anderen Canvas zeichnet werden einfach die gespeicherten
GDI-Operationen auf diesem Canvas ausgeführt. Was dabei etwas
verwirrend ist ist aber die Abhängigkeit des Ergebnisses von dem
Koordinatensystem bei der "Aufnahme" und dem Koordinatensystem des
Ziel-Canvas.
Ah ja, wenn die Ausgabe dann kopfüber erscheint, hat man irgendwas
falsch gemacht ;-)

DoDi
Peter
2014-06-07 14:09:33 UTC
Permalink
Post by Hans-Peter Diettrich
Momentan kratze ich noch an der Oberfläche, d.h. wie ich Ausgaben
überhaupt mit Delphi Komponenten zustande bekomme. Dabei fällt mir
ein, daß die Splines ja für jede Auflösung neu dargestellt werden
müssen, entsprechend der Länge der Kurven in Pixeln. Das spricht dann
doch sehr gegen Metafiles mit festem (vorberechnetem) Inhalt.
Deshalb sollte man ja ein geeignetes Koordinatensystem für die
Erzeugung der Grafik wählen und die Umskalierung bei der Anzeige der
Grafik dem GDI überlassen.
--
Peter Below
Hans-Peter Diettrich
2014-06-07 18:25:34 UTC
Permalink
Post by Peter
Post by Hans-Peter Diettrich
Momentan kratze ich noch an der Oberfläche, d.h. wie ich Ausgaben
überhaupt mit Delphi Komponenten zustande bekomme. Dabei fällt mir
ein, daß die Splines ja für jede Auflösung neu dargestellt werden
müssen, entsprechend der Länge der Kurven in Pixeln. Das spricht dann
doch sehr gegen Metafiles mit festem (vorberechnetem) Inhalt.
Deshalb sollte man ja ein geeignetes Koordinatensystem für die
Erzeugung der Grafik wählen und die Umskalierung bei der Anzeige der
Grafik dem GDI überlassen.
Wie kann ich dann feststellen, welche Punkte der Kurve für die Ausgabe
zu berechnen sind?

Bei einem parametrierten Spline gibt es ja zwei Funktionen für die X und
Y Werte der Kurve, z.B. fx(t) und fy(t). Wie soll da die Schrittweite
für t ermittelt werden, die alle Pixel zwischen t0 und t1 erwischt?

Wenn die *Pixelkoordinaten* der Punkte p0 und p1 bekannt sind, und der
Verlauf der Kurve dazwischen monoton ist, dann kann die Verbindungslinie
maximal dx+dy Pixel haben, entlang des Randes des Rechtecks zwischen den
Punkten. Dann liegt man mit dt=(t1-t0)/(dx+dy) auf der sicheren Seite,
d.h. die gezeichnete Linie enthält keine Lücken. Beim Runden der
Funktionswerte fx(t) und fy(t) können dann noch Artefakte entstehen, die
zu Verdickungen der Linie führen, wenn z.B. zwischen den Pixeln (x,y)
und (x+1,y+1) noch ein Punkt berechnet wird, der dann zu (x,y+1) oder
(x+1,y) gerundet werden könnte, was zu einer Treppenkurve führt, die
fast doppelt so breit ist wie sie eigentlich sein sollte.

Ohne Pixelkoordinaten fällt mir nichts Entsprechendes ein.

DoDi
Peter
2014-06-08 09:49:31 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Peter
Post by Hans-Peter Diettrich
Momentan kratze ich noch an der Oberfläche, d.h. wie ich Ausgaben
überhaupt mit Delphi Komponenten zustande bekomme. Dabei fällt mir
ein, daß die Splines ja für jede Auflösung neu dargestellt werden
müssen, entsprechend der Länge der Kurven in Pixeln. Das spricht
dann doch sehr gegen Metafiles mit festem (vorberechnetem) Inhalt.
Deshalb sollte man ja ein geeignetes Koordinatensystem für die
Erzeugung der Grafik wählen und die Umskalierung bei der Anzeige der
Grafik dem GDI überlassen.
Wie kann ich dann feststellen, welche Punkte der Kurve für die
Ausgabe zu berechnen sind?
Das sollst Du doch garnicht selbst machen. Der Punkt bei der Verwendung
einer Grafiklibrary wie dem Windows GDI ist doch, das man Funktionen
wie PolyBezier oder PolyLine verwendet, die die Berechnung der
einzelnen Pixel auf dem Ausgabecanvas übernehmen wenn man sie mit ein
paar Stützpunkten füttert.
--
Peter Below
Hans-Peter Diettrich
2014-06-08 14:18:18 UTC
Permalink
Post by Peter
Post by Hans-Peter Diettrich
Wie kann ich dann feststellen, welche Punkte der Kurve für die
Ausgabe zu berechnen sind?
Das sollst Du doch garnicht selbst machen. Der Punkt bei der Verwendung
einer Grafiklibrary wie dem Windows GDI ist doch, das man Funktionen
wie PolyBezier oder PolyLine verwendet, die die Berechnung der
einzelnen Pixel auf dem Ausgabecanvas übernehmen wenn man sie mit ein
paar Stützpunkten füttert.
Leider konnte mir bislang noch niemand zeigen, wie ich einen Spline in
PolyBezier o.ä. umformen kann. Oder kennst Du eine GDI-Funktion für die
Ausgabe von kubischen Polynomen?

DoDi
Peter
2014-06-09 08:29:32 UTC
Permalink
Post by Hans-Peter Diettrich
Post by Peter
Post by Hans-Peter Diettrich
Wie kann ich dann feststellen, welche Punkte der Kurve für die
Ausgabe zu berechnen sind?
Das sollst Du doch garnicht selbst machen. Der Punkt bei der
Verwendung einer Grafiklibrary wie dem Windows GDI ist doch, das
man Funktionen wie PolyBezier oder PolyLine verwendet, die die
Berechnung der einzelnen Pixel auf dem Ausgabecanvas übernehmen
wenn man sie mit ein paar Stützpunkten füttert.
Leider konnte mir bislang noch niemand zeigen, wie ich einen Spline
in PolyBezier o.ä. umformen kann. Oder kennst Du eine GDI-Funktion
für die Ausgabe von kubischen Polynomen?
Mit sowas habe ich mich bisher nie rumschlagen müssen, sorry-
--
Peter Below
Lesen Sie weiter auf narkive:
Loading...