Программа рисования - PullRequest
       19

Программа рисования

0 голосов
/ 20 февраля 2010

Я пишу простую программу рисования. Для имитации рисования карандашом я сохранил нарисованные точки в наборе, поэтому при изменении размера окна точки не исчезают, и при добавлении другой точки я вызываю метод repaint ( paint метод рисует все краски в массиве на экране). Но когда количество точек увеличивается, программа запускается медленно. Есть ли более эффективный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

Самый быстрый способ получить перерисовку с постоянной скоростью - это сохранить все изображение, нарисованное как растровое изображение, и, конечно, обновить его, когда пользователь рисует. Таким образом, вы можете перерисовать нужную вещь и даже добавить полосы прокрутки и тому подобное, если хотите. Например, вы можете сохранить массив точек для функции отмены.

Если вместо этого вы хотите создать программу векторного рисования, то вам нужно сохранить отдельные примитивные операции (такие как линии, прямоугольники и т. Д.). В этом случае все еще окупается сохранение изображения для быстрой перекраски, и теперь хитрость заключается в том, как эффективно обновить это изображение, когда пользователь изменяет чертеж (например, изменяя размер прямоугольника). Один из способов сделать это - разбить область рисования на множество меньших, поэтому вам нужно только пересчитать базовое изображение для частей, которые пересекаются с изменяемым пользователем объектом.

В обоих методах вы бы использовали двойную буферизацию, чтобы пользователь не воспринимал мерцание. Но только с двойной буферизацией «перерисовка всего набора точек» все равно будет медленной.

1 голос
/ 20 февраля 2010

Посмотрите вверх GeneralPath .

Что вы можете сделать, это создать класс Shape, который будет меняться в зависимости от того, что вы собираетесь рисовать (прямоугольник, треугольник, точка, линия и т. Д.). Вы должны сделать это, хотя теперь вы рисуете только точки.

При создании Shape есть код, который проверяет, какую Shape создавать, что-то вроде оператора switch / case:

...
         case PENCIL:
            if (generalPath == null) {
               generalPath = new GeneralPath();
               generalPath.moveTo(p1.x, p1.y);
            } else {
               generalPath.lineTo(p2.x, p2.y);
            }
            shape = generalPath;
            break;
...

В коде, который рисует, просто вызовите repaint, и Shape будет нарисован.

1 голос
/ 20 февраля 2010

Поскольку вы не дали никакого кода, я предполагаю, что вы используете примитивные методы рисования (например, рисуете линию или точку).

Хорошим вариантом будет использовать технику Double Buffering для рисования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...