This is sort of OT but maybe some can give me a nudge in the right direction:
I am writing a motor controller (will be in C/Wiring but modeling it in
Actionscript). To avoid "jerking" when the motor starts and stops I want to
ramp the motor speed. The standard way of doing this is through a
trapezoidal velocity profile: constant acceleration by fixed amount at
beginning + end of move. i.e.:
-----------------------------------------
/ \
/ \
This works fine but gives a rather "flat" motion profile and I am trying to
use Penner's 'easeInOutCubic' function instead.
Ok - here's the question (if you have read this far...;-):
I need to map the distance-based acceleration that the function yields to
values for controlling the motor speed so I can ramp up/down the motor
speed based on the distance to be traveled.
The motor is being PWM with a start speed of 60 and a max speed of 255 - so
I need to ramp proportionally from 60 > 255 and back down to 60 over an
arbitrary distance.
Seems like it is a simple math problem since I know the acceleration- but I
am having trouble getting my brain around it. The basic easeInOutCubic is
below. Once I know the acceleration at each frame, where I am stuck is
applying that to adjust motor speed.
Whew!~
--Roy
//this is AS 2-
function easeInOutCubic(t, b, c, d) {
if ((t /= d/2)<1) {
return c/2*Math.pow(t, 3)+b;
}
return c/2*(Math.pow(t-2, 3)+2)+b;
}
///
ball_mc = this.createEmptyMovieClip("ball", this.getNextHighestDepth());
ball_mc.moveTo(0, 0);
ball_mc.lineStyle(8, 0x000000);
ball_mc.lineTo(50, 0);
ball_mc.lineTo(50, 50);
ball_mc.lineTo(0, 50);
ball_mc.lineTo(0, 0);
ball_mc._y = 100;
//
ball_mc.time = 0; //time
ball_mc.begin = ball_mc._x; //begin
ball_mc.change = Stage.width - (ball_mc.begin + ball_mc._width); //change
ball_mc.duration = 20; //duration
ball_mc.active = true;
ball_mc.lastX = ball_mc.begin;
//
ball_mc.onEnterFrame = function() {
if (this.active) {
xPos = easeInOutCubic(ball_mc.time++, this.begin, this.change,
this.duration);
acceleration =xPos-this.lastX;
//
trace(acceleration);
//
this.lastX = xPos;
this._x = xPos;
if (this.time >this.duration) {
this.active = false;
}
}
};
//
//
--
-----------------------------------------------------------------
Studio Site Updated!
http://www.roypardi.com/
_______________________________________________
[email protected]
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com