Ok i finally got this to work after somedays of testing and working hard.

To get a point to target that is really optimized to turn the shortest angle between my angle and target angle, i had to break the angles in quadrants, and study all possibilites and write a formula for them.
//quadrant here means...Quartenion!!
 Code:
var my_q; //my angle quadrant or quartenion
var target_q; //target quadrant
var comp; // complementar angle to best short angle calculations
var d_sign; //rotate direction
var d_count; // how much we need to rotate to get to the target

function turn_target {
  var ang_temp[3];
  vec_diff(ang_temp,p1.x,my.x);  
  vec_to_angle(my_angle.pan,ang_temp); turn my_angle vector
  if(my_angle.pan<0){my_angle.pan+=360;} //convert angle to 360 range if needed
  
/// HERE i assign the target quadrant
if(my_angle.pan<=360 && my_angle.pan>270){target_q=4;}
if(my_angle.pan<=270 && my_angle.pan>180){target_q=3;}
if(my_angle.pan<=180 && my_angle.pan>90){target_q=2;}
if(my_angle.pan<=90 && my_angle.pan>=0){target_q=1;}

//Here i'll assign in which my angle quadrant is
if(my.pan<=360 && my.pan>270){my_q=4;}
if(my.pan<=270 && my.pan>180){my_q=3;}
if(my.pan<=180 && my.pan>90){my_q=2;}
if(my.pan<=90 && my.pan>=0){my_q=1;}

// Here i set the complement angle constrain to 360 range
comp%=360;
comp=my_angle.pan+180; // complement angle = my angle + 180 

// if my angle is within the target (+/-2) no need to calculate , otherwise calculate:
if(!(my.pan<(my_angle+2) && my.pan>(my_angle-2)) ){
//if the target quadrant is different from the my angle quadrant
if(target_q!=my_q){
// Now calculate all the quadrant interactions and possibilites.
//adjacents quadrant - simple - done
if(target_q==1 && my_q==2){d_sign=-1;d_count=my.pan-my_angle.pan;}else{if(my_q==1 && target_q==2){d_sign=1;d_count=my_angle.pan-my.pan;}}
if(target_q==2 && my_q==3){d_sign=-1;d_count=my.pan-my_angle.pan;}else{if(my_q==2 && target_q==3){d_sign=1;d_count=my_angle.pan-my.pan;}}
if(target_q==3 && my_q==4){d_sign=-1;d_count=my.pan-my_angle.pan;}else{if(my_q==3 && target_q==4){d_sign=1;d_count=my_angle.pan-my.pan;}}
if(target_q==4 && my_q==1){d_sign=-1;d_count=360-(my_angle.pan-my.pan);}else{if(my_q==4 && target_q==1){d_sign=1;d_count=360-(my.pan-my_angle.pan);}}


if(target_q==2 && my_q==4){
if(my.pan<comp){d_sign=-1;d_count=my.pan-my_angle.pan;   } //manual complement -done 
if(my.pan>comp){d_sign=1;d_count=360-(my.pan-my_angle.pan); } //manual complement - done
}else
{if(my_q==2 && target_q==4){
if(my.pan<comp){d_sign=-1; d_count=360-(my_angle.pan-my.pan); } //manual complement - done
if(my.pan>comp){d_sign=1; d_count=my_angle.pan-my.pan; } //manual complement - done
}}

if(target_q==3 && my_q==1){
if(my.pan<comp){d_sign=-1; d_count=360-(my_angle.pan-my.pan); } //manual complement - done
if(my.pan>comp){d_sign=1; d_count=my_angle.pan-my.pan; } //manual complement - done
}else
{if(my_q==3 && target_q==1){
if(my.pan<comp){d_sign=-1; d_count=my.pan-my_angle.pan; } //manual complement - done
if(my.pan>comp){d_sign=1; d_count=360-(my.pan-my_angle.pan); } //manual complement -done
}}

}else{if(my.pan>my_angle.pan){d_count=my.pan-my_angle.pan; d_sign=-1;}else{d_sign=1; d_count=my_angle.pan-my.pan;}}
}

 
// D_Count stores how much we still need to rotate, for the shortest angle
if(d_count>0){ 

// Now rotate the my pan, to that angle...
if(d_sign==1){c_rotate(me,vector(rotate_speed,0,0),USE_AXIS|GLIDE);}
if(d_sign==-1){c_rotate(me,vector(-rotate_speed,0,0),USE_AXIS|GLIDE);}
d_count-=rotate_speed;
if(my.pan<0){my.pan+=360;} //convert angle to 360 range here, due to c_rotate mutation ( c_rotate tranform my pan in a -180: 180 range and not 0..360
}else{d_count=0;}
}



Thats all... Hope i helped.. this toooke alot of work.. believe

Last edited by MMike; 05/07/08 19:40.