Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   правильная(!) Логика зацикливания анимации "туда - обратно". (https://javascript.ru/forum/misc/55601-pravilnaya-logika-zaciklivaniya-animacii-tuda-obratno.html)

_Walker 06.05.2015 12:01

правильная(!) Логика зацикливания анимации "туда - обратно".
 
Есть задача зациклить движение некоего объекта на странице. Важна именно логика поэтому работать будем с одной переменной - X.
Итак, задача такова:
1)X инициируется со значением 0
2)при каждой итерации он увеличивается на 0.1 и растёт до 1
3)как только он стал равен 1, он начинает уменьшаться до -1 с тем же шагом
4)опустившись до -1 он снова растет до 1
5)и так по кругу до бесконечности

Вопрос как правильно составить логику?

мой вариант(нерабочий):
var back,x,cicle;
	x = 0;
	back = !true;
cicle = setInterval(function(){
	if (!back) { x+=0.1;if (x>=1) {back = true;}} else {x-=0.1;if (x<=-1) {back = !true;}}
	console.log(x);
},100);


Вот что выдает этот скрипт:
(прошу прощения, я не нашёл как ставить спойлер)

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
0.9999999999999999
0.8999999999999999
0.7999999999999999
0.7
0.6
0.5
0.4
0.30000000000000004
0.20000000000000004
0.10000000000000003
2.7755575615628914e-17
-0.09999999999999998
-0.19999999999999998
-0.3
-0.4
... и так далее

Итак кто чем может помочь прошу под кат.

рони 06.05.2015 12:36

_Walker,
var x = 0, back = true,
cicle = setInterval(function(){
	x += back ? 0.1 : -0.1;
     if (x>1||x<0)  back = !back;
	console.log(x);
},100);

рони 06.05.2015 12:39

Цитата:

Сообщение от _Walker
мой вариант(нерабочий):

почему не рабочий?

_Walker 06.05.2015 13:08

Цитата:

Сообщение от рони (Сообщение 369635)
почему не рабочий?

потому что на тот момент я не понимал откуда берутся миллиардные доли и двойка. потом я нашёл .tofixed(1) и поправил ваш код для выполнения моей задачи
var x = 0, back = true,
cicle = setInterval(function(){
	x += back ? 0.1 : -0.1;
     if (x.toFixed(1)>=1||x.toFixed(1)<=-1)  back = !back;
	console.log(x.toFixed(1));
},100);


Я понимаю что этот .tofixed(1) можно вставить в одно место, чтоб код был аккуратнее, но пока не нашёл куда.
А ваш код просто красота!

Подскажите, что можно почитать чтоб прокачать скилы составления/расчета логики алгоритмов, в идеале в формате игры или курсов с заданиями типа KhanAcademy.
У меня нет программерского образования, но я когда-то заканчивал техникум на электронщика. Там мы решали задачи типа: сколько вариантов выходного сигнала будет при определённом количестве входящих сигналов, но уже многое позабыл. Это было очень увлекательно, теперь хочу вспомнить это и применять в программировании.

_Walker 06.05.2015 13:41

Цитата:

Сообщение от _Walker (Сообщение 369640)
if (x.toFixed(1)>=1||x.toFixed(1)<=-1)  back = !back;
	console.log(x.toFixed(1));


Я понимаю что этот .tofixed(1) можно вставить в одно место, чтоб код был аккуратнее, но пока не нашёл куда.

сделаю пока так:
x=x.toFixed(1);

рони 06.05.2015 16:27

_Walker,
читать учебник, он недавно обновился, качаться можно здесь на форуме - ссылки вверху :)

_Walker 06.05.2015 16:56

Цитата:

Сообщение от рони (Сообщение 369658)
_Walker,
читать учебник

Учебник про конкретный ЯП, а я хотел бы почитать именно про алгоритм решения задачи. Не знаю как правильнее сформулировать мой запрос. Я хочу получив задачу, сразу определить сколько у неё может быть ветвлений, т.е. сколько вариантов else надо проверять для каждого if, чтоб ничего не упустить. Есть ли доки направленные именно на это, а не на знание операторов и т.п. Или я хожу вокруг да около, но не вижу дальше своего носа?

UPD: Слышал краем уха, что есть такие штуки как паттерны - может я говорю именно о них? Повторюсь я хочу иметь в голове примерный план действий при обработке задачи, например:
1) проверить какие данные и в каком количестве приходят.
2) просчитать количество возможных комбинаций для проверок
3) построить дерево условий/зависимостей
4) написать код на любимом языке
5) сделать все проверки и быть уверенным, что ни при каких входных данных скрипт на выдаст исключение (Exception)
6) получить профит

tsigel 06.05.2015 19:05

_Walker,
я не думю что у вас получится понять программирование в целом, не изучая при этом конкретного языка. Все приходит с опытом и понимание алгоритмов и их нахождение. Опыт получается в ходе работы с конкретным языком. Да есть паттерны программирования, они часто подходят ко многим языкам программирования. А могут и не подходить (не все, а какие-то конкретные) или быть не нужными в силу особенностей языка. К тому же не думаю что вы осилите паттерны без знания хотябы одного языка опятьже.

Makarov 06.05.2015 23:00

Самый простой способ научиться решать задачи - это решать задачи. На лоу уровне ничего лучше мне неизвестно. Способности формализовывать задачи и оперировать большой цикломатической сложностью можно тренировать и искуственно, но я не знаю как делать это достаточно эффективно.

Паттерны - это уже имхо advanced уровень, когда ты умеешь нормально писать на каком-то языке и озабочен всякими архитектурными задачами и взаимодействием с другими разработчиками.

Теперь про алгоритмическую подготовку.Нужно понимать одну вещь: алгоритмическая подготовка - вещь безусловно очень полезная для программирования, но в основном потому что она мозги шевелиться заставляет. Для работы хорошее знание тех или иных алгоритмов пригождается немногим. Если чисто для себя интересно - другое дело.

К конкретике:
Решение практических задач:
basic - любой задачник по информатике/учебник с задачами (в том числе учебник Кантора конечно), студенты набегающие в сессию на множество программистских форумов, работа
middle - работа

Паттерны:
basic - ненене!
middle - банда четырех

Алгоритмы:
Basic: Теория - мне понравилась 1я часть этого курса на курсере от того же автора. Она там где-то есть, просто искать лень).
Ну то есть это не basic-для идиотов, но достаточно понятно. Курса для идиотов по алгоримам мне неизвестно)
Практика: Идешь на topcoder.com, регишься, смотришь список задач на algorithm competition и пытаешься решить самые легкие из них.
Advanced - хз, я еще близко не адвансед, но думаю продолжение тех же алгокурсов и решение более сложных задач могут помочь

Хрена я много написал, мне бы это лень читать было

_Walker 07.05.2015 12:14

tsigel
Спасибо, за отклик. Я понимаю что учить ЯП необходимо, но меня интересовал вопрос именно по теории программирования.
Я, увы, не учился в институте - у нас, к сожалению, нет нормальных ВУЗов, где работают знающие (читай - практикующие) преподы, и где дают знания, а не собирают урожай "зелёных листиков" каждую сессию. Покупать диплом в течении 4-5ти лет мне не улыбается, поэтому изучаю то, что необходимо конкретно мне, и для конкретных задач.


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