LINUX.ORG.RU

Программка для генерации таблиц анимации плавности (easing)

 ,


0

1

Понадобился мне инструмент генерации дискретных координат для анимации - написал программку.
Заодно прикрутил графический режим, чтобы можно было поиграться с параметрами перед генерацией таблиц координат

https://github.com/codemeow/doner / LGPL

Пример результирующих анимаций: https://github.com/codemeow/doner/raw/master/readme/output.gif

Нужна для генерации координат положения объекта по времени согласно заданной функции.

Режим генерации таблиц:

    doner -m table -e insine -f "   .byte $%02x, " -c "$%02x, " -l "$%02x" -k 255
   .byte $00, $00, $00, $00, <...> $0b, $0d, $0f, $12
   .byte $14, $14, $17, $19, <...> $3c, $40, $44, $48
   .byte $4d, $4d, $52, $56, <...> $8b, $90, $96, $9c
   .byte $a2, $a2, $a8, $ae, <...> $ec, $f2, $f9, $ff

Режим графика:

$ ./doner -e inelastic
Easing:
    inelastic
Graph :
    Min:   -0.373
    Max:    1.000

⠀⠀⡆⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⠀⡀⠀⠀⡀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⠀⠀⠀
⠀⠀⡇⠀⣴⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀
⠀⠀⡇⠀⠻⠜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠒⠉⠉⠉⠒⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠐⠒⡗⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠚⠛⠛⠛⠛⠒⠒⠒⠶⠶⣒⣒⣒⣒⠶⠖⠚⠓⠒⠒⠒⠒⠒⠒⠒⠲⠒⠒⠒⠒⠒⠒⠒⠒⠚⠒⠒⠒⠒⠒
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠡⠀⠀⠀⠀⠀⠀⢀⠁⠀⠀⠀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⡀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⠀
⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢄⠀⠀⡐⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀

Имеет настройку выбора функции из 30 вариантов х 4 модификации входных координат (orig/inv X, orig/inv Y). Множитель и слагаемое для функции (F(x +a) + b), размер генерируемой таблицы, printf-форматтер для первого значения строки таблицы и последнего отдельно, автоматический парсинг входящей fmt для правильного приведения типа (всё считается в double, при выводе в int-округляется).

tldr;
Вместо того чтобы жмыхаться в excel каждый раз когда надо что-то перегенерировать можно поменять параметр в консоли и получить уже отформатированную под ваш язык программирования таблицу.

Критика принимается, issue принимаются.

★★★★★

Последнее исправление: PPP328 (всего исправлений: 1)

Норм, но вот эта фраза

Вместо того чтобы жмыхаться в excel каждый раз когда надо что-то перегенерировать

несколько испортила впечатление. Из неё выходит что раньше ты не только рассматривал excel как вариант, но даже пользовался им для программирования. А это виндузятно-оффтопная прога для секретарш.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Из неё выходит что раньше ты не только рассматривал excel как вариант, но даже пользовался им для программирования.

Никто не говорит «копировальный аппарат», все говорят Xerox. Никто не говорит LibreOffice Calc, все говорят «Excel».

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Никто не говорит LibreOffice Calc, все говорят «Excel».

Разницы никакой. Что то «прога для секретарш», что это. Ну да, не столь виндузятно-оффтопная. Хотя по духу вполне.

P.S. А прога вроде прикольная. Респект.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Что то «прога для секретарш», что это

Ну печально, если вы так считаете. Это инструмент. В первую очередь для анализа данных. Программисту удобен тем, что можно заряжать формулы и считать их для входных данных, однократно генерируя результат. Это всё равно, что считать MathLab - «прогой для студентов».

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Я всё же немного сдам назад и обращу ваше внимание на то, что я взял «прога для секретарш» в кавычки. Я сам таких категоричных заявлений не делаю, использовал, потому что комментатор выше именно так выразился, а я отвечал больше о том, что в контексте обсуждения до этого принципиальной разницы между Excel и Calc нет (кроме «виндузятности»). Используйте, что вам удобно, конечно — я не против. Хотя лично мне при программировании, для того, чтобы «заряжать формулы и считать» никогда ни Calc ни Excel не требовались и не были бы удобны. Проще воспользоваться чем-то привычнее и легче.

CrX ★★★
()
Ответ на: комментарий от CrX

Проще воспользоваться чем-то привычнее и легче.

Тоже так считаю. Если пишешь программы то самое привычное - это компилятор, им и пользуюсь всегда для любых расчётов (в моём случае gcc).

firkax ★★★★★
()
Ответ на: комментарий от firkax

excel действительно годен, когда тебе надо быстро какие-то csv/tsv осмотреть и прикинуть что с данными в них, при условии что csv/tsv достаточно малы. Это быстрее и надёжнее чем возиться с питоном и pandas-ом. Если файлы велики, то лучше брать openrefine от гугла и пользоваться уже им - быстрее будет и удобнее. Ну а если они настолько велики что и туда не лезут/обрабатываются слишком долго, то всё равно нет смысла брать pandas и python, тогда надо расчехлять postgresql/mysql и обрабатывать данные там по большей части на sql, иногда вытягивая их в python если надо что-то библиотечное/то что на sql писать замучаешься. Вообще практический опыт показал что pandas годится разве что на дипломы студентам или на суперкомпах (ну и когда «специалисты» по большим данным не осилили sql). Потому как даже при всех оптимизациях память кушает как не в себя, простенький датасет на 1 гигабайт файлик он уже на машинке с 64 гигами оперативки очень хорошо память кушает или очень медленно работает, так что там копейки остаются, а ведь ещё сама моделька которую ты учишь тоже гигов 40 минимум на себя требует (про большие модели и говорить нечего, но там уже и машинки нужны с 512+ оперативки). Я тестировал на файликах 100 мегабайт, 500 мегабайт и 1 гигабайт, на 100 лучше всего exel, если столбцов и строк в пределах допустимого, на 500 openrefine, дальше postgresql. В теории есть ещё всякие апачи, но там уже совсем хорошее железо надо или когда данные в более сыром виде в даталейке лежат или их ещё больше, скажем 1 терабайт+, то там тоже понятно что инструменты нужны другие, вроде кассандры для сверхбольших сырых баз или хадупа/спарка.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

Как я уже выше написал, я для всего этого обычно пользуюсь gcc (т.е. пишу прогу на C которая распарсит всё что нужно и сделает всё что нужно). Иногда можно на пхп (тяп-ляп). Иногда можно хранить числа в базе (использую mysql), но это только за неимением времени писать более эффективное хранилище на том же Си. Excel и его клонами никогда ни для чего не пользовался, питоном тоже, а что такое pandas и openrefine даже не знаю, «от гугла» значит в чёрном списке.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Охотно верю что на Си можно сделать всё. Вопрос в количестве времени. Обычно тебе за неделю/месяц надо готовую модельку сделать, которая, например, будет, скажем с точностью 80+% сортировать заявки пользователей на каком-то сайте/сервисе или предсказывать какие-то параметры, скажем для примера, котировки акций на завтра точнее, чем у всех конкурентов. Скорее всего на сишке ты весь месяц будешь готовить инструменты для хранения и обработки данных, а так как ошибка в обработке будет всю модель ломать, то тебе ещё придётся всё тестами покрыть полностью или потом на этапе обучения который сам может месяц чисто на обучение потратить при написанном коде и подготовленных данных можно увидеть странности/получить результаты которые при попытке внедрения окажутся принципиально неработоспособными, например, в так называемых научных статьях от так называемых известных мировых учёных ведущих ВУЗ-ов и НИИ мира (MIT всякие там, Стенфорды и иже с ними) по моему скромному опыту ошибки которые принципиально делают модель нерабочей это 50% всех исследований. Иногда авторы ошибаются и не видят ошибку, иногда понимают что где-то ошиблись и начинают фантазировать чтоб результаты более-менее соответствовали результатам конкурентов, я даже видел как столбец с промежуточным результатом в датасет подмешивали чтоб точность набрать лучше чем у конкурентов (это когда с данными на гитхабе вываливали, исключаешь его и оп 95% точности становится 70). А другие учёные это видят, но негативно про ошибки писать не будут как правило, потому как нет смысла ссориться с MIT и говорить на весь мир что там дураки работают, потом будет очень трудно публиковаться/сотрудничать - сожрут.

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

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)

Вроде работает, скомпилять программу, внутри сделать файлик main.lua запустить love .

local image = nil;
local anima = nil;
local anicount = 1;
local center = 150;
local typecount = 1;
local atypes =
{
      "insine",    "inquad",    "incubic",    "inquart",      "inquint",
      "inexpo",    "incirc",    "inback",     "inelastic",    "inbounce",
      "outsine",   "outquad",   "outcubic",   "outquart",     "outquint",
      "outexpo",   "outcirc",   "outback",    "outelastic",   "outbounce",
      "inoutsine", "inoutquad", "inoutcubic", "inoutquart",   "inoutquint",
      "inoutexpo", "inoutcirc", "inoutback",  "inoutelastic", "inoutbounce"
}

function lerp (a, b, t)
    return a + (b - a) * t
end


function gentable(atype)
    local animation = io.popen('./doner -m table -e '..atype..' -k 200  -c "%f,"'):read('*a');
    return load("return {"..animation.."};")();
end

function love.load()
    love.window.setTitle("LOR")
    local penguin = "https://www.linux.org.ru/img/good-penguin.png";
    os.execute('wget '..penguin..' -O img.png');
    image = love.graphics.newImage('img.png');
end

function draw_good(x,y,s)
    if image then
       love.graphics.draw(image,x,y);
    end
end
local ty ='';
function love.update(dt)
    if not anima then
       ty = atypes[typecount];
       typecount = typecount + 1;
       if typecount >= #atypes then typecount = 1; end
       anima = gentable(ty);
       anicount = 1;
       posx=center+anima[1];
    end

    if anicount+1 < #anima then
       posx = lerp(posx,center+anima[anicount+1],1)
       if posx >= center+anima[anicount+1] then
           anicount=anicount+1;
           posx=center+anima[anicount];
       end
   else
       anima = nil;
   end
end

function love.draw()
    love.graphics.setBackgroundColor(39/255,44/255,45/255,1)
    draw_good(posx,200);

    love.graphics.setColor(posx/255,posx/255,45/255,1)
    love.graphics.circle('line',100,150+posx,50)
    love.graphics.circle('fill',100,150+300-posx,50)

    love.graphics.setColor(1,1,1,1)
    love.graphics.print(typecount..' '..ty,300,150);

    love.graphics.setColor(posx/200,30*posx/200,posx/200,1)
    love.graphics.rectangle('fill',600,50,posx*0.5,posx*0.5,50,50)
end

Говнокод, но зато наглядно.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Критика принимается, issue принимаются.

Добавить разовые постфиксы/префиксы. Типа

--prefix = "local anim = {" -c "%f," --postfix = " }; return anim;"

Чтобы можно было просто ./doner optformat > animation_src.filetype например.

И да, лицензия LGPL что как бы намекает что можно дёргать как библиотеку, но API не понял как дёргать. Хотел сначала через ffi дрыгать получая кадры анимации.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

И да, лицензия LGPL что как бы намекает что можно дёргать как библиотеку, но API не понял как дёргать.

Лицензия такая чтобы не быть вирусной заразой.

Добавить разовые постфиксы/префиксы. Типа

Ну можно в принципе, просто я еще на разработке не особо вдуплял лично под мой кейс надо или нет. Типа я в редакторе руками мог подставить в начале заголовок массива. Но ок, в свободное время запилю

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от anonymous

На самом деле достаточно удобный прием, когда на один файл одна публичная функция. А все остальные статики. Тогда а) файл более очевидно структурирован б) понятно где искать конкретную публичную декларацию

PPP328 ★★★★★
() автор топика