gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:34:39 28 4
gpt4 key购买 nike

我是 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com