3

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);
            }
        }

これが描いているものの写真です:
ここに画像の説明を入力

//2012 年 6 月 26 日午前 7 時 34 分 //これは、レンダリング ヒントを追加した後の更新されたコードです。

    // the profiles
    Graphics2D g2d = (Graphics2D)g;
    int numProfiles = speedList.size();
    int lenOfList;
    for (int i=0; i<numProfiles; i++){
        GeneralPath gp = new GeneralPath();
        g2d.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);

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

        } else {
            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);      //only move at the begining of the curve drawing
                //  gp.moveTo(xPlotVal1, yPlotVal1);
                gp.curveTo(xPlotVal1, yPlotVal1, xPlotVal2, yPlotVal2,
                        xPlotVal3, yPlotVal3);

            }
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             g2d.draw(gp);
        }
    }

こちらが最新の写真です。背景のグリッド線が消える理由がわかりません。色付きのプロファイルをプロットした後、グリッド ラインをプロットします。 ここに画像の説明を入力

4

2 に答える 2

8

Graphics2D オブジェクトのアンチエイリアシングを有効にする必要があります。

このようにしてください

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);

graphicsオブジェクトを使用して何かを描画する前にこれを行ってください。

RenderingHints javadocも参照してください。

于 2012-06-25T16:25:56.987 に答える
3

Graphics2Dをアンチエイリアスとともに使用します。

 Graphics2D g2 = (Graphics2D)g;
 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
     RenderingHints.VALUE_ANTIALIAS_ON);
 //...
 g2.draw(gp);
于 2012-06-25T16:23:45.653 に答える