// sample usage:
// skewedSin(frame*3.1415/180., 1.25)*100
// shifts the 'peak' of sin() to a non-90 deg. value. It is VERY useful to
// learn to create such 'drop-in replacements' for existing functions to
// obtain unique animations, forces, shading, etc.
proc float normAng(float $a)
{
while($a<0)
{
$a += 2.0*3.1415;
}
while($a>(2*3.1415))
{
$a -= 2.0*3.1415;
}
return $a;
}// normAng()
global proc float skewedSin(float $a, float $peak)
{
float $a2;
$a = normAng($a);
float $peak2 = 3.1415 + (3.1415-$peak); // reflect peak about pi
if ($a <= 3.1415)
{
if ($a<=$peak)
{
$a2 = ($a/$peak)*(3.1415/2); // when $a=0, $a2=0; $a=$peak, $a2=3.1415/2
}
else
{
$a2 = 3.1415/2 + 3.1415/2*($a - $peak)/(3.1415-$peak);
}
}
else
{
// return -skewedSin($a-3.1415, $peak); // not accurate!
if($a<=$peak2)
{
$a2 = 3.1415 + 3.1415/2*($a-3.1415)/($peak2-3.1415);
}
else
{
$a2 = 3.1415*1.5 + 3.1415/2*($a-$peak2)/(2*3.1415-$peak2);
}
}
return sin($a2);
}// skewedSin()