用Java图形绘制平滑曲线

用Java图形绘制平滑曲线,java,graphics,Java,Graphics,我正在尝试绘制平滑的、贝塞尔类型的曲线,以适合我拥有的一组数据,以便在java图形绘图中绘制它。 下面是我目前用来绘图的代码。它可以很好地绘制点,除了曲线有尖锐的边缘,有时还有小的裂缝。有没有更好的方法可以使用java图形生成平滑、拟合的曲线 int numProfiles = speedList.size(); int lenOfList; System.out.println(); System.out.println("Creating a

我正在尝试绘制平滑的、贝塞尔类型的曲线,以适合我拥有的一组数据,以便在java图形绘图中绘制它。 下面是我目前用来绘图的代码。它可以很好地绘制点,除了曲线有尖锐的边缘,有时还有小的裂缝。有没有更好的方法可以使用java图形生成平滑、拟合的曲线

int numProfiles = speedList.size();
        int lenOfList;
        System.out.println();
        System.out.println("Creating a new general path");

        //BasicStroke boldStroke = new BasicStroke(.3f);
        //((Graphics2D)g).setStroke(boldStroke);
        for (int i=0; i<numProfiles; i++){
            GeneralPath gp = new GeneralPath();
            g.setColor(colors[i]);
            lenOfList = speedList.get(i).length;
            if (lenOfList < 3) {
                double xPlotVal1 = xMarginLeft + (((speedList.get(i)[0].getVal() - xMin) / (xMax - xMin)) * width);
                double yPlotVal1 = yMarginTopAxisTop + (((depthList.get(i)[0].getVal() - yMin) / (yMax - yMin)) * height);

                double xPlotVal2 = xMarginLeft + (((speedList.get(i)[1].getVal() - xMin) / (xMax - xMin)) * width);
                double yPlotVal2 = yMarginTopAxisTop + (((depthList.get(i)[1].getVal() - yMin) / (yMax - yMin)) * height);

                g.drawLine((int) xPlotVal1, (int) yPlotVal1, (int) xPlotVal2, (int) yPlotVal2);

            } else {
                System.out.println("More than 2 pts");
                for (int j = 0; j < (lenOfList - 2); j++) {

                    double xPlotVal1 = xMarginLeft + (((speedList.get(i)[j].getVal() - xMin) / (xMax - xMin)) * width);
                    double yPlotVal1 = yMarginTopAxisTop + (((depthList.get(i)[j].getVal() - yMin) / (yMax - yMin)) * height);

                    double xPlotVal2 = xMarginLeft + (((speedList.get(i)[j + 1].getVal() - xMin) / (xMax - xMin)) * width);
                    double yPlotVal2 = yMarginTopAxisTop + (((depthList.get(i)[j + 1].getVal() - yMin) / (yMax - yMin)) * height);

                    double xPlotVal3 = xMarginLeft + (((speedList.get(i)[j + 2].getVal() - xMin) / (xMax - xMin)) * width);
                    double yPlotVal3 = yMarginTopAxisTop + (((depthList.get(i)[j + 2].getVal() - yMin) / (yMax - yMin)) * height);
                    gp.moveTo(xPlotVal1, yPlotVal1);

                    if (j==0) gp.moveTo(xPlotVal1, yPlotVal1);
                    //  gp.moveTo(xPlotVal1, yPlotVal1);
                    gp.curveTo(xPlotVal1, yPlotVal1, xPlotVal2, yPlotVal2,
                            xPlotVal3, yPlotVal3);

                }
                ((Graphics2D) g).draw(gp);
            }
        }
int numProfiles=speedList.size();
内部透镜列表;
System.out.println();
System.out.println(“创建新的通用路径”);
//基本行程boldStroke=新的基本行程(.3f);
//(图2d)g.设定行程(粗体行程);

对于(int i=0;i使用
Graphics2D
和反序列化:

 Graphics2D g2 = (Graphics2D)g;
 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
     RenderingHints.VALUE_ANTIALIAS_ON);
 //...
 g2.draw(gp);

您需要为Graphics2D对象启用antaliasing

像这样做

Graphics graphics = ...
Graphics2D g2d = (Graphics2D) graphics;

g2d.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);

// You can also enable antialiasing for text:

g2d.setRenderingHint(
    RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
在使用
图形
对象绘制任何图形之前,请执行此操作


另请参见。

Hmm。我尝试了渲染提示代码,但它仍在绘制相同的图片。发布更新的代码,可能是您启用提示太晚,或者是在错误的对象上。同时发布您的java版本。好的,只需在我最初发布的文章中第一次尝试代码的下方发布更新的版本。好的,我可以看到新版本的区别图像-线条稍微平滑一些。至于网格线-它们是可见的,但非常模糊,您可能需要禁用它们的抗锯齿功能(使用
setRenderingHint(键为“抗锯齿”,值为“抗锯齿”)
。我想说,这是因为您的路径是如何构建的。它只包含这些点。我该怎么做?我对堆栈溢出非常陌生,所以我不太清楚它是如何工作的。
Graphics graphics = ...
Graphics2D g2d = (Graphics2D) graphics;

g2d.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);

// You can also enable antialiasing for text:

g2d.setRenderingHint(
    RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);