From 6ed015d1bd8abe5af7dae2820ba4a0816b2ed24f Mon Sep 17 00:00:00 2001 From: Tim Molter <tim.molter@gmail.com> Date: Fri, 26 Apr 2013 23:28:45 +0200 Subject: [PATCH] converting all painting to double precision --- .../xchart/demo/charts/bar/BarChart01.java | 4 +- .../xeiam/xchart/internal/chartpart/Axis.java | 71 ++++++++++--------- .../xchart/internal/chartpart/AxisTick.java | 5 +- .../chartpart/AxisTickCalculator.java | 1 - .../internal/chartpart/AxisTickLabels.java | 4 +- .../internal/chartpart/AxisTickMarks.java | 35 ++++++--- .../xchart/internal/chartpart/AxisTitle.java | 4 +- .../internal/chartpart/ChartPainter.java | 5 +- .../xchart/internal/chartpart/ChartPart.java | 4 +- .../xchart/internal/chartpart/ChartTitle.java | 20 +++--- .../xchart/internal/chartpart/Legend.java | 55 +++++++------- .../xeiam/xchart/internal/chartpart/Plot.java | 5 +- .../internal/chartpart/PlotContent.java | 4 +- .../chartpart/PlotContentBarChart.java | 29 +++++--- .../chartpart/PlotContentLineChart.java | 39 +++++++--- .../internal/chartpart/PlotSurface.java | 40 ++++++----- .../xeiam/xchart/internal/markers/Circle.java | 5 +- .../xchart/internal/markers/Diamond.java | 34 +++------ .../xeiam/xchart/internal/markers/Marker.java | 2 +- .../xeiam/xchart/internal/markers/Square.java | 5 +- .../xchart/internal/markers/TriangleDown.java | 31 +++----- .../xchart/internal/markers/TriangleUp.java | 31 +++----- 22 files changed, 220 insertions(+), 213 deletions(-) diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java index 076fbdf9..8ee0c82c 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java @@ -23,9 +23,9 @@ package com.xeiam.xchart.demo.charts.bar; import com.xeiam.xchart.Chart; import com.xeiam.xchart.ChartBuilder; -import com.xeiam.xchart.SwingWrapper; import com.xeiam.xchart.StyleManager.ChartType; import com.xeiam.xchart.StyleManager.LegendPosition; +import com.xeiam.xchart.SwingWrapper; import com.xeiam.xchart.demo.charts.ExampleChart; /** @@ -51,7 +51,7 @@ public class BarChart01 implements ExampleChart { public Chart getChart() { // Create Chart - Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histgram").xAxisTitle("Score").yAxisTitle("Number").build(); + Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Score").yAxisTitle("Number").build(); chart.addSeries("test 1", new double[] { 0, 1, 2, 3, 4 }, new double[] { 4, 5, 9, 6, 5 }); // Customize Chart diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java index 4d156ed8..39fd0e0d 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java @@ -56,10 +56,10 @@ public class Axis implements ChartPart { private BigDecimal max = null; /** the bounds */ - private Rectangle bounds; + private Rectangle2D bounds; /** the paint zone */ - private Rectangle paintZone; + private Rectangle2D paintZone; /** An axis direction */ public enum Direction { @@ -113,7 +113,7 @@ public class Axis implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } @@ -121,7 +121,7 @@ public class Axis implements ChartPart { /** * @return */ - protected int getSizeHint() { + protected double getSizeHint() { if (direction == Direction.X) { // X-Axis @@ -140,7 +140,7 @@ public class Axis implements ChartPart { Rectangle2D rectangle = textLayout.getBounds(); axisTickLabelsHeight = rectangle.getHeight() + getChartPainter().getStyleManager().getAxisTickPadding() + getChartPainter().getStyleManager().getAxisTickMarkLength(); } - return (int) (titleHeight + axisTickLabelsHeight); + return titleHeight + axisTickLabelsHeight; } else { // Y-Axis return 0; // We layout the yAxis first depending in the xAxis height hint. We don't care about the yAxis height hint } @@ -162,13 +162,14 @@ public class Axis implements ChartPart { // | // | // ---- - int xOffset = getChartPainter().getStyleManager().getChartPadding(); - int yOffset = getChartPainter().getChartTitle().getSizeHint(); - int width = 80; // arbitrary, final width depends on Axis tick labels + double xOffset = getChartPainter().getStyleManager().getChartPadding(); + double yOffset = getChartPainter().getChartTitle().getSizeHint(); + double width = 80; // arbitrary, final width depends on Axis tick labels - int height = getChartPainter().getHeight() - yOffset - axisPair.getxAxis().getSizeHint() - getChartPainter().getStyleManager().getPlotPadding() + double height = getChartPainter().getHeight() - yOffset - axisPair.getxAxis().getSizeHint() - getChartPainter().getStyleManager().getPlotPadding() - getChartPainter().getStyleManager().getChartPadding(); - Rectangle yAxisRectangle = new Rectangle(xOffset, yOffset, width, height); + Rectangle2D yAxisRectangle = new Rectangle2D.Double(xOffset, yOffset, width, height); + this.paintZone = yAxisRectangle; // g.setColor(Color.green); // g.draw(yAxisRectangle); @@ -177,11 +178,12 @@ public class Axis implements ChartPart { axisTitle.paint(g); axisTick.paint(g); - xOffset = (int) paintZone.getX(); - yOffset = (int) paintZone.getY(); - width = (int) (getChartPainter().getStyleManager().isYAxisTitleVisible() ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth(); - height = (int) paintZone.getHeight(); - bounds = new Rectangle(xOffset, yOffset, width, height); + xOffset = paintZone.getX(); + yOffset = paintZone.getY(); + width = (getChartPainter().getStyleManager().isYAxisTitleVisible() ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth(); + height = paintZone.getHeight(); + bounds = new Rectangle2D.Double(xOffset, yOffset, width, height); + // g.setColor(Color.yellow); // g.draw(bounds); @@ -190,34 +192,36 @@ public class Axis implements ChartPart { // calculate paint zone // |____________________| - int xOffset = (int) (axisPair.getyAxis().getBounds().getWidth() + (getChartPainter().getStyleManager().isYAxisTicksVisible() ? getChartPainter().getStyleManager().getPlotPadding() : 0) + getChartPainter() + double xOffset = (int) (axisPair.getyAxis().getBounds().getWidth() + (getChartPainter().getStyleManager().isYAxisTicksVisible() ? getChartPainter().getStyleManager().getPlotPadding() : 0) + getChartPainter() .getStyleManager().getChartPadding()); - int yOffset = (int) (axisPair.getyAxis().getBounds().getY() + axisPair.getyAxis().getBounds().getHeight() + getChartPainter().getStyleManager().getPlotPadding()); + double yOffset = (int) (axisPair.getyAxis().getBounds().getY() + axisPair.getyAxis().getBounds().getHeight() + getChartPainter().getStyleManager().getPlotPadding()); double chartLegendWidth = 0; if (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE) { chartLegendWidth = getChartPainter().getChartLegend().getSizeHint()[0]; } - int width = (int) ( + double width = getChartPainter().getWidth() - - axisPair.getyAxis().getBounds().getWidth() + - axisPair.getyAxis().getBounds().getWidth() + + - chartLegendWidth - - chartLegendWidth + - 2 + * getChartPainter().getStyleManager().getChartPadding() - - 2 * getChartPainter().getStyleManager().getChartPadding() + - (getChartPainter().getStyleManager().isYAxisTicksVisible() ? (getChartPainter().getStyleManager().getPlotPadding() + 1) : 0) - - (getChartPainter().getStyleManager().isYAxisTicksVisible() ? (getChartPainter().getStyleManager().getPlotPadding() + 1) : 0) + - (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE && getChartPainter().getStyleManager().isLegendVisible() ? getChartPainter().getStyleManager() + .getChartPadding() : 0) - - (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE && getChartPainter().getStyleManager().isLegendVisible() ? getChartPainter().getStyleManager() - .getChartPadding() : 0) + ; - ); + double height = this.getSizeHint(); + Rectangle2D xAxisRectangle = new Rectangle2D.Double(xOffset, yOffset, width, height); - int height = this.getSizeHint(); - Rectangle xAxisRectangle = new Rectangle(xOffset, yOffset, width, height); this.paintZone = xAxisRectangle; // g.setColor(Color.green); // g.draw(xAxisRectangle); @@ -225,12 +229,11 @@ public class Axis implements ChartPart { axisTitle.paint(g); axisTick.paint(g); - xOffset = (int) paintZone.getX(); - yOffset = (int) paintZone.getY(); - width = (int) paintZone.getWidth(); - height = (int) ((getChartPainter().getStyleManager().isXAxisTitleVisible() ? axisTitle.getBounds().getHeight() : 0) + (int) axisTick.getBounds().getHeight()); - bounds = new Rectangle(xOffset, yOffset, width, height); - bounds = new Rectangle(xOffset, yOffset, width, height); + xOffset = paintZone.getX(); + yOffset = paintZone.getY(); + width = paintZone.getWidth(); + height = (getChartPainter().getStyleManager().isXAxisTitleVisible() ? axisTitle.getBounds().getHeight() : 0) + (int) axisTick.getBounds().getHeight(); + bounds = new Rectangle2D.Double(xOffset, yOffset, width, height); // g.setColor(Color.yellow); // g.draw(bounds); } @@ -270,7 +273,7 @@ public class Axis implements ChartPart { return direction; } - protected Rectangle getPaintZone() { + protected Rectangle2D getPaintZone() { return paintZone; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java index 9cb22fdc..86174fa9 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java @@ -17,6 +17,7 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.util.List; import com.xeiam.xchart.StyleManager.ChartType; @@ -37,7 +38,7 @@ public class AxisTick implements ChartPart { private AxisTickMarks axisTickMarks; /** the bounds */ - private Rectangle bounds = new Rectangle();; + private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0); AxisTickCalculator gridStep = null; @@ -54,7 +55,7 @@ public class AxisTick implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java index 507c89ab..82ed5de3 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java @@ -101,7 +101,6 @@ public abstract class AxisTickCalculator { this.axisDirection = axisDirection; this.workingSpace = workingSpace; this.minValue = overrideMinValue; - // this.minValue = new BigDecimal(10000); this.maxValue = overrideMaxValue; this.styleManager = styleManager; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java index 52285376..7c16c821 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java @@ -30,7 +30,7 @@ public class AxisTickLabels implements ChartPart { private final AxisTick axisTick; /** the bounds */ - private Rectangle bounds = new Rectangle(); + private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0); /** * Constructor @@ -43,7 +43,7 @@ public class AxisTickLabels implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java index 488c6316..3b512125 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java @@ -17,9 +17,12 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; /** - * Axis tick marks. + * Axis tick marks. This includes the little tick marks and the line that hugs the plot area. */ public class AxisTickMarks implements ChartPart { @@ -27,7 +30,7 @@ public class AxisTickMarks implements ChartPart { private AxisTick axisTick; /** the bounds */ - private Rectangle bounds = new Rectangle(); + private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0); /** * Constructor @@ -40,7 +43,7 @@ public class AxisTickMarks implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } @@ -65,16 +68,24 @@ public class AxisTickMarks implements ChartPart { // g.setColor(getChart().getStyleManager().getChartBordersColor()); // g.setStroke(stroke); + Shape line = new Line2D.Double(xOffset, yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), + yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation); + g.draw(line); - g.drawLine(xOffset, yOffset + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation), xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset - + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation)); + // g.drawLine(xOffset, yOffset + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation), xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset + // + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation)); } } // Line if (getChartPainter().getStyleManager().isAxisTicksLineVisible()) { - g.drawLine(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset - + (int) axisTick.getAxis().getPaintZone().getHeight()); + + Shape line = new Line2D.Double(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset + + axisTick.getAxis().getPaintZone().getHeight()); + g.draw(line); + + // g.drawLine(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset + // + (int) axisTick.getAxis().getPaintZone().getHeight()); } // bounds @@ -97,15 +108,19 @@ public class AxisTickMarks implements ChartPart { // g.setColor(getChart().getStyleManager().getChartBordersColor()); // g.setStroke(stroke); - - g.drawLine(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength()); + Shape line = new Line2D.Double(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength()); + g.draw(line); + // g.drawLine(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength()); } } // Line if (getChartPainter().getStyleManager().isAxisTicksLineVisible()) { - g.drawLine(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + (int) axisTick.getAxis().getPaintZone().getWidth(), yOffset + Shape line = new Line2D.Double(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + axisTick.getAxis().getPaintZone().getWidth(), yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength()); + g.draw(line); + // g.drawLine(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + (int) axisTick.getAxis().getPaintZone().getWidth(), yOffset + // - getChartPainter().getStyleManager().getAxisTickMarkLength()); } // bounds diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java index 5c6985fb..1af0d40a 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java @@ -34,7 +34,7 @@ public class AxisTitle implements ChartPart { private String text = ""; // default to "" /** the bounds */ - private Rectangle bounds; + private Rectangle2D bounds; /** * Constructor @@ -47,7 +47,7 @@ public class AxisTitle implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java index 3df4ac6b..2090d96a 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java @@ -23,6 +23,8 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.geom.Rectangle2D; import java.math.BigDecimal; import com.xeiam.xchart.StyleManager; @@ -92,7 +94,8 @@ public class ChartPainter { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // global rendering hint g.setColor(styleManager.getChartBackgroundColor()); - g.fillRect(0, 0, width, height); + Shape rect = new Rectangle2D.Double(0, 0, width, height); + g.fill(rect); axisPair.paint(g); plot.paint(g); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java index 934af8e6..78d61a16 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java @@ -16,7 +16,7 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; /** * All components of a chart that need to be painted should implement this interface @@ -25,7 +25,7 @@ import java.awt.Rectangle; */ public interface ChartPart { - public Rectangle getBounds(); + public Rectangle2D getBounds(); public void paint(final Graphics2D g); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java index a840a5bc..ca676d8f 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java @@ -17,7 +17,7 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.BasicStroke; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.Rectangle2D; @@ -30,12 +30,12 @@ public class ChartTitle implements ChartPart { /** parent */ private final ChartPainter chartPainter; - /** the bounds */ - private Rectangle bounds; - /** the title text */ private String text = ""; // default to "" + /** the bounds */ + private Rectangle2D bounds; + /** * Constructor * @@ -102,17 +102,19 @@ public class ChartTitle implements ChartPart { int chartTitleBoxHeight = (int) (rectangle.getHeight() + 2 * chartPainter.getStyleManager().getChartTitlePadding()); g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g.setColor(chartPainter.getStyleManager().getChartTitleBoxBorderColor()); - g.drawRect(xOffset - 1, yOffset, chartTitleBoxWidth, chartTitleBoxHeight); + Shape rect = new Rectangle2D.Double(xOffset, yOffset, chartTitleBoxWidth, chartTitleBoxHeight); g.setColor(chartPainter.getStyleManager().getChartTitleBoxBackgroundColor()); - g.fillRect(xOffset, yOffset + 1, chartTitleBoxWidth - 1, chartTitleBoxHeight - 1); + g.fill(rect); + g.setColor(chartPainter.getStyleManager().getChartTitleBoxBorderColor()); + g.draw(rect); + } // paint title xOffset = (int) (chartPainter.getPlot().getBounds().getX() + (chartPainter.getPlot().getBounds().getWidth() - rectangle.getWidth()) / 2.0); yOffset = (int) (chartPainter.getStyleManager().getChartPadding() - rectangle.getY() + chartPainter.getStyleManager().getChartTitlePadding()); - bounds = new Rectangle(xOffset, yOffset + ((int) rectangle.getY()), (int) rectangle.getWidth(), (int) (rectangle.getHeight())); + bounds = new Rectangle2D.Double(xOffset, yOffset + rectangle.getY(), rectangle.getWidth(), rectangle.getHeight()); // g.setColor(Color.green); // g.draw(bounds); @@ -123,7 +125,7 @@ public class ChartTitle implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return null; // this should never be needed } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java index 847f08f6..b175c603 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java @@ -18,7 +18,6 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.Rectangle; -import java.awt.RenderingHints; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; @@ -42,7 +41,7 @@ public class Legend implements ChartPart { private final ChartPainter chartPainter; /** the bounds */ - private Rectangle bounds; + private Rectangle2D bounds; /** * Constructor @@ -120,48 +119,45 @@ public class Legend implements ChartPart { double legendBoxWidth = getSizeHint()[0]; double legendBoxHeight = getSizeHint()[1]; double maxContentHeight = getSizeHint()[2]; - // System.out.println(legendBoxWidth); - // System.out.println(legendBoxHeight); - // System.out.println(maxContentHeight); // legend draw position - int xOffset = 0; - int yOffset = 0; + double xOffset = 0; + double yOffset = 0; switch (chartPainter.getStyleManager().getLegendPosition()) { case OutsideE: - xOffset = (int) (chartPainter.getWidth() - legendBoxWidth - chartPainter.getStyleManager().getChartPadding()); - yOffset = (int) (chartPainter.getPlot().getBounds().getY() + (chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight) / 2.0); + xOffset = chartPainter.getWidth() - legendBoxWidth - chartPainter.getStyleManager().getChartPadding(); + yOffset = chartPainter.getPlot().getBounds().getY() + (chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight) / 2.0; break; case InsideNW: - xOffset = (int) (chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN); - yOffset = (int) (chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN); + xOffset = chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN; + yOffset = chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN; break; case InsideNE: - xOffset = (int) (chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN); - yOffset = (int) (chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN); + xOffset = chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN; + yOffset = chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN; break; case InsideSE: - xOffset = (int) (chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN); - yOffset = (int) (chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN); + xOffset = chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN; + yOffset = chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN; break; case InsideSW: - xOffset = (int) (chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN); - yOffset = (int) (chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN); + xOffset = chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN; + yOffset = chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN; break; default: break; } g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - Rectangle2D rect = new Rectangle2D.Double(xOffset + 1, yOffset + 1, (int) (legendBoxWidth - 2), (int) (legendBoxHeight - 2)); + Shape rect = new Rectangle2D.Double(xOffset + 1, yOffset + 1, legendBoxWidth - 2, legendBoxHeight - 2); g.setColor(chartPainter.getStyleManager().getLegendBackgroundColor()); g.fill(rect); g.setColor(chartPainter.getStyleManager().getLegendBorderColor()); g.draw(rect); // Draw legend content inside legend box - int startx = xOffset + chartPainter.getStyleManager().getLegendPadding(); - int starty = yOffset + chartPainter.getStyleManager().getLegendPadding(); + double startx = xOffset + chartPainter.getStyleManager().getLegendPadding(); + double starty = yOffset + chartPainter.getStyleManager().getLegendPadding(); for (Integer seriesId : seriesMap.keySet()) { Series series = seriesMap.get(seriesId); @@ -169,12 +165,10 @@ public class Legend implements ChartPart { // paint line if (getChartPainter().getStyleManager().getChartType() != ChartType.Scatter && series.getStroke() != null) { - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g.setColor(series.getStrokeColor()); g.setStroke(series.getStroke()); - Shape line = new Line2D.Double(startx, (int) (starty + maxContentHeight / 2.0), (startx + Marker.SIZE * 3.0), (starty + maxContentHeight / 2.0)); + Shape line = new Line2D.Double(startx, starty + maxContentHeight / 2.0, startx + Marker.SIZE * 3.0, starty + maxContentHeight / 2.0); g.draw(line); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); } // paint marker @@ -186,9 +180,8 @@ public class Legend implements ChartPart { // paint little box if (series.getStroke() != null) { g.setColor(series.getStrokeColor()); - g.fillPolygon(new int[] { startx, startx + BOX_SIZE, startx + BOX_SIZE, startx }, new int[] { starty, starty, starty + BOX_SIZE, starty + BOX_SIZE }, 4); - // g.setStroke(series.getStroke()); - // g.drawPolygon(new int[] { startx, startx + BOX_SIZE, startx + BOX_SIZE, startx }, new int[] { starty, starty, starty + BOX_SIZE, starty + BOX_SIZE }, 4); + Shape rectSmall = new Rectangle2D.Double(startx, starty, BOX_SIZE, BOX_SIZE); + g.fill(rectSmall); } } @@ -197,16 +190,16 @@ public class Legend implements ChartPart { g.setColor(chartPainter.getStyleManager().getChartFontColor()); TextLayout layout = new TextLayout(series.getName(), chartPainter.getStyleManager().getLegendFont(), new FontRenderContext(null, true, false)); if (getChartPainter().getStyleManager().getChartType() != ChartType.Bar) { - layout.draw(g, (float) (startx + Marker.SIZE + (Marker.SIZE * 1.5) + chartPainter.getStyleManager().getLegendPadding()), starty - + (int) ((maxContentHeight - 1 + layout.getBounds().getHeight()) / 2.0)); + layout.draw(g, (float) (startx + Marker.SIZE + (Marker.SIZE * 1.5) + chartPainter.getStyleManager().getLegendPadding()), (float) (starty + (maxContentHeight - 1 + layout.getBounds() + .getHeight()) / 2.0)); } else { - layout.draw(g, startx + BOX_SIZE + chartPainter.getStyleManager().getLegendPadding(), starty + (int) ((maxContentHeight + layout.getBounds().getHeight()) / 2.0)); + layout.draw(g, (float) (startx + BOX_SIZE + chartPainter.getStyleManager().getLegendPadding()), (float) (starty + (maxContentHeight + layout.getBounds().getHeight()) / 2.0)); } starty = (int) (starty + maxContentHeight + chartPainter.getStyleManager().getLegendPadding()); } // bounds - bounds = new Rectangle(xOffset, yOffset, (int) (legendBoxWidth), (int) (legendBoxHeight)); + bounds = new Rectangle2D.Double(xOffset, yOffset, legendBoxWidth, legendBoxHeight); // g.setColor(Color.blue); // g.draw(bounds); } @@ -214,7 +207,7 @@ public class Legend implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java index 32bf69a3..7bd3e766 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java @@ -17,6 +17,7 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import com.xeiam.xchart.StyleManager.ChartType; @@ -29,7 +30,7 @@ public class Plot implements ChartPart { private final ChartPainter chartPainter; /** the bounds */ - private Rectangle bounds; + private Rectangle2D bounds; private PlotSurface plotSurface; @@ -48,7 +49,7 @@ public class Plot implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return bounds; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java index db7a4a8f..23644b9f 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java @@ -16,8 +16,8 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.BasicStroke; -import java.awt.Rectangle; import java.awt.Stroke; +import java.awt.geom.Rectangle2D; /** * @author timmolter @@ -40,7 +40,7 @@ public abstract class PlotContent implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return plot.getBounds(); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java index 26a2d4e0..19daa507 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java @@ -16,7 +16,8 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; import java.math.BigDecimal; import java.util.Collection; import java.util.Iterator; @@ -45,7 +46,7 @@ public class PlotContentBarChart extends PlotContent { @Override public void paint(Graphics2D g) { - Rectangle bounds = plot.getBounds(); + Rectangle2D bounds = plot.getBounds(); // X-Axis int xTickSpace = Utils.getTickSpace((int) bounds.getWidth()); @@ -159,19 +160,27 @@ public class PlotContentBarChart extends PlotContent { break; } - int yTransform = (int) (bounds.getHeight() - (yTopMargin + yTop.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace)); + double yTransform = bounds.getHeight() - (yTopMargin + yTop.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace); - int yOffset = (int) (bounds.getY() + yTransform) + 1; + double yOffset = bounds.getY() + yTransform + 1; - int zeroTransform = (int) (bounds.getHeight() - (yTopMargin + (yBottom.subtract(yMin).doubleValue()) / (yMax.subtract(yMin).doubleValue()) * yTickSpace)); - int zeroOffset = (int) (bounds.getY() + zeroTransform) + 1; + double zeroTransform = bounds.getHeight() - (yTopMargin + (yBottom.subtract(yMin).doubleValue()) / (yMax.subtract(yMin).doubleValue()) * yTickSpace); + double zeroOffset = bounds.getY() + zeroTransform + 1; // paint bar - int barWidth = (int) (gridStep / seriesMap.size() / 1.1); - int barMargin = (int) (gridStep * .05); - int xOffset = (int) (bounds.getX() + xLeftMargin + gridStep * barCounter++ + seriesCounter * barWidth + barMargin); + double barWidth = gridStep / seriesMap.size() / 1.1; + double barMargin = gridStep * .05; + double xOffset = bounds.getX() + xLeftMargin + gridStep * barCounter++ + seriesCounter * barWidth + barMargin; g.setColor(series.getStrokeColor()); - g.fillPolygon(new int[] { xOffset, xOffset + barWidth, xOffset + barWidth, xOffset }, new int[] { yOffset, yOffset, zeroOffset, zeroOffset }, 4); + + Path2D.Double path = new Path2D.Double(); + path.moveTo(xOffset, yOffset); + path.lineTo(xOffset + barWidth, yOffset); + path.lineTo(xOffset + barWidth, zeroOffset); + path.lineTo(xOffset, zeroOffset); + path.closePath(); + g.fill(path); + } else { barCounter++; } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java index 1b81274c..493d3aa4 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java @@ -16,7 +16,10 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.Line2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; import java.math.BigDecimal; import java.util.Collection; import java.util.Date; @@ -46,7 +49,7 @@ public class PlotContentLineChart extends PlotContent { @Override public void paint(Graphics2D g) { - Rectangle bounds = plot.getBounds(); + Rectangle2D bounds = plot.getBounds(); // X-Axis int xTickSpace = Utils.getTickSpace((int) bounds.getWidth()); @@ -95,8 +98,8 @@ public class PlotContentLineChart extends PlotContent { } Collection<Number> errorBars = series.getErrorBars(); - int previousX = Integer.MIN_VALUE; - int previousY = Integer.MIN_VALUE; + double previousX = Integer.MIN_VALUE; + double previousY = Integer.MIN_VALUE; Iterator<?> xItr = xData.iterator(); Iterator<Number> yItr = yData.iterator(); @@ -121,6 +124,8 @@ public class PlotContentLineChart extends PlotContent { Number next = yItr.next(); if (next == null) { + previousX = Integer.MIN_VALUE; + previousY = Integer.MIN_VALUE; continue; } BigDecimal yOrig = new BigDecimal(next.doubleValue()); @@ -151,17 +156,19 @@ public class PlotContentLineChart extends PlotContent { yTransform = (int) (bounds.getHeight() / 2.0); } - int xOffset = (int) (bounds.getX() + xTransform - 1); - int yOffset = (int) (bounds.getY() + yTransform); + double xOffset = bounds.getX() + xTransform - 1; + double yOffset = bounds.getY() + yTransform; // System.out.println(yOffset); // System.out.println(yTransform); // paint line if (series.getStroke() != null && getChartPainter().getStyleManager().getChartType() != ChartType.Scatter) { + if (previousX != Integer.MIN_VALUE && previousY != Integer.MIN_VALUE) { g.setColor(series.getStrokeColor()); g.setStroke(series.getStroke()); - g.drawLine(previousX, previousY, xOffset, yOffset); + Shape line = new Line2D.Double(previousX, previousY, xOffset, yOffset); + g.draw(line); } } @@ -170,7 +177,14 @@ public class PlotContentLineChart extends PlotContent { if (previousX != Integer.MIN_VALUE && previousY != Integer.MIN_VALUE) { g.setColor(series.getStrokeColor()); int yBottomOfArea = (int) (bounds.getY() + bounds.getHeight() - yTopMargin + 1); - g.fillPolygon(new int[] { previousX, xOffset, xOffset, previousX }, new int[] { previousY, yOffset, yBottomOfArea, yBottomOfArea }, 4); + + Path2D.Double path = new Path2D.Double(); + path.moveTo(previousX, previousY); + path.lineTo(xOffset, yOffset); + path.lineTo(xOffset, yBottomOfArea); + path.lineTo(previousX, yBottomOfArea); + path.closePath(); + g.fill(path); } } @@ -210,9 +224,12 @@ public class PlotContentLineChart extends PlotContent { int bottomEBTransform = (int) (bounds.getHeight() - (yTopMargin + bottomValue.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace)); int bottomEBOffset = (int) (bounds.getY() + bottomEBTransform); - g.drawLine(xOffset, topEBOffset, xOffset, bottomEBOffset); - g.drawLine(xOffset - 3, bottomEBOffset, xOffset + 3, bottomEBOffset); - g.drawLine(xOffset - 3, topEBOffset, xOffset + 3, topEBOffset); + Shape line = new Line2D.Double(xOffset, topEBOffset, xOffset, bottomEBOffset); + g.draw(line); + line = new Line2D.Double(xOffset - 3, bottomEBOffset, xOffset + 3, bottomEBOffset); + g.draw(line); + line = new Line2D.Double(xOffset - 3, topEBOffset, xOffset + 3, topEBOffset); + g.draw(line); } } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java index 7e45bf1f..1cde8841 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java @@ -16,7 +16,9 @@ package com.xeiam.xchart.internal.chartpart; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; import java.util.List; import com.xeiam.xchart.StyleManager.ChartType; @@ -40,7 +42,7 @@ public class PlotSurface implements ChartPart { } @Override - public Rectangle getBounds() { + public Rectangle2D getBounds() { return plot.getBounds(); } @@ -48,21 +50,20 @@ public class PlotSurface implements ChartPart { @Override public void paint(Graphics2D g) { - Rectangle bounds = plot.getBounds(); + Rectangle2D bounds = plot.getBounds(); // paint plot background - Rectangle backgroundRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight()); + Shape rect = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight()); g.setColor(getChartPainter().getStyleManager().getPlotBackgroundColor()); - g.fill(backgroundRectangle); + g.fill(rect); // paint plot border if (getChartPainter().getStyleManager().isPlotBorderVisible()) { - Rectangle borderRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight()); g.setColor(getChartPainter().getStyleManager().getPlotBorderColor()); - g.draw(borderRectangle); + g.draw(rect); } - // paint grid lines and/or inner plot tics + // paint grid lines and/or inner plot ticks if (getChartPainter().getStyleManager().isPlotGridLinesVisible() || getChartPainter().getStyleManager().isPlotTicksMarksVisible()) { // horizontal @@ -77,18 +78,18 @@ public class PlotSurface implements ChartPart { g.setColor(getChartPainter().getStyleManager().getPlotGridLinesColor()); g.setStroke(getChartPainter().getStyleManager().getPlotGridLinesStroke()); - // System.out.println("bounds.getY()= " + bounds.getY()); - g.drawLine((int) bounds.getX(), yOffset, (int) (bounds.getX() + bounds.getWidth() - 2), yOffset); + Shape line = new Line2D.Double((int) bounds.getX(), yOffset, bounds.getX() + bounds.getWidth() - 2, yOffset); + g.draw(line); } // tick marks if (getChartPainter().getStyleManager().isPlotTicksMarksVisible()) { g.setColor(getChartPainter().getStyleManager().getAxisTickMarksColor()); g.setStroke(getChartPainter().getStyleManager().getAxisTickMarksStroke()); - - g.drawLine((int) bounds.getX(), yOffset, (int) bounds.getX() + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset); - g.drawLine((int) (bounds.getX() + bounds.getWidth() - 2), yOffset, (int) (bounds.getX() + bounds.getWidth() - 2) - getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset); - + Shape line = new Line2D.Double(bounds.getX(), yOffset, bounds.getX() + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset); + g.draw(line); + line = new Line2D.Double((bounds.getX() + bounds.getWidth() - 2), yOffset, (bounds.getX() + bounds.getWidth() - 2) - getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset); + g.draw(line); } } @@ -107,7 +108,8 @@ public class PlotSurface implements ChartPart { g.setColor(getChartPainter().getStyleManager().getPlotGridLinesColor()); g.setStroke(getChartPainter().getStyleManager().getPlotGridLinesStroke()); - g.drawLine(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1)); + Shape line = new Line2D.Double(xOffset, bounds.getY(), xOffset, bounds.getY() + bounds.getHeight() - 1); + g.draw(line); } // tick marks if (getChartPainter().getStyleManager().isPlotTicksMarksVisible()) { @@ -115,9 +117,11 @@ public class PlotSurface implements ChartPart { g.setColor(getChartPainter().getStyleManager().getAxisTickMarksColor()); g.setStroke(getChartPainter().getStyleManager().getAxisTickMarksStroke()); - g.drawLine(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY()) + getChartPainter().getStyleManager().getAxisTickMarkLength()); - g.drawLine(xOffset, (int) (bounds.getY() + bounds.getHeight() - 1), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1) - getChartPainter().getStyleManager().getAxisTickMarkLength()); - + Shape line = new Line2D.Double(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY()) + getChartPainter().getStyleManager().getAxisTickMarkLength()); + g.draw(line); + line = new Line2D.Double(xOffset, (int) (bounds.getY() + bounds.getHeight() - 1), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1) + - getChartPainter().getStyleManager().getAxisTickMarkLength()); + g.draw(line); } } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java index 94df961e..e146f43a 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java @@ -16,7 +16,6 @@ package com.xeiam.xchart.internal.markers; import java.awt.Graphics2D; -import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.Ellipse2D; @@ -26,13 +25,11 @@ import java.awt.geom.Ellipse2D; public class Circle extends Marker { @Override - public void paint(Graphics2D g, int xOffset, int yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset) { g.setStroke(stroke); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); Shape circle = new Ellipse2D.Double(xOffset + Marker.X_OFFSET, yOffset + Marker.Y_OFFSET, Marker.SIZE, Marker.SIZE); g.fill(circle); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java index 4d2dac52..5fb4cb1f 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java @@ -16,9 +16,7 @@ package com.xeiam.xchart.internal.markers; import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.RenderingHints; -import java.awt.Shape; +import java.awt.geom.Path2D; /** * @author timmolter @@ -26,30 +24,20 @@ import java.awt.Shape; public class Diamond extends Marker { @Override - public void paint(Graphics2D g, int xOffset, int yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset) { g.setStroke(stroke); - int[] x = new int[4]; - int[] y = new int[4]; - int n = 4; - // Make a diamond - int halfSize = (int) (Math.ceil((Marker.SIZE + 3) / 2.0)); - x[0] = xOffset - halfSize + 0; - x[1] = xOffset - halfSize + halfSize; - x[2] = (int) (xOffset - halfSize + Marker.SIZE + 3); - x[3] = xOffset - halfSize + halfSize; - - y[0] = 1 + yOffset - halfSize + halfSize; - y[1] = (int) (1 + yOffset - halfSize + Marker.SIZE + 3); - y[2] = 1 + yOffset - halfSize + halfSize; - y[3] = 1 + yOffset - halfSize + 0; - - Shape diamond = new Polygon(x, y, n); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g.fill(diamond); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + double halfSize = Math.ceil((Marker.SIZE + 3) / 2.0); + + Path2D.Double path = new Path2D.Double(); + path.moveTo(xOffset - halfSize, yOffset - halfSize + halfSize); + path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize + Marker.SIZE + 3); + path.lineTo(xOffset - halfSize + Marker.SIZE + 3, yOffset - halfSize + halfSize); + path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize); + path.closePath(); + g.fill(path); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java index d4e28326..cac88797 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java @@ -30,5 +30,5 @@ public abstract class Marker { public static final double X_OFFSET = (int) (-1.0 * (SIZE / 2.0)); public static final double Y_OFFSET = (int) (-1.0 * (SIZE / 2.0)); - public abstract void paint(Graphics2D g, int xOffset, int yOffset); + public abstract void paint(Graphics2D g, double xOffset, double yOffset); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java index 7012ee24..84dbc41d 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java @@ -16,7 +16,6 @@ package com.xeiam.xchart.internal.markers; import java.awt.Graphics2D; -import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.Rectangle2D; @@ -26,13 +25,11 @@ import java.awt.geom.Rectangle2D; public class Square extends Marker { @Override - public void paint(Graphics2D g, int xOffset, int yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset) { g.setStroke(stroke); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); Shape square = new Rectangle2D.Double(xOffset + Marker.X_OFFSET, yOffset + Marker.Y_OFFSET, Marker.SIZE, Marker.SIZE); g.fill(square); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java index 8730551c..3a0e0537 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java @@ -16,9 +16,7 @@ package com.xeiam.xchart.internal.markers; import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.RenderingHints; -import java.awt.Shape; +import java.awt.geom.Path2D; /** * @author timmolter @@ -26,28 +24,19 @@ import java.awt.Shape; public class TriangleDown extends Marker { @Override - public void paint(Graphics2D g, int xOffset, int yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset) { g.setStroke(stroke); - int[] x = new int[3]; - int[] y = new int[3]; - int n = 3; - // Make a triangle - int halfSize = (int) (Math.ceil((Marker.SIZE + 1) / 2.0)); - x[0] = xOffset - halfSize + 0; - x[1] = xOffset - halfSize + halfSize; - x[2] = (int) (xOffset - halfSize + Marker.SIZE + 1); - - y[0] = 1 + yOffset - halfSize + 0; - y[1] = (int) (1 + yOffset - halfSize + Marker.SIZE + 1); - y[2] = 1 + yOffset - halfSize + 0; - - Shape triangle = new Polygon(x, y, n); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g.fill(triangle); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + double halfSize = Math.ceil((Marker.SIZE + 1) / 2.0); + + Path2D.Double path = new Path2D.Double(); + path.moveTo(xOffset - halfSize + 0, 1 + yOffset - halfSize + 0); + path.lineTo(xOffset - halfSize + halfSize, 1 + yOffset - halfSize + Marker.SIZE + 1); + path.lineTo(xOffset - halfSize + Marker.SIZE + 1, 1 + yOffset - halfSize + 0); + path.closePath(); + g.fill(path); } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java index d8b48281..21d8358c 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java @@ -16,9 +16,7 @@ package com.xeiam.xchart.internal.markers; import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.RenderingHints; -import java.awt.Shape; +import java.awt.geom.Path2D; /** * @author timmolter @@ -26,28 +24,19 @@ import java.awt.Shape; public class TriangleUp extends Marker { @Override - public void paint(Graphics2D g, int xOffset, int yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset) { g.setStroke(stroke); - int[] x = new int[3]; - int[] y = new int[3]; - int n = 3; - // Make a triangle - int halfSize = (int) (Math.ceil((Marker.SIZE + 1) / 2.0)); - x[0] = xOffset - halfSize + 0; - x[1] = (int) (xOffset - halfSize + Marker.SIZE + 1); - x[2] = xOffset - halfSize + halfSize; - - y[0] = (int) (yOffset - halfSize + Marker.SIZE + 1); - y[1] = (int) (yOffset - halfSize + Marker.SIZE + 1); - y[2] = yOffset - halfSize + 0; - - Shape triangle = new Polygon(x, y, n); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g.fill(triangle); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + double halfSize = Math.ceil((Marker.SIZE + 1) / 2.0); + + Path2D.Double path = new Path2D.Double(); + path.moveTo(xOffset - halfSize, yOffset - halfSize + Marker.SIZE + 1); + path.lineTo(xOffset - halfSize + Marker.SIZE + 1, yOffset - halfSize + Marker.SIZE + 1); + path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize + 0); + path.closePath(); + g.fill(path); } } -- GitLab