Javascript.RU

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

Анимация через линейную функцию
Вот сделал:
<html>
<head>
<script language="javascript">
function start() {
var string_start_x = document.person.style.left;
var string_start_y = document.person.style.top;
var start_x = Number(string_start_x.slice(0, string_start_x.length - 2));
var start_y = Number(string_start_y.slice(0, string_start_y.length - 2));
var end_x = Number(document.data.x.value);
var end_y = Number(document.data.y.value);
var x = start_x;
var y = start_y;
var inc_x = (start_x < end_x)? 1: -1;
var inc_y = (start_y < end_y)? 1: -1;
move(start_x, end_x, inc_x, start_y, end_y, inc_y);
}

function move(x, end_x, inc_x, y, end_y, inc_y) {
if ((x == end_x) && (y == end_y)) return; 
if (x != end_x ) x += inc_x;
if (y != end_y ) y += inc_y;
document.person.style.left = x + "px";
document.person.style.top = y + "px";
setTimeout(move, 10, x, end_x, inc_x, y, end_y, inc_y);
}

</script>
</head>
<body>
<form name="data">
X:
<input type="text" name="x">
<br>
Y:
<input type="text" name="y">
<br>
<input type="button" value="Старт" onClick="start()">
</form>
<img id="person" style="position: absolute; top: 100px; left: 500px;" width=200 height=200 src="images/search.jpg">
</body>   
</html>

Но проблема: картинка движется не по кратчайшему пути(сначало доходит до меньшего значения x или y, а потом движется уже только по 1 значению
Не вобщем вот картинка:

Потом я решил сделать это при помощи линейной функции y = kx + b,
только вот что-то не получается. Вот код:
<html>
<head>
<script language="javascript">
function start() {
var string_start_x = document.person.style.left;
var string_start_y = document.person.style.top;
var start_x = Number(string_start_x.slice(0, string_start_x.length - 2));
var start_y = Number(string_start_y.slice(0, string_start_y.length - 2));
var end_x = Number(document.data.x.value);
var end_y = Number(document.data.y.value);
var inc_x = (start_x < end_x)? 1: -1;
var inc_y = (start_y < end_y)? 1: -1;
var k = (end_y - start_y)/(end_x - start_x) 
var b = (end_x*start_y - start_x*end_y)/(end_x - start_x) 
move(start_x, end_x, inc_x, start_y, end_y, inc_y, k, b);
}

function move(x, end_x, inc_x, y, end_y, inc_y, k, b) {
if ((x == end_x) && (y == end_y)) return; 
if (x != end_x ) {
var x += inc_x;
var y = k*x + b;
}
document.person.style.left = x + "px";
document.person.style.top = y + "px";
setTimeout(move, 10, x, end_x, inc_x, y, end_y, inc_y, k, b);
}

</script>
</head>
<body>
<form name="data">
X:
<input type="text" name="x">
<br>
Y:
<input type="text" name="y">
<br>
<input type="button" value="Старт" onClick="start()">
</form>
<img id="person" style="position: absolute; top: 100px; left: 500px;" width=200 height=200 src="images/search.jpg">
</body>   
</html>

Помогите исправить ошибку во 2 коде, или доработать его! заранее спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 22.11.2013, 20:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Apelcun77
я решил сделать это при помощи линейной функции y = kx + b
В этом случае у тебя должен инкреминироваться только X. Значение Y определяется функциональной зависимостью...
Ответить с цитированием
  #3 (permalink)  
Старый 23.11.2013, 00:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

http://learn.javascript.ru/play/otaXU

http://learn.javascript.ru/js-animation
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2014, 04:57
Аспирант
Отправить личное сообщение для Skriptor Посмотреть профиль Найти все сообщения от Skriptor
 
Регистрация: 08.12.2014
Сообщений: 31

Также интересует данный вопрос.
Как нужно изменить вышеуказанный код для того, чтобы x и y изменялись одновременно и картинка двигалась по прямой?
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2014, 08:30
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Skriptor,
http://learn.javascript.ru/js-animation

Когда прочтете, то для функции animate можно передать такую функцию step:
var animatedParams = [
 {
   name: "width", 
   start: 100,
   end: 250
 },
   name: "left",
   start: 15,
   end: 78
 }
];

var animatedElement = ...;

var step = function (progress) {
  animatedParams.forEach(function (animatedParam) {
    animatedElement.style[animatedParam.name] = (animatedParam.start + (animatedParam.end - animatedParam.start) * progress) + "px";
  });
}


animatedParams - массив параметров которые надо анимировать с именем анимируемого стиля, стартовым и конечным значением
animatedElement - элкмент который анимируем

Таким образом можно анимировать сколько угодно параметров в едениуц времени. Только такая функция не предполагает префиксов для CSS3, но направление мысли должно быть ясно

Последний раз редактировалось tsigel, 26.12.2014 в 08:56.
Ответить с цитированием
  #6 (permalink)  
Старый 26.12.2014, 16:30
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Была похожая тема
requestAnimationFrame или setInterval
Ответить с цитированием
  #7 (permalink)  
Старый 26.12.2014, 17:36
Аспирант
Отправить личное сообщение для Skriptor Посмотреть профиль Найти все сообщения от Skriptor
 
Регистрация: 08.12.2014
Сообщений: 31

Сообщение от tsigel Посмотреть сообщение
animatedParams - массив параметров которые надо анимировать с именем анимируемого стиля, стартовым и конечным значением
animatedElement - элкмент который анимируем
Это немного концентрированно, а хотелось бы понять логику алгоритма "на пальцах" как говорится. То есть, исходя из первоначально изложенного кода здесь в теме.
Сообщение от ksa Посмотреть сообщение
В этом случае у тебя должен инкреминироваться только X. Значение Y определяется функциональной зависимостью...
Что Вы имеете в виду? Что нужно исправить в коде для этого?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выполнить функцию через открытое окно из родительской страницы Влад31/08/2000 Элементы интерфейса 2 29.04.2013 18:28
Как через динамическую втавку в страницу автоматически вызвать функцию javascript? Roberts AJAX и COMET 2 19.03.2013 12:32
Как обратиться к переменной внутри объекта, в произвольной функцию через его метод platedz Элементы интерфейса 15 25.08.2012 00:03
Установка цвета через функцию .css() сбрасывает цвет для :hover xintrea jQuery 4 18.08.2012 15:38
Через argument.callee не получается переписать функцию. Jurasmi Общие вопросы Javascript 2 23.03.2011 12:54