Передача параметров в функцию
Вложений: 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, время: 05:50. |