Рисование точечной сетки

Я новичок в программировании графики. Я пытаюсь создать программу, позволяющую рисовать ориентированные графы. Для начала мне удалось нарисовать набор прямоугольников (представляющих узлы) и сделать возможности панорамирования и масштабирования, переопределив метод рисования в Java.

Все это, кажется, работает достаточно хорошо, пока узлов не слишком много. Моя проблема заключается в том, что я пытаюсь нарисовать точечную сетку. Сначала я использовал простой тестовый код, который накладывал точечную сетку с помощью двух вложенных циклов for:

int iPanX = (int) panX;
int iPanY = (int) panY;
int a = this.figure.getWidth() - iPanX;
int b = this.figure.getHeight() - (int) iPanY;

for (int i = -iPanX; i < a; i += 10) {
    for (int j = -iPanY; j < b; j += 10) {
        g.drawLine(i, j, i, j);
    }
}

Это позволяет мне панорамировать сетку, но не масштабировать. Однако производительность при панорамировании ужасна! Я много искал, но чувствую, что упускаю что-то очевидное, потому что не могу найти ничего по этому вопросу.

Любая помощь или указатели будут очень признательны.

--Стивен


person SRoe    schedule 06.08.2009    source источник


Ответы (2)


Используйте BufferedImage для точечной сетки. Инициализируйте его один раз, а затем рисуйте только изображение вместо того, чтобы рисовать сетку снова и снова.

private init(){
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics g = image.getGraphics();
    // then draw your grid into g
}

public void paint(Graphics g) {
    g.drawImage(image, 0, 0, null);
    // then draw the graphs
}

И масштабирование легко достигается с помощью этого:

g.drawImage(image, 0, 0, null); // so you paint the grid at a 1:1 resolution
Graphics2D g2 = (Graphics2D) g;
g2.scale(zoom, zoom);
// then draw the rest into g2 instead of g

Рисование в увеличенной графике приведет к пропорционально большей ширине линии и т. д.

person Stroboskop    schedule 06.08.2009
comment
Спасибо, производительность увеличилась в разы! Есть несколько причуд, которые мне придется сгладить, но в целом это намного лучше. Решение, которое вы предлагаете для масштабирования, не идеально, поскольку оно увеличивает размер сетки, которую я бы предпочел сохранить в виде отдельных пикселей. Нужно ли обновлять сетку img на зуме, чтобы приспособиться? - person SRoe; 06.08.2009
comment
да, это пришло мне в голову после. Это зависит от того, как часто вы ожидаете изменения масштаба. Я думаю, вы должны обновлять изображение сетки при каждом изменении масштаба. А в paint(g) вы можете нарисовать сетку с масштабом 1:1, а затем установить коэффициент масштабирования для остальных объектов для рисования. Думаю, я обновлю это в своем ответе. - person Stroboskop; 06.08.2009

Я думаю, что перерисовывание всех ваших точек каждый раз, когда мышь движется, вызовет проблемы с производительностью. Возможно, вам следует подумать о том, чтобы сделать снимок вида в виде растрового изображения и панорамировать его, перерисовывая представление «правильно», когда пользователь отпускает кнопку мыши?

person Chris Roberts    schedule 06.08.2009