C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)

本文提供了一组C++实现的基础算法,包括计算两点距离、判断点与直线的关系、求两直线交点、三角形面积、点是否在矩形内以及多种排序算法(冒泡、选择、插入、希尔、合并、快速、计数排序)。这些算法对理解几何问题和排序算法的实现非常有帮助。
摘要由CSDN通过智能技术生成

工程源码下载地址: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:判断点与矩形的关系

//

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark-puls

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值