游戲輵-弧形碰撞

游戲輵-弧形碰撞
游戲輵-弧形碰撞

事因『風水羅盤』由弧扇形基座組成. 要開發弧扇形碰撞技術.

先定義弧扇結构, 『角度』『弧度』係硬幣两面, 係相, 可相互轉換換

角度 = 弧度 * 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;

}

 

 

評論