如何在Java中为JFreeChart极坐标图实现边角平滑?
极坐标图数据系列平滑问题
问题描述
使用JFreeChart创建了包含初始(红色)和修改后(蓝色)两个数据系列的极坐标图,修改后的系列存在尖锐边角需要平滑处理。尝试移动平均法后情况有所改善,但尖锐边角仍存在;尝试插值法也未解决问题。
已尝试的解决方案及代码
插值法
public void interpolate(Map<Double, Double> data) { double angel = 0.0; double increment = reader.getPolarAngelsArray()[1]; int length = reader.getNumberOfPolarAngels() * 2 - 1; double[] x = new double[length]; double[] y = new double[length]; for (int i = 0; i < length; i++) { x[i] = angel; y[i] = data.get(angel); angel += increment; } UnivariateInterpolator interpolator = new SplineInterpolator(); UnivariateFunction function = interpolator.interpolate(x, y); for (double angle = 0.0; angle <= 360.0; angle += increment) { data.put(angle, function.value(angle)); } }
移动平均法
public XYSeries movAvg(XYSeries series) { ArrayList<Double> avgY = new ArrayList<>(); for (int i = 0; i < series.getItemCount(); i++) { if (i == 0) { avgY.add((Double) series.getY(i)); } else if (i == (series.getItemCount() - 1)) { avgY.add((Double) series.getY(i)); } else { avgY.add(((Double) series.getY(i - 1) + (Double) series.getY(i) + (Double) series.getY(i + 1)) / 3.0); } } for (int i = 0; i < series.getItemCount(); i++) { series.update(series.getX(i), avgY.get(i)); } return series; }
示例数据
- 角度:25.0、27.5、30.0、32.5、35.0、37.5、40.0、42.5、45.0、47.5、50.0、52.5、55.0、57.5、60.0、62.5、65.0
- 数值:327.24、321.03、314.3、307.05、298.64、290.09、280.77、270.14、511.27、488.73、463.07、438.02、411.86、382.51、354.24、324.84、290.96
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

