计算两角度之间小于180度的有向夹角
视觉编程中,经常会遇到转向问题,从一个朝向平滑转到新的朝向。例如2d俯视坦克游戏中, 坦克身体需要转向,炮塔也需要转向。
拿2d中的额转向来说,转向是从一个角度(例如60度)转到202度,要平滑转向,实际要做的就是计算出这两个角度间小于等于180度的有向夹角。
这里的有向就是正负的问题,有了这个正负做平滑变化会很容易。
下面是计算夹角的代码:
//
/**
* 已知起始角度(a0)和终止角度(a1)获得他们之间的-180 到 +180度的夹角
* */
private function getMinAngle(a0:Number, a1:Number):Number {
var angle:Number = 0;
if(a1 >= 270 && a0 < 90){
angle = (a1 - (a0 + 360)) % 180;
}else if (a1 <= 90 && a0 >= 270) {
angle = (a1 + 360 - a0) % 180;
}else {
angle = (a1 - a0);
if (Math.abs(angle) > 180) {
angle -= 360;
}
}
return angle;
}
/**
* 已知起始角度(a0)和终止角度(a1)获得他们之间的-180 到 +180度的夹角
* */
private function getMinAngle(a0:Number, a1:Number):Number {
var angle:Number = 0;
if(a1 >= 270 && a0 < 90){
angle = (a1 - (a0 + 360)) % 180;
}else if (a1 <= 90 && a0 >= 270) {
angle = (a1 + 360 - a0) % 180;
}else {
angle = (a1 - a0);
if (Math.abs(angle) > 180) {
angle -= 360;
}
}
return angle;
}
以上代码是as3中实现的,当然算法和语言无关。可以用在各种代码上。
有了计算出来的数值,就能做很多很酷的事情了, 例如缓动。。。
以下是flash示例, 点击flash区域就可以看到转动效果。

浙公网安备 33010602011771号