Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача параметров в функцию (https://javascript.ru/forum/misc/54481-peredacha-parametrov-v-funkciyu.html)

rusel_z 19.03.2015 01:50

Передача параметров в функцию
 
Вложений: 1
Имеется код, который по идее должен вырисовывать кривую Леви на канву на html-странице.
var canvas, ctx;

function initialize() {
    canvas = document.getElementById('canvas');
    ctx = canvas.getContext("2d");
}

window.onload = initialize;
var i;

function drawLevy(xa,ya,xb,yb,i) {
    if(i == 0) {
        ctx.beginPath();
        ctx.moveTo(xa,ya);
        ctx.lineTo(xb,yb);
        ctx.closePath();
        ctx.stroke();
    }
    else {
        xc = (xa + xb)/2 + (yb - ya)/2;
        yc = (ya + yb)/2 - (xb - xa)/2;
        drawLevy(xa,ya,xc,yc,i-1);
        drawLevy(xc,yc,xb,yb,i-1);
    }
}


Для 0- и 1-итерации все работает отлично, в первом случае отрисовывается прямая, во втором отрезок "надламывается" и отрисовываются новые два. Однако, если итераций больше 1, то очередной рекурсивный вызов функции берет неверные начальные координаты отрезка и строит ложный отрезок.

Возможно я неправильно передаю параметры в функцию, при вызове изнутри? Подскажите, пожалуйста.

skrudjmakdak 19.03.2015 08:24

вот хорошая статья по отладке кода
http://learn.javascript.ru/debugging-chrome
ее идея - это просматривать значения переменных при помощи "точек останова". т.е. если вы видите, что результат выполнения программы или участка кода не такой как надо, то вы записали в какую то переменную не правильно значение. с помощью этих "точек останова" вы можете остановить выполнения кода (в зависимости там где вы ее поставили) и посмотреть промежуточные результаты. если они верные, значит ошибка дальше, если нет то ошибку уже пропустили или стоите на ней)

laimas 21.03.2015 05:24

ctx.beginPath(), ctx.moveTo(xa,ya) до цикла, в цикле только ctx.lineTo, а ctx.stroke() после цикла отрисует построенный путь.

ctx.closePath() вообще не нужен, он замыкает путь.

Исходник под РНР будет формировать одни координаты, в JS этот же код будет выдать совсем иные.

rusel_z 23.03.2015 17:08

Вместо цикла имеется в виду if(...), наверное?

rusel_z 23.03.2015 17:21

Заметил еще что строчка
drawLevy(xc,yc,xb,yb,i-1);

вовсе не выполняется.

rusel_z 23.03.2015 17:51

Всем спасибо, можно закрыть тему. Нашел суть проблемы, перед каждым следующим рекурсивным drawLevy(...) нужно еще раз найти точку излома и зафиксировать ее в (xc,yc).

laimas 23.03.2015 18:51

>Вместо цикла имеется в виду if(...), наверное?

Нет, именно до цикла, метод lineTo ведь просто продолжает путь от прежних координат до указанных, и moveTo требуется только в начале, для установки исходных координат.


Часовой пояс GMT +3, время: 12:04.