остановите settimeout в рекурсивной функции

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

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

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

Вы также можете (в то же время) улучшить мелкую детализацию, выполнив меньшую проверку на основе сетки на наилучшем соответствующем квадрате сетки.

Например, если вы используете сетку 8x8 над изображением:

  • Определите, какой из 64 квадратов сетки является наихудшим совпадением и флаг пересекается (или рядом с / окружающие) треугольники для более высокой вероятности мутации.
  • Определите, какой из 64 квадратов сетки является лучшим совпадением , и повторите с другой меньшей сеткой 8x8 только внутри этого квадрата (то есть сетка 8x8 в пределах этого лучшего квадрата сетки). Они могут быть отмечены для вероятных мест для добавления новых треугольников или просто для точной настройки деталей.
13
задан Community 23 May 2017 в 10:30
поделиться

4 ответа

Я думаю, вы неправильно поняли 'setTimeout' и 'clearTimeout'.

Если вы хотите установить таймер, который хотите отменить позже, сделайте что-то вроде:

foo = setTimeout(function, time);

, затем позвоните

clearTimeout(foo);

], если вы хотите отменить этот таймер.

Надеюсь, это поможет!

7
ответ дан 1 December 2019 в 19:50
поделиться

Как написано, mytimer - это функция, которая никогда не имеет значение идентификатора тайм-аута, поэтому ваш оператор clearTimeout ничего не добьется.

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

2
ответ дан 1 December 2019 в 19:50
поделиться

Как отмечалось выше, основная причина, по которой этот код не работает, заключается в том, что вы передаете неправильную вещь в вызов clearTimeout - вам необходимо сохранить возврат значение вызова setTimeout , которое вы делаете в updateFunction , и передаете this в clearTimeout вместо самой ссылки на функцию.

В качестве второго предложения по улучшению - всякий раз, когда у вас есть то, что вы называете рекурсивной функцией тайм-аута, лучше использовать метод setInterval , который запускает функцию через равные промежутки времени, пока она не будет отменена. Это позволит добиться того же самого, что вы пытаетесь сделать с помощью метода updateFunction , но он будет более чистым, так как вам нужно только включить логику «делать что-то» в отложенную функцию, и она ' s, вероятно, более производительный, поскольку вы не будете создавать вложенные замыкания. Плюс это правильный способ сделать это, который должен иметь значение, не так ли? : -)

0
ответ дан 1 December 2019 в 19:50
поделиться

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

Кроме того, анонимная функция в setTimeout великолепна, если вы хотите запустить встроенную логику, измените значение this внутри функции или передайте параметры в функцию . Если вы просто хотите вызвать функцию, достаточно передать имя функции в качестве первого параметра.

var timer = null; 

var updatetimer = function () {
    //do stuff

    // By the way, can just pass in the function name instead of an anonymous
    // function unless if you want to pass parameters or change the value of 'this'
    timer = setTimeout(updatetimer, 10000);
};

//this should start and stop the timer
$("#mybutton").click(function(e) { 
     e.preventDefault();
     if($('#mydiv').is(':visible')){
        $('#mydiv').fadeOut('normal');
        clearTimeout(timer);  // Since the timeout is assigned to a variable, we can successfully clear it now

    } else{
        $('#mydiv').fadeIn('normal');
        updatetimer();
   }
});
22
ответ дан 1 December 2019 в 19:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: