POV-Ray : Newsgroups : povray.general : Dumb clock animation question Server Time: 20 Jun 2019 06:56:55 GMT
 Dumb clock animation question (Message 11 to 15 of 15)
 From: JimT Subject: Re: Dumb clock animation question Date: 19 Feb 2019 14:25:01 Message:
```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 de-linearise 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.
```
 From: Tor Olav Kristensen Subject: Re: Dumb clock animation question Date: 19 Feb 2019 14:45:00 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.

--
Tor Olav
http://subcube.com
https://github.com/t-o-k/
```
 From: Mike Horvath Subject: Re: Dumb clock animation question Date: 19 Feb 2019 18:13:01 Message: <5c6c472d\$1@news.povray.org>
```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.
>
>

Thank you again. That is what I needed.

Mike
```
 From: JimT Subject: Re: Dumb clock animation question Date: 20 Feb 2019 11:05:01 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.
> >
> >
>
>
> 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*(1-KFrac));
#elseif(RelTime < 1 - KFrac)
#local SP = RelTime/(1-KFrac) - KFrac/(2*(1-KFrac));
#else
#local SP = 1 - (1 - RelTime)*(1 - RelTime)/(2*KFrac*(1-KFrac));
#end
SP
//
#end
```
 From: Mike Horvath Subject: Re: Dumb clock animation question Date: 21 Feb 2019 07:37:45 Message: <5c6e5549\$1@news.povray.org>
```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*(1-KFrac));
> #elseif(RelTime < 1 - KFrac)
>    #local SP = RelTime/(1-KFrac) - KFrac/(2*(1-KFrac));
> #else
>    #local SP = 1 - (1 - RelTime)*(1 - RelTime)/(2*KFrac*(1-KFrac));
> #end
>    SP
> //
> #end
```