工程源码下载地址:https://download.csdn.net/download/cwj066/10667645
struct QUICKSORT
{
int iIndex;
float fAngle;
QUICKSORT(int iIndex, float fAngle)
{
this->iIndex = iIndex;
this->fAngle = fAngle;
}
QUICKSORT() {memset(this, 0, sizeof(*this));}
};
//定义点结构体
struct myPoint
{
int x; //点的x坐标
int y; //点的y坐标
myPoint(){memset(this, 0, sizeof(*this));}
myPoint(int x, int y)
{
this->x = x;
this->y = y;
}
bool operator==(const myPoint &other) const
{
return (this->x == other.x && this->y == other.y);
}
};
1:求两点的的距离
/********************************************************************
* 函数名称 : segmentLength
* 函数功能 : 求两点的长度(勾股定理)
* 输入参数1: pt1 第一个点
* 输入参数2: pt2 第二个点
* 输出参数: 无
* 返回参数: pt1到pt2的距离
* 日 期: 2018年09月13日
* 作 者: mark-plus
********************************************************************/
float segmentLength(const myPoint &pt1, const myPoint &pt2)
{
float x = fabs(pt1.x - pt2.x);
float y = fabs(pt1.y - pt2.y);
float fLength = sqrt((x * x + y * y));
return fLength;
}
2:判断点是否在直线上
/********************************************************************
* 函数名称 : pointOnSegment
* 函数功能 : 判断点是否在线段上
* 输入参数1: pt1 线段的第一个点
* 输入参数2: pt2 线段的第二个点
* 输入参数3: ptNode 需要判断的点
* 输出参数: 无
* 返回参数: true:点ptNode在线段上 false:点ptNode在在线段上
* 日 期: 2018年09月13日
* 作 者: mark-plus
********************************************************************/
bool pointOnSegment(const myPoint &pt1, const myPoint &pt2, const myPoint &ptNode)
{
float a = segmentLength(pt1, pt2);
float b= segmentLength(pt1, ptNode);
float c= segmentLength(pt2, ptNode);
if (a == (b +c)) return true;
else return false;
}
3:判断点是否在直线外
/********************************************************************
* 函数名称 : pointOnSegmentOutSide
* 函数功能 : 判断某个点是否在线段外
* 输入参数1: pt1 线段的第一个点
* 输入参数2: pt2 线段的第二个点
* 输入参数3: ptNode 需要判断的点
* 输出参数: 无
* 返回参数: true:点ptNode在线外 false:点ptNode在线上
* 日 期: 2018年09月13日
* 作 者: mark-plus
********************************************************************/
bool pointOnSegmentOutSide(const myPoint pt1, const myPoint pt2, const myPoint ptNode)
{
float a = segmentLength(pt1, pt2);
float b= segmentLength(pt1, ptNode);
float c= segmentLength(pt2, ptNode);
if (b > a || c > a) return false;
else return true;
}
4:求两直线的交点
/********************************************************************
* 函数名称 : intersect
* 函数功能 : 求两直线的交点(参考了Qt里面两直线求交点的算法)
* 输入参数1: pt1 直线1的第1个点
* 输入参数2: pt2 直线1的第2点
* 输入参数3: pt3 直线2的第1个点
* 输入参数4: pt4 直线2的第2个点
* 输出参数: ptNode 直线1和直线2的交点
* 返回参数: true:直线1和直线2有交点 false:true:直线1和直线2没有交点
* 日 期: 2018年09月13日
* 作 者: mark-plus
********************************************************************/
bool intersect(const myPoint &pt1, const myPoint &pt2, const myPoint &pt3, const myPoint &pt4, myPoint &ptNode)
{
myPoint a(pt2.x - pt1.x, pt2.y - pt1.y);
myPoint b(pt3.x - pt4.x, pt3.y - pt4.y);
myPoint c(pt1.x - pt3.x, pt1.y - pt3.y);
float fDenominator = a.y * b.x - a.x * b.y;
if (fDenominator == 0) return false;
float fReciprocal = 1 / fDenominator;
float na = (b.y * c.x - b.x * c.y) * fReciprocal;
ptNode = myPoint(a.x * na + pt1.x, a.y * na + pt1.y);
if (na < 0 || na > 1) return true;
float nb = (a.x * c.y - a.y * c.x) * fReciprocal;
if (nb < 0 || nb > 1) return true;
return true;
}
5:求三角形面积
/********************************************************************
* 函数名称 : triangleArea
* 函数功能 : 三点求三角形的面积(海伦公式)
* 输入参数1: pt1 三角形的第1个点
* 输入参数2: pt2 三角形的第2个点
* 输入参数3: pt3 三角形的第3个点
* 输出参数: 无
* 返回参数:三角形的面积
* 日 期: 2018年09月13日
* 作 者: mark-plus
********************************************************************/
float triangleArea(const myPoint &pt1, const myPoint &pt2, const myPoint &pt3)
{
float a = segmentLength(pt1, pt2);//三角形的a边
float b = segmentLength(pt2, pt3);//三角形的b边
float c = segmentLength(pt3, pt1);//三角形的c边
float p = (a + b + c) / 2;//三角形的周长一半
float fArea = sqrt((p * (p - a) * (p - b) * (p - c)));//用海伦公式计算三角形面积
return fArea;
}
6:判断点与矩形的关系
//