我试图通过一组平行线找到一个算法来构建所有矩形。给出了所有线的方程。下面是一个例子来解释这种情况,它显示了两组平行线并且它们彼此垂直:(组(a)中的红线是平行的,组(b)中的绿线也是平行的。)< / p>
矩形应该受一个constrant的限制,它的边缘的最小长度必须大于d_min,见图。矩形可以相互重叠。
Line equation: y = kx + b
struct sLine
{
float k;
float b;
}
// Input
vetor<sLine> vecLineGroupA;
vetor<sLine> vecLineGroupA;
// Output
struct sRectangle
{
// 4 edges of a rectangle
sLine Line1;
sLine Line2;
sLine Line3;
sLine Line4;
}
有没有解决这个问题的算法,或者有人对此有所了解?
答案 0 :(得分:1)
假设你有类似的东西:
// line: y = ax + b;
struct line {double a; double b;};
vector<line> groupA = {....};
vector<line> groupB = {.....};
你需要一些像这样的伪代码:
sort_with_smallest_b_first(groupA);
sort_with_smallest_b_first(groupB);
for (int n1=0; n1 < groupA.size()-1; ++n1)
{
for (int n2=n1+1; n2 < groupA.size(); ++n2)
{
for (int j1=0; j1 < groupB.size()-1; ++j1)
{
for (int j2=j1+1; j2 < groupB.size(); ++j2)
{
// Now you have the recatangle between the lines
// groupA[n1], groupA[n2]
// groupB[j1], groupB[j2]
double d1 = distance(groupA[n1], groupA[n2]);
double d2 = distance(groupB[j1], groupB[j2]);
if (d1 >= dmin && d2 >= dmin)
{
// Add rectangle to output
}
}
}
}
}
要计算线条之间的距离,请参阅:https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line
如果性能是个问题,您可以先计算所有非重叠矩形,然后从非重叠矩形组中创建重叠矩形,从而提高性能。它将为您节省一些距离计算,即,您可以简单地添加非重叠矩形的距离,而不是总是使用“复杂”公式重新计算。