计算两条线的交点和夹角

方法一

//计算两条直线的交点 
Point2f calVertex(Vec4f line1, Vec4f line2)
{
    Vec4f line1_;
    Vec4f line2_;
    if (abs(line1[2] - line1[0]) < abs(line1[3] - line1[1]))
    {
        line2_ = line1;
        line1_ = line2;
    }
    else
    {
        line2_ = line2;
        line1_ = line1;
    }
    float aa = (line1_[2] - line1_[0]);
    //cout << "aa: " << aa << endl;
    if (aa == 0)
        aa += 0.1;
    float bb = (line2_[3] - line2_[1]);
    //cout << "bb: " << bb << endl;
    if (bb == 0)
        bb += 0.1;

    //求2条线的斜率
    float gValue = (line1_[3] - line1_[1]) / aa;
    float fValue = (line2_[2] - line2_[0]) / bb;

    if (fValue == 0)
        fValue += 0.0000000001;
    fValue = 1 / fValue;

    float fMg = fValue - gValue;
    if (fMg == 0)
        fMg += 0.1;

    float xValue = (line1_[1] - line2_[1] - gValue * line1_[0] + fValue * line2_[0]) / fMg;
    float yValue = line1_[1] + (xValue - line1_[0]) * gValue;
    return Point2f(xValue, yValue);
}

方法二

Vec4d lines_intersection(const Vec4d l1, const Vec4d l2)
{
	//直线一
    double x1 = l1[0], y1 = l1[1], x2 = l1[2], y2 = l1[3];
    double a1 = -(y2 - y1), b1 = x2 - x1, c1 = (y2 - y1) * x1 - (x2 - x1) * y1; // 一般式:a1x+b1y1+c1=0
 	//直线二
    double x3 = l2[0], y3 = l2[1], x4 = l2[2], y4 = l2[3];
    double a2 = -(y4 - y3), b2 = x4 - x3, c2 = (y4 - y3) * x3 - (x4 - x3) * y3; // 一般式:a2x+b2y1+c2=0
    bool r = false;                                                             	// 判断结果
    double x0 = 0, y0 = 0;                                                      	// 交点
    double angle = 0;                                                           	// 夹角
    // 判断相交
    if (b1 == 0 && b2 != 0) // l1垂直于x轴,l2倾斜于x轴
        r = true;
    else if (b1 != 0 && b2 == 0) // l1倾斜于x轴,l2垂直于x轴
        r = true;
    else if (b1 != 0 && b2 != 0 && a1 / b1 != a2 / b2)//l1和l2都倾斜于x轴; l1和l2的斜率不相等
        r = true;
    if (r)
    {
        //计算交点
        x0 = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
        y0 = (a1 * c2 - a2 * c1) / (a2 * b1 - a1 * b2);
        // 计算夹角
        double a = sqrt(pow(x4 - x2, 2) + pow(y4 - y2, 2));
        double b = sqrt(pow(x4 - x0, 2) + pow(y4 - y0, 2));
        double c = sqrt(pow(x2 - x0, 2) + pow(y2 - y0, 2));
        angle = acos((b * b + c * c - a * a) / (2 * b * c)) * 180 / CV_PI;
    }
    return Vec4d(r, x0, y0, angle);
}

三、计算线的水平角度和垂直角度

1、计算水平角度

//计算水平角度
float calAngleHorizental(Vec4i line)
{
    double deltaX = double(line[2] - line[0]);
    double deltaY = double(line[3] - line[1]);
    if (deltaX < 0)
    {
        deltaX = -deltaX;
        deltaY = -deltaY;
    }

    if (deltaX == 0)
    {
        return 90;
    }
    return -atan2(deltaY, deltaX) * 180 / CV_PI;
}

2、计算垂直角度

//计算垂直角度
float calAngleVertical(Vec4i line)
{
    double deltaX = double(line[2] - line[0]);
    double deltaY = double(line[3] - line[1]);

    if (deltaY == 0)
    {
        return 90;
    }
    return atan2(deltaX, deltaY) * 180 / CV_PI;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值