一种在0—180/-180—0表盘上取两点之间的中间点的算法。
以下是代码:
//使用到的变量大都是全局变量
void Mark_Midpoint_Scan(void)
{
if((s_sys.scan_one.ScanX1 < 0)&&(s_sys.scan_one.ScanX2 < 0))
{
if(s_sys.Speed_Direction == true)//右转
{
if(s_sys.scan_one.ScanX2 < s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = ((s_sys.scan_one.ScanX2 + 180 + 180 + (0 - s_sys.scan_one.ScanX1)) / 2 )
- abs(s_sys.scan_one.ScanX1);
if(s_sys.scan_one.ScanX2 > s_sys.scan_one.ScanX1)
{
s_sys.scan_mid_angle = s_sys.scan_one.ScanX2 - ((s_sys.scan_one.ScanX2 - s_sys.scan_one.ScanX1) / 2 );
}
}
if(s_sys.Speed_Direction == false)//左转
{
if(s_sys.scan_one.ScanX2 < s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = ((s_sys.scan_one.ScanX1 - s_sys.scan_one.ScanX2) / 2 )
+ s_sys.scan_one.ScanX1;
else if(s_sys.scan_one.ScanX2 > s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = ((s_sys.scan_one.ScanX1 + 180 + 180 + (0 - s_sys.scan_one.ScanX2)) / 2 )
- abs(s_sys.scan_one.ScanX2);
}
}
else if((s_sys.scan_one.ScanX1 >= 0)&&(s_sys.scan_one.ScanX2 >= 0))
{
if(s_sys.Speed_Direction == true)//右转
{
if(s_sys.scan_one.ScanX2 < s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = s_sys.scan_one.ScanX2 -
(((180 - s_sys.scan_one.ScanX1) + 180 + s_sys.scan_one.ScanX2) / 2 );
else if(s_sys.scan_one.ScanX2 > s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = s_sys.scan_one.ScanX1 + (s_sys.scan_one.ScanX2 - s_sys.scan_one.ScanX1) / 2;
}
if(s_sys.Speed_Direction == false)//左转
{
if(s_sys.scan_one.ScanX2 < s_sys.scan_one.ScanX1)
s_sys.scan_mid_angle = s_sys.scan_one.ScanX2 +
((s_sys.scan_one.ScanX2 + (s_sys.scan_one.ScanX2 - s_sys.scan_one.ScanX1)) / 2 );
if(s_sys.scan_one.ScanX2 > s_sys.scan_one.ScanX1)
{
s_sys.scan_mid_angle = s_sys.scan_one.ScanX1 - \
(( s_sys.scan_one.ScanX1 + 180 + 180 - s_sys.scan_one.ScanX2) / 2 );
}
}
}
else if((s_sys.scan_one.ScanX1 > 0)&&(s_sys.scan_one.ScanX2 < 0))
{
if(s_sys.Speed_Direction == true)//右转
s_sys.scan_mid_angle = -180.0f;
if(s_sys.Speed_Direction == false)
s_sys.scan_mid_angle = 0.0f;
}
else if((s_sys.scan_one.ScanX1 < 0)&&(s_sys.scan_one.ScanX2 > 0))
{
if(s_sys.Speed_Direction == true)//右转
s_sys.scan_mid_angle = 0.0f;
if(s_sys.Speed_Direction == false)
s_sys.scan_mid_angle = -180.0f;
}
}
程序中出现的判断“左转”、“右转”为本人在实际项目中使用到的,可不必关心这个。这段代码实际测试过是可以使用的。