









 
 




 
 


clipka <ano### [at] anonymousorg> wrote:
> Am 19.02.2019 um 06:18 schrieb Mike Horvath:
> > On 2/17/2019 7:27 AM, Tor Olav Kristensen wrote:
> >> #macro MacroName(StartTime, EndTime)
> >>
> >> Â Â Â Â #local R = (clock  StartTime)/(EndTime  StartTime);
> >> Â Â Â Â #local S = min(max(0, R), 1);
> >>
> >> Â Â Â Â S
> >>
> >> #end // macro MacroName
> >
> > What do you think would be a good way to gradually speed up and then
> > slow down the motions using this macro? I'm thinking it would require a
> > sine wave (or some other bell curve), but am not sure how to apply it.
>
> A spline might help with this.
Using a spline would delinearise the time variable, which isn't the idea. The
simplest way is to just use a cubic:
#macro Spline_Param(StartTime,EndTime)
//
#local LinParam = (clock  StartTime)/(EndTime  StartTime);
#local LinParam = min(max(0,LinParam),1);
//
#local SplineParam = 2*LinParam*LinParam*(3/2  LinParam);
//
SplineParam
//
#end // Spline_Param
but this doesn't have any adjustment. If you are interested in a constant
acceleration, followed by constant speed, followed by constant deceleration,
respond and I'll do it.
Post a reply to this message


 
 




 
 


Mike Horvath <mik### [at] gmailcom> wrote:
> On 2/17/2019 7:27 AM, Tor Olav Kristensen wrote:
> > #macro MacroName(StartTime, EndTime)
> >
> > #local R = (clock  StartTime)/(EndTime  StartTime);
> > #local S = min(max(0, R), 1);
> >
> > S
> >
> > #end // macro MacroName
>
> What do you think would be a good way to gradually speed up and then
> slow down the motions using this macro? I'm thinking it would require a
> sine wave (or some other bell curve), but am not sure how to apply it.
If you want to use a simple trigonometric function then I recommend using a
cosine wave, like this:
#macro MacroName(StartTime, EndTime)
#local R = (clock  StartTime)/(EndTime  StartTime);
#local S = min(max(0, R), 1)*pi;
#local T = (1  cos(S))/2;
T
#end // macro MacroName
Now S will vary between 0 and +pi. cos(S) will vary between +1 and 1. And T
will vary between 0 and +1.
https://upload.wikimedia.org/wikipedia/commons/d/d2/Sine_and_Cosine.svg

Tor Olav
http://subcube.com
https://github.com/tok/
Post a reply to this message


 
 




 
 


On 2/19/2019 9:42 AM, Tor Olav Kristensen wrote:
> Now S will vary between 0 and +pi. cos(S) will vary between +1 and 1. And T
> will vary between 0 and +1.
>
> https://upload.wikimedia.org/wikipedia/commons/d/d2/Sine_and_Cosine.svg
>
Thank you again. That is what I needed.
Mike
Post a reply to this message


 
 




 
 


Mike Horvath <mik### [at] gmailcom> wrote:
> On 2/19/2019 9:42 AM, Tor Olav Kristensen wrote:
> > Now S will vary between 0 and +pi. cos(S) will vary between +1 and 1. And T
> > will vary between 0 and +1.
> >
> > https://upload.wikimedia.org/wikipedia/commons/d/d2/Sine_and_Cosine.svg
> >
>
>
> Thank you again. That is what I needed.
>
>
> Mike
TOK's cosine formulation is actually extremely close to constant acceleration
for half the period followed by constant deceleration.
The following (tested in Matlab, not POVRay, but I think I've transliterated it)
allows for linear interpolation for AccFrac = 0, something very close to the
cosine for AccFrac = 0.5 (constant acceleration for half the period followed by
constant deceleration for the other half) or an acceleration followed by a
coast, followed by a deceleration for 0 < AccFrac < 0.5
#macro AccDec(StartTime,EndTime,AccFrac)
//
// AccFrac should be between 0 and 0.5. It will be clipped.
//
#local KFrac = min(max(0,AccFrac),0.5);
//
#local RelTime = (clock  StartTime)/(EndTime  StartTime);
#local RelTime = min(max(0,RelTime),1);
//
#if(KFrac = 0)
#local SP = RelTime;
#elseif(RelTime < KFrac)
#local SP = RelTime*RelTime/(2*KFrac*(1KFrac));
#elseif(RelTime < 1  KFrac)
#local SP = RelTime/(1KFrac)  KFrac/(2*(1KFrac));
#else
#local SP = 1  (1  RelTime)*(1  RelTime)/(2*KFrac*(1KFrac));
#end
SP
//
#end
Post a reply to this message


 
 




 
 


I will keep this in mind. Constant acceleration was what I was trying to
achieve.
Mike
On 2/20/2019 6:04 AM, JimT wrote:
> #macro AccDec(StartTime,EndTime,AccFrac)
> //
> // AccFrac should be between 0 and 0.5. It will be clipped.
> //
> #local KFrac = min(max(0,AccFrac),0.5);
> //
> #local RelTime = (clock  StartTime)/(EndTime  StartTime);
> #local RelTime = min(max(0,RelTime),1);
> //
> #if(KFrac = 0)
> #local SP = RelTime;
> #elseif(RelTime < KFrac)
> #local SP = RelTime*RelTime/(2*KFrac*(1KFrac));
> #elseif(RelTime < 1  KFrac)
> #local SP = RelTime/(1KFrac)  KFrac/(2*(1KFrac));
> #else
> #local SP = 1  (1  RelTime)*(1  RelTime)/(2*KFrac*(1KFrac));
> #end
> SP
> //
> #end
Post a reply to this message


 
 




 

