如题,只要判断是否相交就可以了,可以不求交点的坐标。
相切也算是相交。
直线段定义是二端点坐标。
圆弧段是由园心点的坐标,半径,圆弧端点起始的角度,圆弧端点终点的角度定义
如果算交点的话注意可能直线段可能水平或垂直,故用正切或余切是要注意产能溢出或程序出错的情况。
算法尽量简单,因为它是在实时系统上跑的。
如能惠赐C程序更好。求大侠赐招,谢谢
相切也算是相交。
直线段定义是二端点坐标。
圆弧段是由园心点的坐标,半径,圆弧端点起始的角度,圆弧端点终点的角度定义
如果算交点的话注意可能直线段可能水平或垂直,故用正切或余切是要注意产能溢出或程序出错的情况。
算法尽量简单,因为它是在实时系统上跑的。
如能惠赐C程序更好。求大侠赐招,谢谢
2)计算直线的端点坐标s1,s2
3) 计算曲线的端点横坐标,x1,x2
4) 求s1,s2,x1,x2的重合部分,假定为s2, x1
5) 计算曲线上s2,x1对应的纵坐标y1,y2
6) 如果符号相反,则相交
float cangel=(float)3.1415/(float)180.0;//角转换常数
float new_linebasex=(linebasex-arccenterx)*(float)cos(lineangle*cangel)+(linebasey-arccentery)*(float)sin(lineangle*cangel);
float new_linebasey=-(linebasex-arccenterx)*(float)sin(lineangle*cangel)+(linebasey-arccentery)*(float)cos(lineangle*cangel);
//求直线二端点坐标,y点坐标相等
float foreign_xa=new_linebasex+armlen;
float foreign_xb=new_linebasex-balancelen;
float foreign_y=new_linebasey;
if(foreign_y>arcradius)
{
return false;//无交点
}
else //有一个或二个交点 求交点及横坐标
{
float xa=arcradius*arcradius-foreign_y*foreign_y;
float a1_angle=(float)180.0/(float)3.1415*(float)asin(foreign_y/arcradius);
float xb=-xa;
float a2_angle=180-a1_angle;
bool btemp1=(RegularAngle(a1_angle)>(RegularAngle(arclineangle)-RegularAngle(lineangle)-angleoffset))&&(RegularAngle(a1_angle)<(RegularAngle(arclineangle)-RegularAngle(lineangle)+angleoffset));//角度在二个夹角中间
bool btemp2=(xa>MIN(foreign_xa,foreign_xb))&&(xa<MAX(foreign_xa,foreign_xb));//交点在线段中间
bool btemp3=(RegularAngle(a2_angle)>(RegularAngle(arclineangle)-RegularAngle(lineangle)-angleoffset))&&(RegularAngle(a2_angle)<(RegularAngle(arclineangle)-RegularAngle(lineangle)+angleoffset));//角度在二个夹角中间
bool btemp4=(xb>MIN(foreign_xa,foreign_xb))&&(xb<MAX(foreign_xa,foreign_xb));//交点在线段中间
if((btemp1&&btemp2)||(btemp3&&btemp4))
{
return true;
}
else
{
return false;
}
}