Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2014.01.19;
Скачать: [xml.tar.bz2];

Вниз

Поделить отрезок на N неравных частей   Найти похожие ветки 

 
Vulko   (2011-11-07 17:00) [0]

Задача такая, есть 2 значения угла поворота (предыдущее и текущее), нужно интерполировать заданное количество значений между ними. Линейная интерполяция устраивает всем, но есть один минус, если количество значений слишком большое, отрисовка поворота 3д сцены на экране начинает занимать слишком много времени, но движения плавные.

Идея заключается в том, чтобы сделать поворот 3д сцены с ускорением и замедлением, что-то вроде распределения максвелла, если кто знаком с физикой.

Т.е. нужно нелинейно разбить отрезок [a, b], чтобы ближе к середине отрезка шаг разбиения был меньше, а ближе к концам больше. Причем количество разбиений задано жестко.

Если бы речь шла о функции на отрезке, все гораздо проще. А вот разбить неравномерно отрезок...
Никак не соображу алгоритм, может кто сталкивался и что подскажет?


 
Sha ©   (2011-11-07 17:10) [1]

Например, кубическая парабола на отрезке [-1..1]:
по х задаешь равные отрезки, по у получаешь неравные.


 
Сергей М. ©   (2011-11-07 17:18) [2]

Для расчета приращения шага разбиения задействуй любую подходящую симметричную ф-цию: аргументом ей задавай индекс шага, а значение ф-ции будет коэф-том приращения шага.


 
Inovet ©   (2011-11-07 17:19) [3]

Или таблично.


 
Vulko   (2011-11-08 10:48) [4]


> Для расчета приращения шага разбиения задействуй любую подходящую
> симметричную ф-цию: аргументом ей задавай индекс шага, а
> значение ф-ции будет коэф-том приращения шага.


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


> Например, кубическая парабола на отрезке [-1..1]:по х задаешь
> равные отрезки, по у получаешь неравные.

читайте чуть выше, не все так просто как хотелось бы :)


 
Inovet ©   (2011-11-08 10:56) [5]

> [4] Vulko   (08.11.11 10:48)
> Такое приращение приведет к выходу из заданных границ, т.к.
> интерполирую одномерный массив, в котором заданы значения
> на прямой.

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


 
Sha ©   (2011-11-08 11:10) [6]

> читайте чуть выше, не все так просто как хотелось бы

а гораздо проще


 
Vulko   (2011-11-08 11:52) [7]


> > читайте чуть выше, не все так просто как хотелось быа
> гораздо проще



> Ерунда какая-то. Тебе надо ускорить отрисовку пропуском
> промежуточных значений. Т.е. при пропусках ты выходишь за
> границу, а без пропусков не выходишь.


Мужики, обрисуйте примерный алгоритм, никак не вкурю :)


 
Inovet ©   (2011-11-08 12:05) [8]

> [7] Vulko   (08.11.11 11:52)
> Мужики, обрисуйте примерный алгоритм, никак не вкурю :)

Если я тебя правильно понял, ты хочешь масштабировать по времени, но нелинейно. Линейно будет
ts = t * s
где s - const. Для нелинейного и функция соответсвующая
ts = t * f(t)
вот эту f(t) хочешь вычисляй, хочешь таблицу подготовь.

ts тебе будет аргументом для вычисления координат.


 
Vulko   (2011-11-08 12:26) [9]


> Если я тебя правильно понял, ты хочешь масштабировать по
> времени, но нелинейно. Линейно будетts = t * sгде s - const.
>  Для нелинейного и функция соответсвующаяts = t * f(t)вот
> эту f(t) хочешь вычисляй, хочешь таблицу подготовь.ts тебе
> будет аргументом для вычисления координат.


вот эту f(t) взял за t^4

в итоге делают так, step = Delta * x^4... где х = I. и вроде логика верная, но итак понятно что числа тут сумасшедшие вылазиют. Что-то с формулой напутал... хотя по графику который рисую с утра выходит так)

п.с. Delta - длинна отрезка [a,b]


 
Sha ©   (2011-11-08 12:29) [10]

Отрезок [a..b] отображаем на [-1..1], т.е. для любого t1 из этого отрезка считаешь
x:=2 * (t1 - a) / (b - a) - 1;

Затем искривляешь шкалу, т.е. вычисляешь, например: y:=x * x * x;
или y:= (x * x * x + x) / 2;  
главное, чтобы при этом, отрезок переходил сам в себя.

И, наконец, получаешь новое значение t2 для своего t1:
t2:=(y + 1) * (b - a) / 2 + a;

Т.е. если t1 – это одна из “равномерно расположенных” точек, то t2 – соответствующая ей “неравномерно расположенная”.

P.S. формулы можно упростить.


 
Vulko   (2011-11-08 12:51) [11]

Сложно получается с функциями. Может проще сделать сходящуюся к некому числу последовательность?


 
Vulko   (2011-11-08 12:52) [12]

вроде [a+1/n]... тока чтобы она к середине отрезка сходилась. слева, и еще одну которая будет справа сходиться.


 
Sha ©   (2011-11-08 12:54) [13]

> Сложно получается с функциями.

Сказано же - можно упростить.

> Может проще сделать сходящуюся к некому числу последовательность?

Последовательность - это функция от n.


 
Vulko   (2011-11-08 14:22) [14]

Сейчас делаю так:

последовательность (1 - 1 / (n+1)) * length[a,b], но зараза слишком быстро убегает значение. пробую варианты :)


 
Sha ©   (2011-11-09 12:09) [15]

А моя не убегает.
Для 2*n+1 точек (2*n отрезков) сначала вычисляем


c:=0.5*(a+b);
d:=1.0/n;
d:=d*d*d;
d:=0.5*(b-a)*d;


а потом в цикле перебираем сами точки деления

for i:=-n to n do begin;
 x:=i;
 x:=(x*x*x)*d+c;
 //тут работаешь с точкой x
 end;


 
oldman ©   (2011-11-09 14:36) [16]


> Т.е. нужно нелинейно разбить отрезок [a, b], чтобы ближе
> к середине отрезка шаг разбиения был меньше, а ближе к концам
> больше.


Длина следующего отрезка разбиения = длина отрезка от конца предыдущего отрезка разбиения до середины отрезка [a, b], деленная, например, на три.
Функция сходится к 0.
Середины не достигнешь никогда.

Ахилл и черепаха, блин.


 
oldman ©   (2011-11-09 14:42) [17]

то есть:

Xn+1 = Xn + (b - Xn)/C, где С - нужная тебе скорость


 
Sha ©   (2011-11-09 15:24) [18]

> oldman

Замедление автору в центре надо, а не на краю.
Хотя, на мой взгляд, по краям замедление было бы логичнее.

Ну, и еще задается n, а не c.


 
oldman ©   (2011-11-09 17:23) [19]

Жевать неохота...

"Я тебе идею выдал?" ©


 
Sha ©   (2011-11-09 18:15) [20]

Во-во.
У нас одни бомбардировщики вокруг.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2014.01.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
2-1363948120
ttt
2013-03-22 14:28
2014.01.19
Значения с плавающей точкой


15-1375272074
Юрий Зотов
2013-07-31 16:01
2014.01.19
Забавно


8-1233859275
Arslan
2009-02-05 21:41
2014.01.19
Конвертирование wav в mp3


15-1375303030
KilkennyCat
2013-08-01 00:37
2014.01.19
Просьба. Сделать хорошо Virtual TreeView


15-1375128275
Jeer
2013-07-30 00:04
2014.01.19
С прошедшим Днем ВМФ - мореманов!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский