Avatar billede wagner Nybegynder
14. oktober 2004 - 20:27 Der er 1 løsning

Problem med tegning af store mængder grafik

Hejsa

Jeg sidder lige og arbejder lidt med at tegne en masse kurver i et JPanel, men har lidt problemer. Min tegning er gemt i et JGeneralPath og indeholder linier mellem cirka 135000 punkter.

Det går fint med at tegne denne grafik, men når der så skal scrolles på figuren, så går det utroligt langsomt. Figuren har en størrelse på cirka 27000 x 22000.

Jeg har prøvet at doublebuffer, så godt jeg kunne ved kun at oprette min figur en gang og siden blot vise et udsnit af figuren ved hjælp af clip metoden på Graphics2D. Jeg har så selv implementeret en listener, så jeg bare flytter mit clip, når der scrolles.

Mit problem er at dette kun virker ved små datamængder, men når jeg anvender mine testdata med 135000 punkter, så får jeg en java.lang.OutOfMemoryError som jeg kan spore tilbage til min clip metode.

Er der noger der ved hvad jeg kan gøre ved dette problem eller og jeg evt. burde anvende en anden opbygning?

Wagner

Jeg poster lige lidt af min kode:

public void paintComponent(Graphics g)
    {
        int x,y;
        System.out.println("paint kaldet " + i++);
        if (drawing != null)
        {
            Rectangle rect = new Rectangle(dx, dy, 600, 500);
/*
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());
            paintBorder(g);
*/
            Graphics2D g2 = (Graphics2D)g;
            g.setColor(Color.WHITE);   
            if (olddx > dx)
                x = dx;
            else
                x = olddx;
            if (olddy > dy)
                y = dy;
            else
                y = olddy;
           
            // clear før der tegnes noget nyt
            g.fillRect(x, y, 600, 500);
           
            // tegn den nye flade, der er blevet synlig
            g.setColor(Color.BLACK);
            g2.setClip(drawing);
            g2.clip(rect);
            g2.clipRect(dx, dy, 580, 480);
            g2.draw(drawing);

            /*
            System.out.println("1. view:" + ((MainWindow)mainWindow).getViewport().getViewPosition().x + " " + ((MainWindow)mainWindow).getViewport().getViewPosition().y);
            Point p = ((MainWindow)mainWindow).getViewport().toViewCoordinates(new Point(dx, dy));
            ((MainWindow)mainWindow).getViewport().setViewPosition(p);
            System.out.println("2. view:" + ((MainWindow)mainWindow).getViewport().getViewPosition().x + " " + ((MainWindow)mainWindow).getViewport().getViewPosition().y);
*/
        }
    }
   
    public void init()
    {
        Graphics g = this.getGraphics();
        if (g != null)
        {
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());
            paintBorder(g);
            g.setColor(Color.BLACK);
            Graphics2D g2 = (Graphics2D)g;
            g2.setStroke(SolidLine); 
            System.out.println("inint kaldt");
        }
    }
   
    public void drawTerrain(Terrain terrain)
    {

        if(terrain != null)
        {
            Graphics2D g2 = (Graphics2D)this.getGraphics();
            drawing = new GeneralPath();
            Object[] terrainArray=terrain.toArray();
            for (int i=0; i < terrainArray.length; i++)
            {
                drawKoteLayer(g2,i,(Elevation)terrainArray[i]);
            }
            //if (drawing != null)
              //  g2.draw(drawing);
        }
    }
   
   
   
   
    private void drawKoteLayer(Graphics2D g2,int lineType, Elevation kote)
    {
        int[] xarr, yarr;
        Object[] lineStringArray=kote.toArray();
        for (int i=0; i < lineStringArray.length; i++)
        {
            if (lineType % 2==0)
            {
                g2.setStroke(SolidLine);
            }
            else
            {
                g2.setStroke(dashed);
            }
            xarr = kote.getLineString(i).getXArray();
            yarr = kote.getLineString(i).getYArray();
            if (xarr.length > 1)
            {
                drawing.moveTo((float)xarr[0], (float)yarr[0]);
                for (int j = i; j < xarr.length; j++)
                {
                    drawing.lineTo((float)xarr[j], (float)yarr[j]);
                }
            }
        }
    }   

Bare sig til, hvis i har brug for mere kode.
Avatar billede wagner Nybegynder
10. november 2004 - 09:12 #1
Tilsyneladende ingen, der kan svare.

Lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester