Funktionsplotter

Status
Nicht offen für weitere Antworten.

calzone

Mitglied
Hallo
ich bin grad dran einen Plotter zu schreiben der beliebige Funktionen zeichnet! Doch irgendwie zeichnet der mir nur Mist!

Hier ist der Link zum Beispielcoding:
http://liebezeit.biz/klick.txt


ich hoffe mir kann jemand helfen!

Vielen Dank!

grüße
 

0x7F800000

Top Contributor
Joah. Garbage in Garbage out nennt sich das.
Zwei extrem gruselige Sachen, die sofort auffallen:
Code:
class Panel
...
-40
Panel extends JPanel? Einen nichtssagenderen Bezeichner hättest du dir nicht ausdenken können.
"-40" ist ein magic number mitten im code. Das ist sehr Suspekt. Außer 0,1,2,PI und e kommen nämlich sogut wie keine Zahlen in freier Wildbahn vor, da muss einfach irgendwas schieflaufen, das ist vorprogrammiert.

Aber irgendwie verstehe ich nicht ganz, was du hier jetzt für rückmeldungen erwartest: die Fehlermeldung ist sehr unprezise, im code sind nur 5 nutzlose Kommentare eingestreut... Soll sich jetzt jeder selbst erfinden, wo da da was machen wolltest? :confused:
Poste doch wenigstens mal einen screenshot oder sowas, was soll ich mir unter "mist" vorstellen?
 

calzone

Mitglied
das mit -40 usw... ist klar, kein guter Stil! sollte auch nur n Beispiel sein! (-40 deswegen, damit ich einen x-Wertebereich von -40 -> +40 erreiche!)

Das wird gezeichnet!!
http://www.liebezeit.biz/Unbenannt.jpg



Wesentliche Punkte:


>>Funktion wird gezeichnet:

for(int i = 1; i < xi.length; i++){
g.drawLine(xi[i-1],yi[i-1],xi,yi);}


>>Transformation der Werte (Berechnung der Werte für den Inhaltsbereich)

(dimx = Auflösung x, dimy = Auflösung y, Auflösung jeweils vom Inhaltsbereich in dem gezeichnet werden soll!)
x-Wert = (x - xmin)/(xmax - xmin) * this.dimx

y-Wert = 1 - (y - ymin)/(ymax - ymin)) * this.dimy


usw.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die Ausgabe kommt mir recht bekannt vor, deine Auflösung ist nunmal nicht besonders hoch,
du hast nur 80 Punkte, auf 900 Pixel Breite passen doch genau 900 Punkte..,
das sorgt schon für die unschönen Sinus-Kurven,

wenn du überhaupt weniger Kurven haben willst und nicht so steile Anstiege,
dann musst du andere Wertebereiche verwenden und die Grafik nicht so hochschrauben

double[] ax = new double[500];
double[] ay = new double[500];

ay = Math.sin(ax*0.02);

dimx = 500;
dimy = 100;

schon sieht das alles ganz anders aus
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
Das ist doch kein Mist. Auch wenn der Stil nicht allzu schön ist: da ist kein fehler drin, und da kommt auch was recht schönes raus. Wie der Slater gesagt hat: auflösung ist halt ein wenig zu grob. Ich bin durch herumprobieren zum Schluss gekommen, dass es am besten ist nicht mal in 1 pixel schritten zu gehen (was auf den ersten Blick das hochauflösendste wäre) sondern gleich 4 auswertungen pro pixel zu machen. Das hat den Sinn, dass dann auch sehr stark oszillierende "fast flächenfüllende" Funktionen wie sin(1/x) einigermaßen korrekt dargestellt werden (ansonsten kriegt man überall hässliche Lücken rein).
Bei 2D frisst es ja auch (bei einfachen Funktionen) wenig performance und ist wegen O(n) sowieso irgendwie total egal, es geht immer auf Klick. Bei 3D-Plots, da muss man sich schon was einfallen lassen, aber das ist eine ganz andere Geschichte...

=> Schraub die Auflösung hoch und gut ist.

Achso, und außerdem: wozu wird das alles zwischengespeichert? Wie gesagt, wenn die Auswertung an sich nicht aufwendig ist, bzw wenn keine diskrete Daten, sondern echte Funktionsvorschriften vorliegen, dann kannst du doch direkt beim zeichnen auswerten, brauchst das alles nicht erst in Arrays zu packen. Wobei das mit Arrays für diskrete daten "wiederverwendbarer" ist. Naja, kommt drauf an was man will.
 
Zuletzt bearbeitet von einem Moderator:

calzone

Mitglied
super hätte ich auch selber draufkommen können ;) :( danke!

nein das mit den Arrays usw.. das coding hab ich sozusagen aus ner kleinen Matheapplikation rausgeschnitten die ich gerade schreibe deswegen der bissl komische Aufbau!
 

0x7F800000

Top Contributor
jaja, diese kleinen mathe-applikationen^^ wachsen dauernd und wachsen und wachsen ohne ende, und das ganze sieht total matschig aus, und scheind dauernd auseinanderzufalen, aber irgendwie findet sich dauernd irgendwas wiederverwertbares :)
 

0x7F800000

Top Contributor
Bei solchen Sachen ist das Plotten an sich eher vernachlässigbar. Das Parsen der Formeln macht schon wesentlich mehr Stress. Diesen hier habe ich einfach "intuitiv" ohne jegliche kenntnisse vom "Compilerbau" hingefummelt, und ich wüsste da auch keinen Rezept... Wie man einen etwas einfacheren Parser baut, steht in der FAQ:
http://java-forum.org.server659-han.de-nserver.de/showthread.php?t=12306
für den Anfang wohl ganz gut, auf jeden fall besser, als wenn ich hier jetzt unter zeitdruck anfange irgendwas herumzuerzählen. Ansonsten: dicke Bücher über Compilerbau lesen und alles selbst zusammenfrickeln, oder gleich mit schweren Geschützen wie
http://www.antlr.org/
rumballern (das ist wohl wesentlich effizenter, für mich persönlich aber dennoch weniger befriedigend, da ich keinen Schimmer ahnung habe, wie das teil funzt)
 

calzone

Mitglied
ja das mit dem einlesen der Funktion wäre der nächste schritt gewesen! (soweit ich dich richtig verstanden hab) doch anfangs gehts mir eher um den plotter der die funktionen so sauber zeichnen kann! (wie deiner oder der vom weblink!)

--> Bei deinem Plotter bekommt man ja schon angst ;) hehe nicht schlecht!!!

scheint aber solangsam richtig kompliziert zu werden ;)
 

0x7F800000

Top Contributor
@Wildcard:
Ja, natürlich. Die muss man aber lesen. Und dazu brauch ich schon wieder zeit. Also, das mit dem Drachenbuch habe ich mir schon zwei mal vorgenommen. :D Kannst du mir vielleicht verraten, woher dieses Gemisch aus Erleichterung und Beschämtheit kommt, wenn ich immer wieder feststelle, dass es in der Bibliothek nicht verfügbar ist? ;)

Ne, ich les es irgendwann definitiv durch. Aber ich nehm's mir nicht wieder für diese Ferien vor, das ist nicht realistisch. Ich kann mich schon seit einem halben Jahr nicht mehr zusammenreißen, um den Chomsky-Normalform-Transformator in Prolog fertigzuschreiben^^ Hab mir auch sonst schon imho genug vorgenommen für die Ferien, daher lass ich das lieber mit den unerfüllbaren guten Vorsätzen.

@OP:
wie gesagt: auflösung hochschrauben, und schon sieht's alles glatt aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben