#java #processing #cloning
#java #обработка #клонирование
Вопрос:
Используя обработку Java, я пытаюсь создать глубокую копию объекта PGraphics2D
PGraphics2D pg_render;
pg_render = (PGraphics2D) createGraphics(width, height, P2D);
PGraphics2D pg_postprocd = (PGraphics2D)pg_render.clone();
Который выдает исключение CloneNotSupportedException :
Необработанное исключение типа CloneNotSupportedException
Тем не менее, при чтении документа кажется, что клонирование реализовано.
Мне нужно иметь два экземпляра объектов PGraphics2D, чтобы я мог применять эффекты постобработки к одному и сохранять другой чистым для анализа векторов движения и тому подобного.
Ответ №1:
Исключение
PGraphics
Класс сам по себе не реализует Clonable
. Скорее, он расширяется PImage
, и это класс, который фактически реализует Cloneable
интерфейс.
Вот почему ваш вызов pg_render.clone()
throws CloneNotSupportedException
, поскольку PGraphics фактически не поддерживает клонирование (но, случается, расширяет класс, который это делает).
Решение
Приведенный ниже статический метод возвращает клон входного объекта PGraphics. Он создает новый PGraphics
объект createGraphics()
, клонирует стиль (стиль включает такие вещи, как текущий цвет заливки) и, наконец, клонирует пиксельный буфер.
Код
static PGraphics clonePGraphics(PGraphics source) {
final String renderer;
switch (source.parent.sketchRenderer()) {
case "processing.opengl.PGraphics2D" :
renderer = PConstants.P2D;
break;
case "processing.opengl.PGraphics3D" :
renderer = PConstants.P3D;
break;
default : // secondary sketches cannot use FX2D
renderer = PConstants.JAVA2D;
}
PGraphics clone = source.parent.createGraphics(source.width, source.height, renderer);
clone.beginDraw();
clone.style(source.getStyle()); // copy style (fillColor, etc.)
source.loadPixels(); // graphics buffer -> int[] buffer
clone.pixels = source.pixels.clone(); // in's int[] buffer -> clone's int[] buffer
clone.updatePixels(); // int[] buffer -> graphics buffer
clone.endDraw();
return clone;
}