gpt4 book ai didi

java - 如何使用 Graphics2d.setPaint() 在 Java 中快速绘制大型数据集

转载 作者:行者123 更新时间:2023-12-02 04:22:27 24 4
gpt4 key购买 nike

我有大量数据希望绘制在图表上,范围从 10k 点到大约 2000 万点。在 10k 点处,绘图的速度还不错(一秒内),但在 2000 万点处,绘图似乎需要几分钟。

我使用 Java 来编写程序,并用另一种语言重写代码,只是为了提高单个绘图的图形绘制速度,该绘图仅出现在最大数据集不在卡片中的情况下。

我是否必须忍受这种速度,因为由于数据大小的原因,2000 万个点图本质上会花费这么长时间,或者我是否错过了一些优化标志/方法/等?

我的数据位于名为 Data 的 13,000 x 4096 二维数组中。这是从 Main.java 中的 Plot 函数外部填充的

//In Plot.java
public class PlotG extends JPanel
{
double xscale = 0.0;
double yscale = 0.0;
protected void paintComponent(Graphics g)
{
super.paintCompnent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHint.Key_ANTIALIASING, RenderingHint.VALUE_ANTIALIAS_ON);

//Scaling
int sizew = Data.size();
int sizeh = Data.get(0).size();
xscale = (getWidth()*1.0)/(sizew *1.0);
yscale = (getHeight()*1.0)/(sizeh *1.0);

//Set Colour
g2.setPaint(Color.GREEN);

//Plot
for(int j=0; j<sizew; j++)
{
for(int k=0;k<sizeh; k++)
{
if(Data.get(j).get(k) > MinimumValueToPlot) //I only plot points above the constant value MinimumValueToPlot
{
int x = xscale*j;
int y = yscale*k;
g2.fillOval(x,y,1,1);
}
}
}
return;
}
}


private Plot dataPlot = new Plot()

public PlotStuff(ArrayList<ArrayList<Double>> In)
{
Data = In;
InitPLot(getContentPane());
}

private void InitPlot(Container contentPane)
{
getContentPane().setBackground(Color.GRAY);
getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
setMinimumSize(new Dimension(1650, 830));
pack();

GraphPanel = new JPanel();
GraphPanel.setBounds(6,11,1470,750);

GraphPanel.setBorder( BorderFactory.createTitleBorder( BorderFactory.createLineBorder(Color.GREEN, 2),
"Title",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION,
new Font("Tahoma", Font.BOLD, 18),
Color.WHITE));
getContentPanel().add(GraphPanel);
GraphPanel.setLayout(new BorderLayout());

dataPlot.setBackGround(Color.BLUE);
dataPlot.setForeGround(Color.WHITE);
dataPlot.setPreferredSize(new Dimension(1470, 750));
GraphPanel.add(dataPlot);
return;
}

//in Main.java
.
.
PlotStuff p = new PlotStuff(Data);
p.redrawGraph();
p.setVisible();
.
.

如果高于常量 MinimumValueToPlot 的点数达到 2000 万及以上,是否有办法提高速度?鉴于我的最大可能数据集是 13k x 4096 = 53,248,000,这是可能的,但超过 MinimumValueToPlot 的最高经验点数到目前为止只有 2000 万个。

我在 JPanel 声明中做错了什么吗?我看到一些讨论说不应该使用 setPreferredSize ?是这样吗?

谢谢。

最佳答案

  1. 您声明Data是一个二维数组,但它不是。这是一个ArrayListArrayLists 。而是使用实际的数组。

而不是 ArrayList<ArrayList<Double>>你会做double[][] .

  • 在您的循环中,您正在调用 fillOval设置单个像素的颜色。这会导致巨大的不必要的开销。您基本上是在告诉您的应用程序计算大小为 1x1 的椭圆形的像素 2000 万次!
  • 我建议你创建一个BufferedImage,获取它的像素数组,然后直接设置像素值。然后,完成后,将该图像绘制到 Graphics2d 对象:

    BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);
    Graphics2D imgGraphics2D = img.createGraphics();
    imgGraphics2D.setColor(Color.white);
    imgGraphics2D.fillRect(0, 0, getWidth(), getHeight());
    imgGraphics2D.dispose();

    byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
    for(int j=0; j < sizew; j++)
    {
    for(int k=0; k < sizeh; k++)
    {
    if(data[j][k] > minimumValueToPlot)
    {
    int x = (int)(xscale * j);
    int y = (int)(yscale * k);
    int pixelindex = (y * getWidth() + x) * 3;
    pixels[pixelindex + 1] = 255; // set the green byte
    }
    }
    }

    g2.setComposite(AlphaComposite.Src);
    g2.drawImage(img, 0, 0, null);

    请对此持保留态度,因为这是我凭内存写的。

    (我还擅自将 Data 重命名为 data ,并将 MinimumValueToPlot 重命名为 minimumValueToPlot 。Java 中的每个约定变量以小写字母开头,以将它们与类区分开来。)

    关于java - 如何使用 Graphics2d.setPaint() 在 Java 中快速绘制大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56628192/

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