Plan de coordonnées rotatif pour les données et le texte en Java
Ce numéro traite des défis liés au traçage de points de données et à la rotation des étiquettes sur l'axe y d'un tracé de données. Le code fourni définit les structures de base pour tracer les données et les étiquettes, mais il rencontre deux difficultés :
Résolution du problème Problèmes
Pour résoudre ces problèmes, concentrons-nous sur les modifications suivantes :
1. Rotation du plan de coordonnées
Nous pouvons faire pivoter le plan de coordonnées pour l'aligner sur la nouvelle origine (coin inférieur gauche du rectangle bleu) et inverser l'axe y en utilisant le code suivant :
<code class="java">g2d.translate(leftStartPlotWindow, blueTop);//translate origin to bottom-left corner of blue rectangle g2d.scale(1, -1);//invert the y-axis</code>
2. Traçage des données
Nous ajustons les données pour qu'elles s'adaptent au plan de coordonnées pivoté en les multipliant par un scalaire :
<code class="java">double Scalar = blueWidth/maxPlot; ArrayList<Double> scaledDiffs = new ArrayList<>(); for(int e = 0;e<myDiffs.size();e++){scaledDiffs.add(myDiffs.get(e)*Scalar);}</code>
3. Rotation du texte pour les étiquettes de l'axe Y
Pour faire pivoter les étiquettes sur l'axe Y, nous utilisons le code suivant :
<code class="java">g2d.rotate(Math.toRadians(-90), 0, 0);//rotate text 90 degrees counter-clockwise g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight); g2d.rotate(Math.toRadians(+90), 0, 0);//rotate text 90 degrees clockwise</code>
Code complet
Le code modifié avec ces ajustements devrait résoudre le problème problèmes :
DataGUI.java
<code class="java">//... Previous code omitted for brevity import java.awt.geom.AffineTransform; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; class DataGUI extends JFrame{ //... Previous code omitted for brevity @Override public void paint(Graphics g) { // ... Previous code omitted for brevity int height = getHeight(); int width = getWidth(); ins = getInsets(); // Obtain data about graphics environment and text Graphics2D g2d = (Graphics2D) g; FontMetrics fontMetrics = g2d.getFontMetrics(); String xString = "x-axis Label"; int xStrWidth = fontMetrics.stringWidth(xString); int xStrHeight = fontMetrics.getHeight(); // Set parameters for the inner rectangle int hPad = 10; int vPad = 6; int testLeftStartPlotWindow = ins.left + 5 + (3 * yStrHeight); int testInnerWidth = width - testLeftStartPlotWindow - ins.right - hPad; // Find minimum and maximum values getMaxMinDiffs(); getMaxPlotVal(); // Determine the maximum number of ticks for the axes double increment = 5.0; int numTicks = (int) (maxPlot / increment); int remainder = testInnerWidth % numTicks; int leftStartPlotWindow = testLeftStartPlotWindow - remainder; // Calculate the bottom padding and blue rectangle dimensions int bottomPad = (3 * xStrHeight) - vPad; int blueTop = ins.bottom + (vPad / 2) + titleStrHeight; int blueHeight = height - bottomPad - blueTop; int blueWidth = blueHeight; int blueBottom = blueHeight + blueTop; // Start drawing // ... Previous code omitted for brevity // Scale the diffs to fit the window double Scalar = blueWidth / maxPlot; List<Double> scaledDiffs = new ArrayList<>(); for (Double myDiff : myDiffs) { scaledDiffs.add(myDiff * Scalar); } // Rotate the graphics context for plotting data AffineTransform at = g2d.getTransform(); g2d.translate(leftStartPlotWindow, blueTop); g2d.scale(1, -1); // Plot the scaled diffs for (int w = 0; w < scaledDiffs.size(); w++) { if (w > 0) { double prior = scaledDiffs.get(w - 1); int priorInt = (int) prior; double current = scaledDiffs.get(w); int currentInt = (int) current; g2d.drawOval(priorInt, currentInt, 4, 4); } } // Restore the transform for conventional rendering g2d.setTransform(at); // ... Rest of the code omitted for brevity } // ... Previous code omitted for brevity }</code>
DataPanel.java
<code class="java">//... Previous code omitted for brevity @Override protected void paintComponent(Graphics g) { //... Previous code omitted for brevity int blueTop = ins.bottom+(vPad/2)+titleStrHeight; int blueHeight = height-bottomPad-blueTop; int blueWidth = blueHeight; int blueBottom = blueHeight+blueTop; //... Previous code omitted for brevity // Rotate the graphics context for y-axis labels g2d.rotate(Math.toRadians(-90), 0, 0); g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight); // Restore the graphics context for normal rendering g2d.rotate(Math.toRadians(+90), 0, 0); //... Previous code omitted for brevity }</code>
Ressource supplémentaire
Pour plus d'informations sur les transformations graphiques, reportez-vous à :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!