Передача параметров в функцию
Вложений: 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, то очередной рекурсивный вызов функции берет неверные начальные координаты отрезка и строит ложный отрезок. Возможно я неправильно передаю параметры в функцию, при вызове изнутри? Подскажите, пожалуйста. |
вот хорошая статья по отладке кода
http://learn.javascript.ru/debugging-chrome ее идея - это просматривать значения переменных при помощи "точек останова". т.е. если вы видите, что результат выполнения программы или участка кода не такой как надо, то вы записали в какую то переменную не правильно значение. с помощью этих "точек останова" вы можете остановить выполнения кода (в зависимости там где вы ее поставили) и посмотреть промежуточные результаты. если они верные, значит ошибка дальше, если нет то ошибку уже пропустили или стоите на ней) |
ctx.beginPath(), ctx.moveTo(xa,ya) до цикла, в цикле только ctx.lineTo, а ctx.stroke() после цикла отрисует построенный путь.
ctx.closePath() вообще не нужен, он замыкает путь. Исходник под РНР будет формировать одни координаты, в JS этот же код будет выдать совсем иные. |
Вместо цикла имеется в виду if(...), наверное?
|
Заметил еще что строчка
drawLevy(xc,yc,xb,yb,i-1); вовсе не выполняется. |
Всем спасибо, можно закрыть тему. Нашел суть проблемы, перед каждым следующим рекурсивным drawLevy(...) нужно еще раз найти точку излома и зафиксировать ее в (xc,yc).
|
>Вместо цикла имеется в виду if(...), наверное?
Нет, именно до цикла, метод lineTo ведь просто продолжает путь от прежних координат до указанных, и moveTo требуется только в начале, для установки исходных координат. |
| Часовой пояс GMT +3, время: 20:31. |