|
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта.
Как это сделать в canvas? Или вообще не получится?
Пример: - отрисованный объект (не подгружаемый). Например, стрелка заданного размера, цвета (именно нарисованная как пятиугольник). - ориентация "вверх-вниз-влево-вправо". 90 град. Random. - изменение положения объекта (центра) в пределах квадрата со стороной в 2 раза больше длины объекта. Random. Шаг 10 пикселей. - изменение размера объекта. Увеличение/уменьшение с шагом 0,1 от начального размера до в 2-е увеличенного. Random. - таймер 1 секунда, счетчик до 10. Т.е. стрелка каждую секунду меняет свое положение, размер и ориентацию. Не получаются совместные вращения с перемещением центра вращения в центр рандомизированно построенного смещенного объекта. Учусь... Находил примеры для подгружаемых рисунков. Аналогия не получается.. А может и нельзя сделать? М.б. нужны библиотеки или по-другому как-то? |
Я тоже только учусь, но если каждую секунду воздействовать на свойства в CSS (размер, угол вращения), то может получится.. а canvas вроде для цвета, но я точно не утвеждаю.
|
Вот пытаюсь:
<!DOCTYPE HTML> <html> <head> <script> setInterval(function() { var canvas=document.getElementById("myCanvas"); var context=canvas.getContext("2d"); // Очистка холста context.clearRect(0, 0, canvas.width, canvas.height); // Размеры квадрата. var rectWidth = 40; var rectHeight = 40; // Расчет угла поворота по часовой стрелке var q1 = Math.floor((Math.round(Math.random()*10))/4); var q2 = Math.floor((Math.round(Math.random()*10))/4); // Расчет смещения стимула по X и Y var x1 = 20+Math.round((Math.random()*10)); var y1 = 20+Math.round((Math.random()*10)); // var x2 = 100+Math.round(Math.random()*100)/10); // var y2 = 100+Math.round(Math.random()*100)/10); // Смещение начала осей координат в центр фигуры context.translate(canvas.width/2,canvas.height/2); // Смещение фигуры context.translate(x1,y1); //context.translate(-x2,-y2); // Поворот фигуры context.rotate(Math.PI/q1); context.rotate(Math.PI/q2); // Рисование квадрата context.fillStyle="#ff0000"; context.fillRect(-rectWidth/2,-rectHeight/2,rectWidth,rectHeight); // Вставка символа context.font="30pt Calibri"; context.textAlign="center"; context.fillStyle="#0000ff"; context.fillText("Ю",0,15); }, 200); </script> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> </body> </html> |
Цитата:
|
Наверное он просил это (чистый JS):
setInterval(function() { var canvas=document.getElementById("myCanvas"); var context=canvas.getContext("2d"); // Очистка холста context.clearRect(0, 0, canvas.width, canvas.height); // Размеры квадрата. var rectWidth = 40; var rectHeight = 40; // Расчет угла поворота по часовой стрелке var q1 = Math.floor((Math.round(Math.random()*10))/4); var q2 = Math.floor((Math.round(Math.random()*10))/4); // Расчет смещения стимула по X и Y var x1 = 20+Math.round((Math.random()*10)); var y1 = 20+Math.round((Math.random()*10)); // var x2 = 100+Math.round(Math.random()*100)/10); // var y2 = 100+Math.round(Math.random()*100)/10); // Смещение начала осей координат в центр фигуры context.translate(canvas.width/2,canvas.height/2); // Смещение фигуры context.translate(x1,y1); //context.translate(-x2,-y2); // Поворот фигуры context.rotate(Math.PI/q1); context.rotate(Math.PI/q2); // Рисование квадрата context.fillStyle="#ff0000"; context.fillRect(-rectWidth/2,-rectHeight/2,rectWidth,rectHeight); // Вставка символа context.font="30pt Calibri"; context.textAlign="center"; context.fillStyle="#0000ff"; context.fillText("Ю",0,15); }, 200); |
Цитата:
|
Попробовал сделать цикл. Чтобы значение угла поворота квадрата не повторялось подряд. В чем я ошибся?
a=0; // Первое объявление переменных для проверки неповторения значения q var q=0; var qold=0; b=setInterval (function() { var canvas=document.getElementById("myCanvas"); var context=canvas.getContext("2d"); // Размеры квадрата. var rectWidth = 40; var rectHeight = 40; // Сохранение context.save(); // Очистка холста context.clearRect(0, 0, canvas.width, canvas.height); // Смещение начала осей координат в центр фигуры context.translate(canvas.width/2+Math.round((Math.random()*100)-50),canvas.height/2+Math.round((Math.random()*100)-50)); // Алгоритм поворота квадрата с проверкой неповторения значения q // Расчет угла поворота по часовой стрелке if (q==qold) { q = Math.floor((Math.random()*10)/3)*0.5;} // Поворот context.rotate(Math.PI*q); qold=q; // Рисование квадрата context.fillStyle="#ff0000"; context.fillRect(0,0,rectWidth,rectHeight); // Вставка символа context.font="30pt Calibri"; context.textAlign="center"; context.fillStyle="#0000ff"; context.fillText("W",20,33); a++; if(a==50){clearInterval(b)}; // Восстановление context.restore(); }, 1000); |
Zemsky,
Вариант... Цитата:
<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> <script> var a = 0; // Первое объявление переменных для проверки неповторения значения q var q = 0; var qold = 0; var b = setInterval(function () { var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); // Размеры квадрата. var rectWidth = 40; var rectHeight = 40; // Сохранение context.save(); // Очистка холста context.clearRect(0, 0, canvas.width, canvas.height); // Смещение начала осей координат в центр фигуры context.translate(canvas.width / 2 + Math.round((Math.random() * 100) - 50), canvas.height / 2 + Math.round((Math.random() * 100) - 50)); // Алгоритм поворота квадрата с проверкой неповторения значения q // Расчет угла поворота по часовой стрелке do { q = Math.floor((Math.random() * 10) / 3) * 0.5 } while (q == qold) // Поворот context.rotate(Math.PI * q); qold = q; // Рисование квадрата context.fillStyle = "#ff0000"; context.fillRect(0, 0, rectWidth, rectHeight); // Вставка символа context.font = "30pt Calibri"; context.textAlign = "center"; context.fillStyle = "#0000ff"; context.fillText("\u2603", 20, 33); a++; if (a == 50) { clearInterval(b) }; // Восстановление context.restore(); }, 1000); </script> </body> </html> |
Правильно ли я понял, что надо было применить другой цикл? Сейчас еще раз осмыслю. Спасибо! Продолжаю изучать. :)
|
для вашего варианта сколько раз прежнее значение может повторится за 50 шагов
for (var i = 0, k = 0, q = 0, qold; i < 50; i++) { if (q == qold) { q = Math.floor((Math.random() * 10) / 3) * 0.5; }; if (q == qold) k++; qold = q; } alert('50 -> ' + k) |
Часовой пояс GMT +3, время: 17:39. |
|