Zum Inhalt springen

Problem | Java-Klasse zeichnet falsch


Gast freescale

Empfohlene Beiträge

Gast freescale

Hallo zusammen,

ich habe ein kleines (bildlich gesehen...) Problem bei einer Java-Klasse von mir...

...vielleicht hat ja jemand von euch eine Idee wo mein Problem liegt.

Und zwar habe ich eine Methode, welche mir aus vorgegebenen Werten anhand vorher festgelegter Parameter ein x/y-Chart zeichnet und diese Werte hierauf anzeigt.

Das ganze schaut dann so aus:

Mein Problem dabei ist, dass irgendwie die Werte anscheinend nicht richtig skaliert werden,

... auf etwa der Hälfte fehlt 1 Pixel,

und beim Maximalwert (x/180) ist der Punkt bereits 2 Pixel unter der Soll-Stelle.

Vergrößert:

Ich suche jetzt schon bestimmt 2 Stunden daran,

aber habe einfach keine Ideen mehr woran es liegen könnte. :-(

Gezeichnet werden die Chart-Werte in folgendem Code-Teil:

for(int i = 0; i < valueDataCount; i++)

{


positionCurrentYInChart = (int)Math.round((dataValues[i] - chartMinimum) * valueDataScaleFaktor);


positionCurrentX = positionLastX + 30;

positionCurrentY = valueDataBottom - positionCurrentYInChart ;


graphics2D.setColor(valueDataColor);


if(i > 0)

graphics2D.drawLine(positionLastX, positionLastY, positionCurrentX, positionCurrentY);


positionLastX = positionCurrentX;

positionLastY = positionCurrentY;


}

...eigentlich recht überschaubar, ... aber ich blick's nicht mehr. :-(

Falls es hilft, hier auch der komplette (Test-)Code:

Wäre echt super wenn einer von euch 'ne Idee hat wie ich das ändern kann.

Liebe Grüße,

Denis

Bearbeitet von Klotzkopp
Vom Autor gemeldet - Links entfernt
Link zu diesem Kommentar
Auf anderen Seiten teilen

>.< ich hab das falsche kopiert... ok ich versuchs nochmal...

int innerBorderWidth = 400;

int innerBorderHeight = 200;

int innerBorderLeft = 80;

int innerBorderTop = 20;

hoffe das ist es^^''

dein max Y wert ist 200.. (im diagramm) nicht 180..deswegen ist die linie etwas drunter.

mfg

Kaeyu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast freescale

@Kaeyu

War es leider nicht, das war aber auch ein Bug den ich mir für später aufgeschoben hatte.

Trotzdem aber Danke :)

Hab es jetzt aber gelöst,

Problem waren zwei Rundungsfehler, welche jeweils für einen Pixel verantwortlich waren :rolleyes: :rolleyes: :rolleyes:

Wen es interessiert,

hier der korrigierte Bereich:

int innerLineHorizontalSteps	  = [b](int)Math.ceil((float)[/b]chartRangeSize / chartStepSize[b])[/b];

int innerLineHorizontalStepHeight = [b](int)Math.floor((float)[/b]innerBorderHeight / innerLineHorizontalSteps[b])[/b]; 


[...]


[b]float[/b] valueDataScaleFaktor        = [b](float)[/b]innerLineHorizontalStepHeight / chartStepSize;

Link zu diesem Kommentar
Auf anderen Seiten teilen

sry das mein vorschlag nichts gebracht hat :(

ich bin halt noch ein neuling...

aber deine lösung dafür...das hat ich auch als aller erstes im blickfeld.

ich war mir aber nicht sicher ob: (int)Math.round(()); wirklich rundet oder nicht, da ich den befehl nicht kenne :(

naja^^

btw.:

ist es überhaupt möglich alle programmierbefehle im kopf zu behalten o,O?

und ich mein wirklich ALLE...

Link zu diesem Kommentar
Auf anderen Seiten teilen

btw.:

ist es überhaupt möglich alle programmierbefehle im kopf zu behalten o,O?

und ich mein wirklich ALLE...

Wie soll das gehen? Du schreibst eine neue Klasse, also hast Du noch ein paar mehr "Programmierbefehle". Die wirklichen Spracheigenschaften, die kann man gut im Kopf behalten (if, while, public class XY, usw.). Für den Rest gibt es die API-Doc.

Übrigens gibts die auch zu jedem ernst zu nehmenden Projekt, das man als Bibliothek einbinden möchte. Das ist die Referenz, die dem Entwickler zeigt, welche Klasse wie zu benutzen ist.

Was Du eigentlich meintest: man kann irgendwann den Teil der Standard-API, den man täglich / oft braucht. Den Rest hat man ja in der Referenz. Oder die IDE seiner Wahl liefert einem die benötigten Informationen zur Entwicklungszeit.

Peter

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast freescale
sry das mein vorschlag nichts gebracht hat :(

ich bin halt noch ein neuling...

Macht doch gar nichts. :)

Ja, .. Math.round rundet schon,

aber das Problem war - was ich bis dato noch nicht wusste:

Wenn ich zwei Integer dividiere, macht Java *immer* eine Ganzzahl-Division (also Division ohne Rest).

Um das zu verhindern musste ich also erst einen Teil des Bruches in eine Fließkomma-Zahl (float) umwandeln.

Danach klappt auch das runden...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...