private final List<Point2D> getPointsFrom(
      GraphSettings gInfo, Graph g, Year startYear, int nYears, int bottom) {
    // index into our data values for this particular year
    int idx = startYear.diff(g.graph.getStart().add(g.xoffset));

    // make a list of points
    // this is ok, because we know points are continuous
    List<Point2D> points = new ArrayList<Point2D>(nYears);

    // the year the plot starts
    Year plotStartYear = gInfo.getDrawBounds().getStart();
    // the adjusted range of this graph
    Range graphRange = g.getRange();
    int yearWidth = gInfo.getYearWidth();
    float unitScale = gInfo.getHundredUnitHeight() / 100.0f;

    for (int i = 0; i <= nYears; i++) {
      // skip points that don't exist
      if (!graphRange.contains(startYear.add(i))) continue;

      int value = g.graph.getRingWidthData().get(idx + i).intValue();
      int x = getXValue(g, plotStartYear, yearWidth, idx + i);
      int y = getYValue(g, unitScale, value, bottom);

      points.add(new Point2D.Float(x, y));
    }

    return points;
  }
 private final int getDataValue(Graph g, Year y) {
   int i = y.diff(g.graph.getStart().add(g.xoffset));
   return g.graph.getRingWidthData().get(i).intValue();
 }