Veröffentlicht 30. Mai 200619 j 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 7. September 201213 j von Klotzkopp Vom Autor gemeldet - Links entfernt
30. Mai 200619 j >.< 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
30. Mai 200619 j @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: 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;
31. Mai 200619 j 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...
31. Mai 200619 j 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
31. Mai 200619 j 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...
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.