Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.09.2010, 21:00
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

canvas rotate center
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body>
<canvas id="ci" width="80" height="80"></canvas>
<script>
function CanvasCenter(){
var i = new Image();
i.onload = function(){
                            var dl = i.width;
                            var c = document.getElementById("ci").getContext("2d");
                            c.drawImage(i, 0, 0, dl, dl);
                            var beta = -3; //угол поворота, если минус то против часовой
                            var beta = (beta*Math.PI)/360;
                            var l = (Math.sqrt(dl*dl+dl*dl))/2;

                            var gam = Math.PI - ((Math.PI - (beta * Math.PI)/360)/2) - (Math.PI/4);
                            var b = 2*l*Math.sin(beta/2);

                            setTimeout(function(){
                                c.clearRect(0,0,dl,dl);
                                var x = b*Math.sin(gam);
                                var y = b*Math.cos(gam);
                                c.translate(x,-y);
                                c.rotate(beta);
                                c.drawImage(i, 0, 0, dl, dl);
                                c.restore();
                                setTimeout(arguments.callee,10);
                            },0);
}
i.src = "http://javascript.ru/forum/image.php?u=11&dateline=1273676600";
}
CanvasCenter();
</script>
</body></html>

Наклепал тут небольшой код по вращению фотки вокруг своего центра на canvas.
Сразу вопрос, т.к. это первый мой код связанный с canvas, нет ли решения по проще, например указания точки смещения центра?
Если нет то просьба тыкать во все узкие места скрипта. Ну а остальным просто дарю
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 24.09.2010 в 09:06.
Ответить с цитированием
  #2 (permalink)  
Старый 23.09.2010, 02:50
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

rotate — зло, оси трогать не надо, лучше использовать трансформацию
Ответить с цитированием
  #3 (permalink)  
Старый 24.09.2010, 03:33
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

о боже, как же мне это надо было, хотя, всё таки точка смещения нужна бы была бы, но ничё и так придумаем как без неё)
Ответить с цитированием
  #4 (permalink)  
Старый 24.09.2010, 08:58
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от Slawaq Посмотреть сообщение
о боже, как же мне это надо было, хотя, всё таки точка смещения нужна бы была бы, но ничё и так придумаем как без неё)
Собственно ваши рассуждения в одной из тем и навели меня на мысль написать подобный скрипт.

Точку смещения можно легко указать:
c.drawImage(i, 0, 0, dl, dl);

c.drawImage(i, 30, 30, dl, dl); //30 относительно центра


Однако по совету Octane я перепишу этот скрипт, думаю что он прав, а вообще я скрипт почти не тестировал, ни на скорость ни на баги
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #5 (permalink)  
Старый 20.10.2010, 22:47
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от Octane Посмотреть сообщение
rotate — зло, оси трогать не надо, лучше использовать трансформацию
Octane,
разъясни пожалуйста что ты имел в виду, я чего-то не понимаю или не догоняю?

хоть намекни

Я не учил в школе матрицы. У меня получается точно такой же скрипт. С почти незначительным изменением.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body>
<canvas id="ci" width="80" height="80"></canvas>
<script>
function CanvasCenter(){
var i = new Image();
i.onload = function(){
                            var dl = i.width;
                            var c = document.getElementById("ci").getContext("2d");
                            c.drawImage(i, 0, 0, dl, dl);
                            var beta = -3; //угол поворота, если минус то против часовой
                            var beta = (beta*Math.PI)/360;
                            var l = (Math.sqrt(dl*dl+dl*dl))/2;

                            var gam = Math.PI - ((Math.PI - (beta * Math.PI)/360)/2) - (Math.PI/4);
                            var b = 2*l*Math.sin(beta/2);

                            setTimeout(function(){
                                c.clearRect(0,0,dl,dl);
                                var x = b*Math.sin(gam);
                                var y = b*Math.cos(gam);
                                c.transform(Math.cos(beta), Math.sin(beta), -Math.sin(beta), Math.cos(beta), x, -y);
                                c.drawImage(i, 0, 0, dl, dl);
                                c.restore();
                                setTimeout(arguments.callee,10);
                            },0);
}
i.src = "http://javascript.ru/forum/image.php?u=11&dateline=1273676600";
}
CanvasCenter();
</script>
</body></html>


rotate + translate = matrix. Ты это имел в виду, или можно как-то по другому вращать объект?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #6 (permalink)  
Старый 21.10.2010, 09:47
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Положение каждого нового элемента зависит от того, где нарисовали предыдущий, если при этом использовался rotate. Rotate вращает оси, что не хорошо, если на канвасе что-то пытаются нарисовать разные ничего не знающие друг о друге функции. Можно конечно каждый раз возвращать оси в исходное положение, но по опыту OpenGL-программирования, могу сказать, что лучше взять за правило использовать setTransform для начала рисования каждого нового элемента и transform в место rotate для поворотов в локальном контексте. Rotate обычно используют для вращения камеры, но так тут речь о 2D то этот метод практически не нужен оказывается.
Ответить с цитированием
  #7 (permalink)  
Старый 21.10.2010, 13:53
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

блин, голова закружилась о этой картинки
Ответить с цитированием
  #8 (permalink)  
Старый 22.03.2012, 04:16
Профессор
Отправить личное сообщение для розовый слоник Посмотреть профиль Найти все сообщения от розовый слоник
 
Регистрация: 17.10.2009
Сообщений: 258

охохо)) решил познать canvas и запнулся на ротейте а тут живой пример)) большое спс))
Ответить с цитированием
  #9 (permalink)  
Старый 22.03.2012, 09:45
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от розовый слоник Посмотреть сообщение
большое спс))
на здоровье. ))
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #10 (permalink)  
Старый 22.03.2012, 10:26
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Gozar,
всё норм . но чтоб не стирать всякий раз изображение перед рисованием нового используй globalCompositeOperation -управляет наложением графики

Последний раз редактировалось dmitriymar, 22.03.2012 в 10:31.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas масштабирование изображения+рисование zeddead Общие вопросы Javascript 2 23.10.2011 17:51
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16
И еще одна тема про canvas ;) 13rust Элементы интерфейса 8 21.09.2010 13:58
Меню на дивах Golovastik (X)HTML/CSS 38 13.09.2010 09:10
Онлайн фотошоп на canvas mycoding Общие вопросы Javascript 5 17.04.2010 22:02