c++ - 如何确定两条直线是否(几乎)垂直/正交

标签 c++ opencv

我是 opencv 和 c++ 的新手,一直在尝试确定两条线是否几乎相互垂直/正交。有这个公式可以确定它们是否完全正交(m1*m2 = -1),而 m1 是第一个直线的斜率,m2 是第二个直线的斜率。但是可以说,如果它们彼此 80% 正交,我希望函数返回 true。到目前为止的代码:

bool checkOrtho(int x1, int y1, int x2, int y2, 
            int x3, int y3, int x4, int y4) 
{ 

int m1, m2; 

// Both lines have infinite slope 
if (x2 - x1 == 0 && x4 - x3 == 0) 
    return false; 

// Only line 1 has infinite slope 
else if (x2 - x1 == 0) { 

    m2 = (y4 - y3) / (x4 - x3); 

    if (m2 == 0) 
        return true; 
    else
        return false; 
} 

// Only line 2 has infinite slope 
else if (x4 - x3 == 0) { 

    m1 = (y2 - y1) / (x2 - x1); 

    if (m1 == 0) 
        return true; 
    else
        return false; 
} 

else { 
    // Find slopes of the lines 
    m1 = (y2 - y1) / (x2 - x1); 
    m2 = (y4 - y3) / (x4 - x3); 

    // Check if their product is -1 
    if (m1 * m2 == -1) 
        return true; 
    else
        return false; 
} 
} 

最佳答案

你应该可以用 dot product 做到这一点.对于单位 vector ,它将为您提供它们之间角度的 cos(theta)。因此,如果它们是正交 0,则平行 1。因此您可以提供一个阈值,说明您希望这些线与正交的接近程度。这是要点:

bool checkOrtho(int x1, int y1, int x2, int y2, 
            int x3, int y3, int x4, int y4,
            float theta_thresh) 
{
    // center around 0
    int h1 = y2 - y1;
    int w1 = x2 - x1;
    int h2 = y4 - y3;
    int w2 = x4 - x3;
    // normalize to unit vectors
    double h1u = h1 / sqrt(pow(h1,2) + pow(w1,2));
    double w1u = w1 / sqrt(pow(h1,2) + pow(w1,2));
    double h2u = h2 / sqrt(pow(h2,2) + pow(w2,2));
    double w2u = w2 / sqrt(pow(h2,2) + pow(w2,2));

    cos_theta = h1u*h2u + w1u*w2u;
    return abs(cos_theta) < theta_thresh;
}

关于c++ - 如何确定两条直线是否(几乎)垂直/正交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59432492/

相关文章:

c++ - C/C++ : error of printing a double array returned by a function

c++ - 混合不会消除 OpenCV 中的接缝

c++ - 类型转换 - C++

c++ - 将 .txt 文件读入数组

opencv - CMake搜索OpenCV库

c++ - 从相机检测矩形形状

c++ - SVM 分类器(响应数组必须包含与样本总数一样多的元素)

python - 使用python将多个图像保存到目录

c++ - "object"中的 "object file"是什么,为什么这样调用它?

c++ - float 的长度在 32 和 40 位之间变化