Есть ли более эффективный способ установить массив пикселей p5.graphics равным другому, используя p5.js в javascript? - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я работаю над программой генетического алгоритма набора высоты с использованием библиотеки p5.js.

Программа использует формат генетического алгоритма для воссоздания любого изображения, которое вы хотите.Он работает аналогично этой программе , на которой я нашел видео на YouTube.

У меня есть класс Gene, у которого, помимо прочего, есть атрибут с именем 'graphic', который устанавливается равным новому объекту p5.graphic после создания гена.

Существует также класс Population с атрибутом genes, представляющим собой массив из 10 объектов Gene.Метод getHealthiest () класса Population возвращает Gene в массиве genes, графическое изображение которого больше всего похоже на целевое изображение.Кроме того, в классе Population есть метод evolve ().

Здесь возникает моя проблема.В методе evolve () я хочу: 1. определить самый здоровый ген и 2. очистить массив генов, за исключением самого здорового гена, и пополнить его 9 другими генами, которые являются вариациями самого здорового гена.Для этого мне нужно установить графический атрибут новых генов, равный атрибуту самого здорового гена.

    this.evolve = function() {
        var healthiestGene = this.getHealthiest(); //sets a variable equal to the healthiest gene
        this.genes = []; //clearing out the genes array of the population
        for (var i=0; i < this.populationSize; i++) {
            this.genes[i] = new Gene(this.target); //creating a new Gene object

            //This is the problem area
            this.genes[i].graphic.loadPixels();
            for (var j=0; j < healthiestGene.numPixels; j++){
                this.genes[i].graphic.pixels[j] = healthiestGene.graphic.pixels[j];
            }
            this.genes[i].graphic.updatePixels();

            if (i!=0) {
                this.genes[i].mutate(); //I mutate every Gene in the array but one
            }
            this.genes[i].evaluateFitness();
        }
    }

В настоящее время я делаю это, устанавливая два пиксельных массива равными друг другу пиксель за пикселемИнтересно, есть ли более эффективный способ сделать это?Я попытался просто написать:

this.genes[i].graphic.pixels = healthiestGene.graphic.pixels;

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

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

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

Вы можете создать новый графический экземпляр, а затем нарисовать старый экземпляр в новом.Примерно так:

var pg2 = createGraphics(pg.width, pg.height);
pg2.image(pg, 0, 0);

На этом этапе pg2 будет содержать все, что pg было изначально.

...