Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   canvas rotate center (https://javascript.ru/forum/project/11949-canvas-rotate-center.html)

Gozar 22.09.2010 21:00

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, нет ли решения по проще, например указания точки смещения центра?
Если нет то просьба тыкать во все узкие места скрипта. Ну а остальным просто дарю :)

Octane 23.09.2010 02:50

rotate — зло, оси трогать не надо, лучше использовать трансформацию

Slawaq 24.09.2010 03:33

о боже, как же мне это надо было, хотя, всё таки точка смещения нужна бы была бы, но ничё и так придумаем как без неё)

Gozar 24.09.2010 08:58

Цитата:

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

Собственно ваши рассуждения в одной из тем и навели меня на мысль написать подобный скрипт.

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

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


Однако по совету Octane я перепишу этот скрипт, думаю что он прав, а вообще я скрипт почти не тестировал, ни на скорость ни на баги :)

Gozar 20.10.2010 22:47

Цитата:

Сообщение от Octane (Сообщение 71662)
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. Ты это имел в виду, или можно как-то по другому вращать объект?

Octane 21.10.2010 09:47

Положение каждого нового элемента зависит от того, где нарисовали предыдущий, если при этом использовался rotate. Rotate вращает оси, что не хорошо, если на канвасе что-то пытаются нарисовать разные ничего не знающие друг о друге функции. Можно конечно каждый раз возвращать оси в исходное положение, но по опыту OpenGL-программирования, могу сказать, что лучше взять за правило использовать setTransform для начала рисования каждого нового элемента и transform в место rotate для поворотов в локальном контексте. Rotate обычно используют для вращения камеры, но так тут речь о 2D то этот метод практически не нужен оказывается.

monolithed 21.10.2010 13:53

блин, голова закружилась о этой картинки

розовый слоник 22.03.2012 04:16

охохо)) решил познать canvas и запнулся на ротейте а тут живой пример)) большое спс))

Gozar 22.03.2012 09:45

Цитата:

Сообщение от розовый слоник (Сообщение 164385)
большое спс))

на здоровье. ))

dmitriymar 22.03.2012 10:26

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

B~Vladi 22.03.2012 10:42

Gozar, стоит начать отучаться от использования arguments.callee :)

Виктор Кон 22.03.2012 11:23

Вот тут

http://vikohn.narod.ru/test/exam02b.htm

код, где смещение делается автоматически типа

c.drawImage(img,-img.width/2,-img.height/2);

и вроде работает. Правда вращать не пробовал.

Gozar 22.03.2012 11:24

Откройте глаза этим скриптам 2 года. Не занимайтесь некропостингом, либо выложите свой пример.

Виктор Кон 22.03.2012 11:38

Может каким-то скриптам и 2 года, не знаю, я их не видел. А пример я выложил в интернет, этого вполне достаточно. Зачем переписывать?

Gozar 22.03.2012 11:52

Виктор Кон, я не к вам обращался. Вы можете ничего не делать. Ваш пример не имеет никакого отношения к теме, как и все комментарии в ней.

Цитата:

Сообщение от Виктор Кон (Сообщение 164413)
Может каким-то скриптам и 2 года, не знаю, я их не видел.

Невнимательность не делает вам чести. Если вы не видели первый пост, то зачем пишете комментарии в теме?

dmitriymar 22.03.2012 12:15

Кстати кто нибудь делал тесты на производительность между поворотом канвы и матрицей трансформации?
Без теста,возможно субъективное мнение:
при повороте -просто "поворот системы координат" происходит(пересчёт массива точек изображения)
при трансформации -сохранение,трансформация(п ересчёт массива точек изображения),восстановлени е
итого 3 операции вместо одной

vadim5june 23.05.2012 12:10

Цитата:

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

<!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="280" height="280"></canvas>
<script>
function CanvasCenter(){
var i = new Image();
i.onload = function(){
 var dl = i.width;
var cnv=document.getElementById("ci"); 
var c = cnv.getContext("2d");
   c.drawImage(i, 0, 0, dl, dl);
       var beta = -3;           
var beta = (beta*Math.PI)/360;
var bet=0;      
var x=100;
var y=100;                           
setTimeout(function(){
  bet+=beta; 
c.clearRect(0,0,cnv.width,cnv.height);
c.save();
c.translate(x,y);
c.rotate(bet);
c.drawImage(i, -dl/2, -dl/2);
c.restore();
setTimeout(arguments.callee,10);
                 },0);
}
i.src = "http://javascript.ru/forum/image.php?u=11&dateline=1273676600";
};
CanvasCenter();
</script>
</body></html>
Вот мой вариант-смешение можно задавать
rotate постоянно пользуюсь
а для того чтобы записать и вернуть текущий контест служат функции save() и restore()-

Gozar 10.06.2012 10:46

И всем кто не в теме test123456789test, это клон Awillum-а(cms он усиленно пиарил). Только его забанили за мат и неуважительное отношение к товарищам.

Awilum 27.09.2012 00:28

Цитата:

это первый мой код связанный с canvas
Мой первый код связанный с canvas - это полноценный играбильный арканоид с левелами.

А что у тебя ? О_о

Awilum 27.09.2012 00:34

Автор какое следующие твое творение ? Смотрю на твой профиль и топики http://javascript.ru/forum/search.php?searchid=1206089 и вижу что ты мастер флудерастии. А что нибудь выучить за такое время до сих пор не осилил ? Все также сидишь нищерброд в общаге на бутербродах ? )))

Gozar 27.09.2012 16:00

Цитата:

Сообщение от Awilum
Мой первый код связанный с canvas - это полноценный играбильный арканоид с левелами.

Мой первый код в js был вообще такой:
document.write('hello world');

Хочешь буду им гордиться? ;)

Gozar 27.09.2012 16:04

Цитата:

Сообщение от Awilum
А что нибудь выучить за такое время до сих пор не осилил

Хочешь стать мне экзаменатором? Кишка тонка.

Цитата:

Сообщение от Awilum
Все также сидишь нищерброд в общаге на бутербродах

Эх, молодость, молодость. Стар я для этого. Смотря кто с чем бутерброды ест. Я не стесняюсь, жру с икрой жирных тролей :)

Awilum 27.09.2012 20:21

>>Хочешь буду им гордиться?
хахаа ну ты же гордишься этой подделкой))

>>Эх, молодость, молодость. Стар я для этого.
кто тебе доктор ? нужно было пары в универе не прогуливать, может быть тогда у тебя были бы хоть какие то шансы устроиться программистом. И работать над серьезными проектами, а не над этой хренью что ты тут всем показываешь. Такое должно лежать на полке в дальнем углу, что бы никто его даже не видел, а не на публику выкладывать.

Gozar 27.09.2012 22:05

Цитата:

Сообщение от Awilum
хахаа ну ты же гордишься этой подделкой))

Дайка подумать секунду, ну, мне пофиг, горжусь ли?! Да я забыл об этом давным давно. Этот скрипт был написан потому, что некоторые на форуме мучились и не знали с чего начать изучение canvas. Горжусь ли я что я кому-то им помог?! Вряд ли. Скорее мне приятно думать, что он хоть кому-то принес пользу.

Цитата:

Сообщение от Awilum
кто тебе доктор ? нужно было пары в универе не прогуливать, может быть тогда у тебя были бы хоть какие то шансы устроиться программистом. И работать над серьезными проектами, а не над этой хренью что ты тут всем показываешь. Такое должно лежать на полке в дальнем углу, что бы никто его даже не видел, а не на публику выкладывать.

Вот ведь ты упоротый отморозок. У меня две вышки если чё. Быть программистом это что вершина возможностей и желаний? Этому скрипту почти три года и я настоятельно рекомендую его не рассматривать, о чём и заявил в открытую, когда вы пытались заняться некрофилией.
Цитата:

Сообщение от Gozar
Откройте глаза этим скриптам 2 года. Не занимайтесь некропостингом, либо выложите свой пример.

Если я буду помнить всю фигню, которую написал за 10 лет писанины, то что мне это даст?

Awilum 30.09.2012 03:36

>>Этому скрипту почти три года
Ух как ты вырос за три года. Еще может какие то проекты реализовал ?

>>Быть программистом это что вершина возможностей и желаний?
Че базаришь тогда если в теме не соображаешь ?

>>У меня две вышки если чё.
Слесарь и сварщик. С тобой все ясно.

Gozar 30.09.2012 13:58

Цитата:

Сообщение от Awilum
Еще может какие то проекты реализовал ?

Есть такое, только ведь этот скрипт не проект. Или ты все скрипты написанные за 20 минут называешь проектами?

Цитата:

Сообщение от Awilum
>>Быть программистом это что вершина возможностей и желаний?
Че базаришь тогда если в теме не соображаешь ?

Для меня это звучит также бессвязно как: - "Ты кошатину вилка включил свет что?". Одно из другого не следует. Скорее это просто выражение обиды. Извини.

Цитата:

Сообщение от Awilum
>>У меня две вышки если чё.
Слесарь и сварщик. С тобой все ясно.

И давно этим специальностям учат в институтах? Может ты живешь в стране где на эти специальности нужно учиться в институте? Я - нет. Но я заодно отвечу на твоё высказывание, т.к. это даже не вопрос. Всегда был далек от слесарей и сварщиков, и заодно и токарей.

Мне приятно твое внимание, с нетерпением будут ждать новые твои высказывания.


Часовой пояс GMT +3, время: 21:11.