22.09.2016, 17:41
|
Новичок на форуме
|
|
Регистрация: 22.09.2016
Сообщений: 4
|
|
Canvas не рисует линии
Ребята, помогите плиз. Новичок в JS, туплю...
рисую в цикле линии в Canvas, координаты линий находятся в числовом массиве. Почему-то, вот такое линии рисует:
Код:
|
context.moveTo(0, 50);
context.lineTo(100, 50); |
а если передаю в качестве координат массив, то ничего не рисуется:
Код:
|
context.moveTo(masXX[i-1],masYY[i-1]);
context.lineTo(masXX[i-1],masYY[i]); |
массив числовой. typeof выдает number
Помогите плиз
|
|
22.09.2016, 18:00
|
Новичок на форуме
|
|
Регистрация: 22.09.2016
Сообщений: 4
|
|
Вот:
Код:
|
var a_canvas = doc.document.getElementById("a");
var context = a_canvas.getContext("2d");
context.strokeStyle = "#000000";
context.beginPath();
for (var i=0; i<nodecount;i++)
{
if (i>0)
{
context.moveTo(masXX[i-1],masYY[i-1]);
context.lineTo(masXX[i-1],masYY[i]);
context.moveTo(masXX[i-1],masYY[i]);
context.lineTo(masXX[i],masYY[i]);
}
}
context.stroke(); |
А массив заполняется в другой функции (x и y числа):
Код:
|
masXX[nodecount] = x+40;
masYY[nodecount] = y+40; |
|
|
22.09.2016, 18:05
|
|
Профессор
|
|
Регистрация: 21.11.2015
Сообщений: 440
|
|
Dmitriy_14,
Новичок в JS, проблема у тебя в индексе.
Вместо:
context.lineTo(masXX[i-1],masYY[i]);
Надо:
context.lineTo(masXX[i],masYY[i]);
|
|
22.09.2016, 18:09
|
Новичок на форуме
|
|
Регистрация: 22.09.2016
Сообщений: 4
|
|
Сообщение от Coriolan161
|
Dmitriy_14,
Новичок в JS, проблема у тебя в индексе.
Вместо:
context.lineTo(masXX[i-1],masYY[i]);
Надо:
context.lineTo(masXX[i],masYY[i]);
|
Нет, здесь все правильно (линии рисуются из точки, где предыдущая линия была), но попробовал, как вы написали, все-равно не рисует.
|
|
22.09.2016, 18:14
|
|
Профессор
|
|
Регистрация: 21.11.2015
Сообщений: 440
|
|
Dmitriy_14,
Ты что лестницу рисуешь?
У меня прокатило
var canvas = document.getElementById('canvas2');
var context = canvas.getContext('2d');
var XX = [0, 40, 80, 120, 160, 200, 240, 280, 320];
var YY = [0, 40, 80, 120, 160, 200, 240, 280, 320];
context.beginPath();
var i = -1;
while (++i < XX.length) {
context.moveTo(XX[i], YY[i]);
context.lineTo(XX[i], YY[i + 1]);
context.moveTo(XX[i], YY[i + 1]);
context.lineTo(XX[i + 1], YY[i + 1]);
};
context.stroke();
|
|
22.09.2016, 18:20
|
|
Профессор
|
|
Регистрация: 21.11.2015
Сообщений: 440
|
|
Dmitriy_14,
Но это НЕ есть хорошо два массива координат иметь. Потому что можно где-то что-то недоглядеть
Лучше ты это..того..класс точек сделай и пихай объект-точку в массив
function Point(x, y) {
var point = {};
point.posX = x;
point.posY = y;
return point;
}
var myPoints = [];
/*....*/
myPoints.push(new Point(0, 0));
Ну короче в таком ключе
|
|
22.09.2016, 18:50
|
Новичок на форуме
|
|
Регистрация: 22.09.2016
Сообщений: 4
|
|
Сообщение от Coriolan161
|
Dmitriy_14,
Но это НЕ есть хорошо два массива координат иметь. Потому что можно где-то что-то недоглядеть
Лучше ты это..того..класс точек сделай и пихай объект-точку в массив
|
Да, делаю рисовалку дерева DOM, для красоты линии к блокам.
Спасибо большое за совет!
|
|
24.09.2016, 13:49
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Сообщение от Dmitriy_14
|
context.stroke();
|
Так у тебя рисование снаружи цикла.
Какие еще точки? Две координаты, "двумерный" массив, берешь по токену и рисуешь. Запутали сами себя в трех соснах.
|
|
25.09.2016, 00:03
|
|
Профессор
|
|
Регистрация: 21.11.2015
Сообщений: 440
|
|
warren buffet,
Цитата:
|
Так у тебя рисование снаружи цикла
|
context.stroke() делает обозначенные контуры видимыми. "Рисуется" всё в цикле
|
|
25.09.2016, 00:48
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Немного оффтоп, но тем не менее:
если толщина линии - нечетное число пикселей (1, 3, 5, ...), то в lineTo и moveTo надо прибавить 0.5 ко всем координатам. Тогда линия будет четкая. А если не прибавить, то размытая.
это как раз для тех случаев, когда "подытоживаем" функцией stroke()
|
|
|
|