Gast freescale Geschrieben 30. Mai 2006 Geschrieben 30. Mai 2006 (bearbeitet) 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 2012 von Klotzkopp Vom Autor gemeldet - Links entfernt Zitieren
Kaeyu Geschrieben 30. Mai 2006 Geschrieben 30. Mai 2006 >.< 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 Zitieren
Gast freescale Geschrieben 30. Mai 2006 Geschrieben 30. Mai 2006 @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; Zitieren
Kaeyu Geschrieben 31. Mai 2006 Geschrieben 31. Mai 2006 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... Zitieren
kingofbrain Geschrieben 31. Mai 2006 Geschrieben 31. Mai 2006 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 Zitieren
Gast freescale Geschrieben 31. Mai 2006 Geschrieben 31. Mai 2006 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... Zitieren
Empfohlene Beiträge
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.