Seite 1 von 3

3DPlot bzw 3DChart

Verfasst: 11.03.2007 21:20
von Skiller
Hallo Pbfans,

wieder mal lange Pause gehabt und meine Programme mit einigen Schwierigkeiten von Pb-3.94 auf Pb-4.02 kovbertiert.
Here we go!

Ich brauche 3D-Charts bzw. 3D-Plots. Es gibt gute Matheprogramme z. B. MathCad, SciLab, Mathmatica o. Mathlab etc. in denen solche 3D-teile implementiert sind aber... Auch Progamme habe ich nicht gefunden -ausser BorisRed -, fiel aber wegen performance durch. Habe nach Stichwort in allen PB-Foren erfolglos gesucht.

Hat jemand mal sowas geproggt o. vielleicht ein Beispiel?

ich brauch Darstellungen mit enorm vielen stat. Daten. Mind. so an die x1000 X y1000.
Bei diesen Darstellungen ist fast immer dasselbe Problem:
1. Der Aufbau - gerade beim Balkendiagramm - ist sehr langsam.( man muss dem natürlich die Datenmenge zugutehalten )
2. Rotationen sind nur mit Hilfe einer vor einer Neudarstellung verwendeten 3D-Gerüstmatrix mögich = 'Doof'
3. Dynamische Charts, also zusätzliche Werteveränderungen während der Darstellung sind nicht möglich = 'auch Doof'

Frage 1. Ich vermute, diese sind Vektororientiert programmiert. Also ohne echte 3D-Engine DirectX bzw. OpenGl. Wenn also Vektor: Kann sich jemand vorstelen, das sowas in PB weitaus schneller realisierbar wäre? ich denke zwar, dass die auch nicht blöd sind, aber in vielem ist Pb ausserst schnell!!

Frage 2. Was ist die schnellste Pixeldarstellung?
1. Plot(x, y [, Farbe])
2. Mit Zeigern
3. Mit Inline ASM
Ich Schätze mal das Speedranking auf 3,2,1 richtig?

Frage 3. Kann so ein Chart bzw. 3Dplot mit dieser grossen Datenmenge auch mit echten 3D-Objekten also z. B. Würfeln, dargestellt werden o. wird der Speicher gesprengt, da jeder Wert/Punkt ja nun durch ein Objekt dargestellt wird?

- Wie lange würde der Aufbau dauern?
- gäbe es "ruckelfreie" Rotationen ?
- geschweige denn dynamische Werteveränderungen?

Hat jemand Erfahrungen bzw. kann sich jemand so was vorstellen bzw. abschätzen.?
Ich würde das gerne progen aber es muss auch top-funzen.
Bitte helft mir bei der Risikoabschätzung!!

Danke!!! Skiller

Verfasst: 11.03.2007 23:53
von Kaeru Gaman
hm.. plotting wäre schon ziemlich schnell.. wie soll es denn überhaupt aussehen?
mit ner 3D-engine könntest du's auch machen, wäre auch ziemlich schnell.

eigentlich sind 1000x1000 werte geradezu lachhaft.
ich frag mich, was deine profi-programme noch alles abwickeln müssen, dass es so langsam wird.

in welcher form liegen denn deine grunddaten überhaupt vor,
könntest du die in ein statisches array laden?

und was soll die oberfläche alles leisten...
ne komplette tabellenkalkulation drunter, oder einfach nurn paar knöppe um die werte zu manipulieren?

Verfasst: 12.03.2007 15:10
von Skiller
Hallo Kaeru,

danke erstmal dass du eingestiegen bist.

A) was verstehst Du unter "plotting".PB-Befehlsvorrat oder Programmiertechnik?

A1) Welche 3D-Engine? Von PB? o. eigene Proggen? PB müsste dafür eigentlich reichen oder?

B) "ziemlich schnell" - das ist es ja gerade!!!, das reicht nicht.

c) "lachhaft" Finde ich ja auch. Deshalb verstehe ich ja nicht, wo das Problem liegen könnte dass die das nicht schneller hinbekommen. Ich glaube nicht, das die keine Ahnung haben, aber.... Das u. a. Beispiel dauert durchschn. bei versch. Prog. zwischen 1 u. 3 Sek. Viel zu lange, wenn ich zur Laufzeit auch noch daten nachladen möchte.

d) "Grunddaten" Excel o. Textdatei sind möglich.

e) "statistisches Array" Ist das ein besonderes PB-Array oder was? Ich nehme an, ein zweidim. Array. Besser ist: Daten einlesen u. direkt verarbeiten. Array kann man natürl. verwenden.

f) "oberfläche" Wie ich schon sagte:
Rotieren, Zoomen u. dynamische Werteänderungen ohne!!! Neuaufbau des Charts. d.h. zur Laufzeit neue Datei laden u. Chart wie im Film ausgeben lassen einschl. zoomen etc.

Beispiel:
http://www.screen-card.de/sonstiges/Pic.gif

Wie gesagt, jeder Balken wäre ein eigenes Objekt. In diesem Beispiel
sind es noch nicht mal 1000x1000. Das wäre sonst die Mindesgrösse, aber
dann würde man die Balken nicht mehr erkennen.


Ich hoffe das is klarer...

Skiller

Verfasst: 12.03.2007 15:27
von Kaeru Gaman
A) unter "plotten" in diesem zusammenhang verstehe ich zeichnen auf den screen mittels Plot, Line, Box, etc.
das könnte aber eventuell deinen darstellungswünschen nicht genügen...

A1) kommt drauf an. mit der OGRE die in PB drin ist müsste sich schon einiges machen lassen.

d) da wäre es besser, einen filter zwischen zu schalten, der ein Array erzeugt.

e) nein, "statistisches Array" ist ein stinknormales Array dessen größe sich nicht zur Laufzeit ändert.
sorry für die verwirrung.

> Daten einlesen u. direkt verarbeiten.
genau das ist der Haken, wo es zu lange dauert.
wenn du die daten zum zeichen aus einer komplexen struktur wie einer excel-tabelle holen willst,
musst du so viel zeit haben, wie deine progs brauchen.
bei denen kommt wahrscheinlich noch dazu, dass sie auf datenverwaltung optimiert sind,
aber nicht auf realtime-darstellung. im grunde musst du dich entscheiden, worauf es dir ankommt.

wenn du dir nen filter bastelst, der dir aus ner excel-tabelle ein array macht,
oder eben aus einer textdatei, dann hast du ne chance.

zur realtime-darstellung ist es unumgänglich,
die daten in einer form vorliegen zu haben,
die einen blitzschnellen zugriff ermöglicht.

so eine darstellung, wie in deinem beispiel, halt mit 1000x1000 werten,
ist überhaupt kein thema superschnell du drehen und schwenken,
wenn du die daten in einem Array, in einem Speicherbuffer
oder sonsteiner form vorliegen hast, die einem Höhenfeld entspricht und schnell zugreifbar ist.

wenn du hingegen für jeden wert einen langsamen Excel-Funktionsaufruf tätigen musst, hast du schon verloren.

Verfasst: 12.03.2007 21:29
von Skiller
Hallo Kaeru, ich halte mal fest.

1.) Ich nehme also eine echte!!! 3D-engine; sprich keine pseudo-vektororientierte 3D die eigentlich 2D ist, weil diese durchaus in der Lage ist die Datenmengen zu verkraften. Ok?

2.) Wenn dem so ist, bastel ich mir einen Ogre-Würfel und lade den mit Loadmesh ein.
a) Kann ich auch mit Createmesh einen Würfel zaubern?
b) Wäre zwischen den beiden ein Speedunterschied o. ist das egal?
Mach Copymesh z. B. 1000x1000 u. verändere bei jedem die Grössenwerte. Ok?

3.) "wenn du die daten in einem Array, in einem Speicherbuffer oder sonsteiner form vorliegen hast, die einem Höhenfeld entspricht und schnell zugreifbar ist."

Wie meinst Du das? Oder anders gefragt welches ist der schnellste Weg? Will nämlich Optimierungen zwecks Aufwandes möglichst gleich vermeiden!

a) Zeiger ? wenn ja, wie? vielleicht kleines Beispiel!!
b) Array?
b) oder Strukturen wie:

Structure MyPoint
x.l
y.l
EndStructure

Structure MyColoredPoint Extends MyPoint
color.l
EndStructure

ColoredPoint.MyColoredPoint\x = 10
ColoredPoint.MyColoredPoint\y = 20
ColoredPoint.MyColoredPoint\color = RGB(255, 0, 0)

Gibts da irgendein Ranking?

wäre cool, wenn du mir das noch aufdröseln könntest, damit ich loslegen kann.
Danke!!! Skiller :praise:

Verfasst: 12.03.2007 22:06
von Kaeru Gaman
1+2
ich kenn die OGRE-engine nicht wirklich.
hab mal fix in die help geschaut, also, sieht so aus als ob du entities draus machen müßtest, um es skalieren zu können.
das könnte wieder etwas langsamer werden.

eine andere (theoretische) möglichkeit wäre, die werte als höhenwerte für ne art terrain zu verwenden...
aber die handelsüblichen engines können nur 256x256x256 terrains darstellen...

3)
> welches ist der schnellste Weg?

in welcher hinsicht der schnellste?

der weg des geringen widerstandes wäre ein direktes auslesen aus einem wie-auch-immer gearteten datenformat.
das wäre aber auch gleichzeitig die inperformanteste bei der darstellung.

das beste wäre, wenn du deine grundwerte in ein einfaches array schreibst.
die x und y werte in einer struktur abzuspeichern ist unnötig,
die bestimmst du durch den array index.

Code: Alles auswählen

Dim Array(1000,1000)
For x=0 To 999
  For y=0 To 999
    Array(x,y) = Random(255)
  Next
Next
das würde ein 1000x1000 mit zufälligen höhenwerten erzeugen.
anstatt jetzt zufallswerte rein zu schreiben, nimmst du die werte die du aus deiner vorlage hast.

Verfasst: 13.03.2007 02:33
von PureLust
Hi Skiller, ...

ich kenne die Ogre-Engine zwar auch noch nicht aus der angewanten Praxis, aber wenn Du 1000 x 1000 Würfel darstellen möchtest so wären das mal eben 12.000.000 (in Worten 12 Mio.) Dreieckspolygone.
Das dürfte auch für eine noch so schnelle Engine oder sagen wir lieber auch für eine schnelle Grafikkarte kein "Klacks" sein.
Bei solch hohen Polygonwerten dürfte die Darstellungsgeschwindigkeit maßgeblich von der Geschwindigkeit der verwendeten Grafikkarte abhängen.

Um die Geschwindigkeit zu erhöhen solltest Du über eine Reduzierung der darzustellenden Werte (sprich, Polygone) nachdenken.
Eine Reduzierung könntest Du z.B. durch Auswahl eines kleineren, darzustellenden Bereiches (also eines Ausschnitts) oder auch durch reduzierung der Auflösung Deines Plots erreichen. Soll heissen: Statt 1000 x 1000 Werten stellst Du die Werte nur mit einer Auflösung von 100 x 100 Balken dar - wobei dann jeweils ein Balken den Mittelwert von 10 x 10 Werten darstellt.

Verfasst: 13.03.2007 13:30
von Skiller
Das war´s dann wohl :freak:

Danke Kaeru, aber das ist Anfängerlatein. Aber Array geht schon mal vor Struktur. Hat mir schon mal weitergeholfen. Dank Purelust wissen wir jetzt, warum es nicht "lachhaft" ist. So viele Polygone... das macht Sinn!
Tja Purelust, darum ging´s ja gerade. Nicht 10x10 sondern richtig. Da müsste ich mich dann schon an ein vernünftiges Ergebnis rantasten.
Grenzbereichserfahrungen mit so vielen Polygonen gibt´s scheinbar noch nicht. Vielleicht war das ´ne Nummer zu gross, aber deshalb ja der Thread.
Dennoch schade dass mir keiner sagen kann, wie ich einen banalen Würfel hinbekommen kann. Muss mal wieder das Board durchwühlen. Sorry, aber ich bin seit ca. 1.5 jahren raus aus PB. Ich dachte dass wäre Standard.
Welche Engine würdet Ihr denn dann nehmen wenn nicht Ogre?
- Irrlicht ?

Wie auch immer, ich versuch´s mal mit meinen beschränkten Möglichkeiten und berichte euch.

Danke Euch
Skiller

Verfasst: 13.03.2007 13:51
von Fluid Byte
Dennoch schade dass mir keiner sagen kann, wie ich einen banalen Würfel hinbekommen kann.
Nicht so wehleidig bitte! :roll:

Kuggst du hier:

http://purearea.net/pb/german/index.htm

und vorallem hier:

http://www.purebasic.fr/german/viewtopic.php?t=3025

Verfasst: 13.03.2007 14:43
von PureLust
Ich hab' gerade nochmal einen kleinen SpeedTest mit 3DSprites gemacht, da dies wohl der schnellste Weg sein dürfte ein Balkendiagramm dieser Art auf den Bildschirm zu zaubern.
Also bei meiner GForce-6800-Go komme ich auf knapp 520.000 Sprites/Sekunde bei einer Spritegröße von 4x30 Pixeln.

Wenn man jetzt einfach mal vorraussetzt dass dies in etwa der Mittelwert der darzustellenden Balkengröße wäre, so würde der Refresh also knapp 2 Sekunden dauern.
Du bräuchtest also schon eine Grafikkarte vom Type 8800-GTS oder X19x0-XTX um eine halbwegs flüssige Resreshrate von 0.5 Sekunden zu erreichen - von den Neuberechnungen für die veränderten Werte mal ganz abgesehen.

Aber mal im Ernst: Bei einer Balkenbreite von 4 Pixeln und einer Balkenhöhe von nur 2 Pixeln würdest Du immer noch eine Auflösung von ca. 4000 x 2100 Pixeln brauchen um den ganzen Bereich darzustellen. Wer arbeitet schon bei einer solchen Auflösung ?!? :?

Vielleicht solltest Du doch nochmal die Darstellung eines Teilbereiches in Betracht ziehen, den Der Benutzer dann ja in alle Richtungen scrollen kann.
Bei einer Auflösung von 1280x1024 wären dann also in etwa 160.000 Werte abbildbar, was wiederum entsprechend schnell refreshbar wäre.