事因『風水羅盤』由弧扇形基座組成. 要開發弧扇形碰撞技術.
先定義弧扇結构, 『角度』『弧度』係硬幣两面, 係相, 可相互轉換換
角度 = 弧度 * 180.0/PI |
弧度= 角度 * PI/180.0 |
弧扇形基座有两『弧度』相等弧形, 离中點距离唔同, 遠离中點弧.較埋中點弧,
typedef struct ARC2D_TYP { | 弧扇結构 |
VECTOR2D center; | 中心點 |
float angle; | 角度 |
float rotate; | 轉旋 |
float far; | 最远點 |
float near; | 最近點 |
}ARC2D, *ARC2D_PTR; |
首要判断命中㸃是咪係『最远點』『最近點』之間.
命中㸃
Init_VECTOR2D(&va,x,y);
計觸摸㸃同弧中心㸃距離
Sub_VECTOR2D(&vdiff, &arc->center, &va);
計向量長度
float length = Length_VECTOR2D(&vdiff);
判断命中弧線之間
if(length < arc->near || length > arc->far )
return false;
計落點位於弧扇夹角之間. 弧扇夹两邊長壹致. 即等邊三角形, 視同两直角三角形.
sin(a)= 對邊/斜邊. | |
a= asinf (對邊/斜邊) | asinf(弧度) |
計弧扇邊長
Copy_VECTOR2D(&va,&vdiff);
Init_VECTOR2D(&vb,0,length);
Sub_VECTOR2D(&vdiff, &va, &vb);
cEdge = Length_VECTOR2D(&vdiff);
計va和vb之间的夹角
cAngle = RAD_TO_DEG( asinf((cEdge / 2) / bEdge) ) * 2;
判断命中弧形夹角之間
begin = (-arc->angle/2) + arc->rotate ;
end = (arc->angle/2) + arc->rotate ;
return Compute_Angle_In_RAC(cAngle, begin, end); // 夹角落㸃
判断頂是咪係弧內
bool Compute_Angle_In_RAC(float angle,float begin,float end){
float offset;
angle = Format_Angle(angle);//格式角
begin = Format_Angle(begin);//格式角
end = Format_Angle(end);//格式角
if(_begin > _end){
_end = _end + 360;
if(_angle > 0 && _angle < end )
_angle = _angle + 360;
}
if( _angle >= _begin && _angle <= _end )// 夹角落㸃
return true; return false;
}
歸壹角/格式角
float Format_Angle(float angle){
if(angle < 0)
angle = angle + 360;
else
if(angle >= 360)
angle = angle – 360;
return angle;
}