TChart: Dreidimensionale Diagramme?

Rund um die LCL und andere Komponenten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

TChart: Dreidimensionale Diagramme?

Beitrag von Timm Thaler »

Ich hab a) noch nicht viel mit TChart gemacht und b) finde auch gerade nichts dazu. Vielleicht suche ich auch an der falschen Stelle.

Kann man in TChart dreidimensionale Diagramme erstellen? Ich brauche quasi "Punktwolken" in X-Y-Z. Es soll eine Visualisierung dieser Art werden: https://de.wikipedia.org/wiki/Spektraltest

Aktuell lese ich die erzeugten Daten in Gnuplot ein, aber es wäre schön, die gleich im Programm darstellen zu können.

Alternativ male ich die auch selbst auf ein Image, aber ich dachte vielleicht kann TChart das ja schon.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Im Falle, wen du es selbst machen musst, kann ich die OpenGL empfehlen, dann musst du dich schon mal nicht um den Z-Puffer kümmern.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart: Dreidimensionale Diagramme?

Beitrag von wp_xyz »

Allgemeines zu TAChart: Ich kopiere nur den folgenden Link herein, in dem du zu Links zu weiteren Artikeln findest: http://wiki.lazarus.freepascal.org/TAChart

Zum Thema 3D: Nein, TAChart kann kein echtes 3D, höchstens TColorMapSeries mit entsprechend dem z-Wert colorierten Punkten, und ein pseudo-3D mit in die Tiefe extrudierten Strukturen der Standard-Plots. Ersteres läuft gut (siehe das entsprechende Tutorial im obigen Link), letzteres möchte ich eigentlich aber niemandem empfehlen und trifft auf deine Frage ohnehin nicht zu.

Ich würde an deiner Stelle bei gnuplot bleiben, aber das Programm in einem eigenen Prozess starten und damit den Plot erzeugen und in eine temporäre Datei schreiben lassen. Diese würde ich in ein TImage einlesen und so im eigenen Programm anzeigen. Siehe auch viewtopic.php?f=11&t=7139 und angehängtes lauffähiges Mini-Projekt.
Dateianhänge
gnuplotter3D.zip
(6.96 KiB) 66-mal heruntergeladen
Zuletzt geändert von wp_xyz am Fr 24. Aug 2018, 00:31, insgesamt 1-mal geändert.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Allgemeines zu TAChart: Ich kopiere nur den folgenden Link herein, in dem du zu Links zu weiteren Artikeln findest: posting.php?mode=reply&f=18&t=11741
Etwas ist mit dem Link faul, er hat die gleiche Funktion, wie wen ich auf Antworten klicke.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart: Dreidimensionale Diagramme?

Beitrag von wp_xyz »

Behoben

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Ich würde an deiner Stelle bei gnuplot bleiben,
Ich habe das Programm gerade ausprobiert, das sieht mehr als nur nach einem Plotter aus.
Dies ist ja schon fast wie Mathematica, welches ich mal vor 20Jahren probiert hatte.

So nebenbei kann man es unter Linux sehr bequem mit

Code: Alles auswählen

suda apt-get install gnuplot
installieren.
Aber das Demo von wpx habe ich nicht zum laufen gebraucht, irgendwie Windowslastig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart: Dreidimensionale Diagramme?

Beitrag von wp_xyz »

Ich habe jetzt auf die Schnelle nichts gesehen, was Windows voraussetzen würde. Hast du den Pfad zu gnuplot angepasst? (Zur Vereinfachung in GnuPlotSettings für mein System hart-kodiert, unit gpMain).

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Ich habe jetzt auf die Schnelle nichts gesehen, was Windows voraussetzen würde. Hast du den Pfad zu gnuplot angepasst?

Habe ich:

Code: Alles auswählen

    PathToExe: '/usr/bin/gnuplot'// path to gnuplot.exe


wird dann aber bei "Execute" mit RunError 232 quttiert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart: Dreidimensionale Diagramme?

Beitrag von wp_xyz »

Mathias hat geschrieben:
Ich habe jetzt auf die Schnelle nichts gesehen, was Windows voraussetzen würde. Hast du den Pfad zu gnuplot angepasst?

Habe ich:

Code: Alles auswählen

    PathToExe: '/usr/bin/gnuplot'// path to gnuplot.exe

wird dann aber bei "Execute" mit RunError 232 quttiert.

Achso - der übliche Unix-Threads-Fehler: in der Projekt-Datei (.lpr) das {$IFDEF UseCThreads} herauslöschen oder ein Define {$DEFINE UseCThreads} setzen.

Code: Alles auswählen

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, gpMain
  { you can add units after this };
 

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Timm Thaler »

Macht mal keinen Stress, ich male das jetzt selbst auf ein TImage, nachdem ich endlich Canvas.Pixels gefunden habe geht das auch ganz nett.

Erste Erkenntnis: LFSR sind sowas von mies...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Canvas.Pixels ist etwa das gemühtlichste was es an Grafikausgabe gibt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Timm Thaler »

Mathias hat geschrieben:Canvas.Pixels ist etwa das gemühtlichste was es an Grafikausgabe gibt.


Das ist in dem Fall egal. Der AVR liefert Zufallswerte per Uart, die dann auf Histogramm und Spektraltest untersucht werden. Da ist der Flaschenhals nicht die Grafikausgabe.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Der AVR liefert Zufallswerte per Uart,

Bist du gerade an einem optimierten Zufallsgenerator für den AVR entwickeln ?

Was machst du mit dem Z-Wert ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart: Dreidimensionale Diagramme?

Beitrag von wp_xyz »

Kann aber noch kommen. Bei den Zufallszahlen des randu-Generators, den du eingangs zitiert hast, sind ja die Zufallszahlen in Ebenen angeorndet. Nur sieht man diese bei einem beliebigen Betrachtungswinkel nicht. Daher erscheint es mir wichtig, dann man den Blickpunkt auf die Punktwolke interaktiv verändern kann. Und da geht dem LCL-Canvas mit Pixels[] schnell die Luft aus (meine statische gnuplot-Anwendung versagt da natürlich völlig), während das für OpenGL kein Problem darstellt.

Im Anhang findest du ein kleines OpenGL-Programm, das jeweils drei randu-Zufallszahlen als Pixel in den OpenGL-3D-Raum zeichnet. Das wird für 10.000 Zufallspunkte gemacht. Mit Hilfe einer Camara-Routine, die Mathias hier einmal gepostet hat, kann man mit der rechten Maustaste das Bild rotieren (mit der linken verschieben und mit dem Mausrad zoomen). Anfänglich sieht man nur eine beliebige Punktwolke, aber wenn man die Maus mit gedrückter rechtet Taste ein bisschen nach unten verschiebt, wird die Schichtung der Werte sehr deutlich.

Programmiertechnisch passiert die Datenerzeugung - also der Teil, der dich direkt betrifft - in dieser kleinen Routine (im OnPaint-Ereignis des TOpenGLControl)

Code: Alles auswählen

  for i := 0 to N do begin
    x := randu;   // Zufallszahl mit der "randu"-Funktion erzeugen (http://physics.ucsc.edu/~peter/115/randu.pdf)
    y := randu;
    z := randu;
    glBegin(GL_POINTS);
       glColor3f(1,1,1);     // Farbe R=1.0, G=1.0, B=1.0 --> weiß
       glVertex3f(x, y, z)// "PutPixel" sozusagen
    glEnd();
  end;
Dateianhänge
plot_randu.zip
(3.35 KiB) 57-mal heruntergeladen

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TChart: Dreidimensionale Diagramme?

Beitrag von Mathias »

Warnung, das Beispiel von wp_xyz läuft nicht mit Lazarus 1.9 und Linux.
Dank dieses Bugs hier: viewtopic.php?f=18&t=11714&p=104914&hilit=opengl#p104914

Im Anhang findest du ein kleines OpenGL-Programm, das jeweils drei randu-Zufallszahlen als Pixel in den OpenGL-3D-Raum zeichnet. Das wird für 10.000 Zufallspunkte gemacht.
Bei so vielen Punkten würde ich die ganzen Daten direkt in ein Vertexbuffer schreiben, anstelle bei jedem Paint jeden Pixel neu laden.

Programmiertechnisch passiert die Datenerzeugung - also der Teil, der dich direkt betrifft

Der Random ist etwas komisch, siehe Anhang.
Dateianhänge
Bildschirmfoto vom 2018-08-25 17-38-32.png
Bildschirmfoto vom 2018-08-25 17-38-32.png (11.17 KiB) 2311 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten