Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.03.2015, 01:50
Новичок на форуме
Отправить личное сообщение для rusel_z Посмотреть профиль Найти все сообщения от rusel_z
 
Регистрация: 19.03.2015
Сообщений: 4

Передача параметров в функцию
Имеется код, который по идее должен вырисовывать кривую Леви на канву на 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, то очередной рекурсивный вызов функции берет неверные начальные координаты отрезка и строит ложный отрезок.

Возможно я неправильно передаю параметры в функцию, при вызове изнутри? Подскажите, пожалуйста.
Изображения:
Тип файла: png Безымянный.png (2.7 Кб, 8 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 19.03.2015, 08:24
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

вот хорошая статья по отладке кода
http://learn.javascript.ru/debugging-chrome
ее идея - это просматривать значения переменных при помощи "точек останова". т.е. если вы видите, что результат выполнения программы или участка кода не такой как надо, то вы записали в какую то переменную не правильно значение. с помощью этих "точек останова" вы можете остановить выполнения кода (в зависимости там где вы ее поставили) и посмотреть промежуточные результаты. если они верные, значит ошибка дальше, если нет то ошибку уже пропустили или стоите на ней)
Ответить с цитированием
  #3 (permalink)  
Старый 21.03.2015, 05:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

Исходник под РНР будет формировать одни координаты, в JS этот же код будет выдать совсем иные.
Ответить с цитированием
  #4 (permalink)  
Старый 23.03.2015, 17:08
Новичок на форуме
Отправить личное сообщение для rusel_z Посмотреть профиль Найти все сообщения от rusel_z
 
Регистрация: 19.03.2015
Сообщений: 4

Вместо цикла имеется в виду if(...), наверное?
Ответить с цитированием
  #5 (permalink)  
Старый 23.03.2015, 17:21
Новичок на форуме
Отправить личное сообщение для rusel_z Посмотреть профиль Найти все сообщения от rusel_z
 
Регистрация: 19.03.2015
Сообщений: 4

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

вовсе не выполняется.
Ответить с цитированием
  #6 (permalink)  
Старый 23.03.2015, 17:51
Новичок на форуме
Отправить личное сообщение для rusel_z Посмотреть профиль Найти все сообщения от rusel_z
 
Регистрация: 19.03.2015
Сообщений: 4

Всем спасибо, можно закрыть тему. Нашел суть проблемы, перед каждым следующим рекурсивным drawLevy(...) нужно еще раз найти точку излома и зафиксировать ее в (xc,yc).
Ответить с цитированием
  #7 (permalink)  
Старый 23.03.2015, 18:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача аргументов в функцию yintar jQuery 6 09.12.2014 19:29
передача параметров yintar jQuery 1 08.08.2014 00:33
проблема с передачей параметров в функцию bartonom Элементы интерфейса 4 19.09.2011 12:41
Передача параметров с сервера в функцию mikel Events/DOM/Window 2 29.08.2011 21:18
передача параметров в функцию yital9 Общие вопросы Javascript 5 13.02.2011 22:06