gpt4 book ai didi

java - Java图形中绘制平滑曲线

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:20 24 4
gpt4 key购买 nike

我正在尝试绘制平滑的贝塞尔曲线来拟合我拥有的一组数据,以便在 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);
}
}

这是它正在绘制的图片:
enter image description here

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

这是最新的图片。我不确定为什么它会让我的背景网格线消失。我在绘制彩色配置文件后绘制网格线。 enter image description here

最佳答案

您需要为 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 .

关于java - Java图形中绘制平滑曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11193155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com