已知两点获取单位向量 和 单位垂直向量
/************************************************************************
*函数名: getUnitVector
*
*函数作用: 根据两点获取单位向量
*
*函数参数:
*CvPoint pointO - 起点
*CvPoint pointA - 终点
*
*函数返回值:
*CvPoint2D32f 两点之间的单位向量
**************************************************************************/
CvPoint2D32f getUnitVector (CvPoint pointO,CvPoint pointA )
{
CvPoint2D32f point;
float distance;
distance = powf((pointO.x - pointA.x),2) + powf((pointO.y - pointA.y),2);
distance = sqrtf(distance);
point.x = float(pointA.x - pointO.x)/distance;
point.y = float(pointA.y - pointO.y)/distance;
return point;
}
/************************************************************************
*函数名: getUnitVerticalVector
*
*函数作用: 根据两点获取垂直单位向量
*
*函数参数:
*CvPoint pointO - 起点
*CvPoint pointA - 终点
*int type - 0 表示方向是向左上
*
*函数返回值:
*CvPoint2D32f 两点之间的垂直单位向量
**************************************************************************/
CvPoint2D32f getUnitVerticalVector (CvPoint pointO,CvPoint pointA,int type )
{
CvPoint point;
CvPoint2D32f p;
point.x = pointA.x - pointO.x;
point.y = pointA.y - pointO.y;
if ((0 == point.x) && ( 0 == point.y))
{
p.x = 0;
p.y = 0;
printf(" getUnitVerticalVector : error, ( 0 == point.x) && if ( 0 == point.y)");
return p;
}
if ( 0 == point.x)
{
if (0 == type)//垂直向量的y分量小于于0,向左上
{
p.x = -1;
}
else
{
p.x = -1;
}
p.y = 0;
return p;
}
if ( 0 == point.y)//垂直向量的y分量小于于0,向左上
{
p.x = 0;
p.y = -1;//图片中越往下越大,所以 y坐标= -1 表示向上
return p;
}
//求垂直单位向量p
/*
float pow(float x, float y);
原型:在TC2.0中原型为extern float pow(float x, float y); ,
而在VC6.0中原型为double pow( double x, double y );
头文件:math.h/cmath(C++中)
功能:计算x的y次幂。
返回值:x应大于零,返回幂指数的结果。
返回类型:double型,int,float会给与警告!
*/
p.y = - fabsf((point.x * 1.0f)/sqrtf((powf(point.x, 2)) + powf(point.y, 2)));
p.x = - ((point.y * 1.0f)/point.x)*p.y;
if (0 == type)//垂直向量的y分量小于0,向左上
{
if (0 < p.y)
{
p.x = - p.x;
p.y = - p.y;
}
}
else
{
if (0 > p.y)//垂直向量的y分量大于0,向下
{
p.x = - p.x;
p.y = - p.y;
}
}
return p;
}