是否存在通过平行线段组构建矩形的算法

时间:2016-05-25 14:38:34

标签: c++ algorithm graph-algorithm

我试图通过一组平行线找到一个算法来构建所有矩形。给出了所有线的方程。下面是一个例子来解释这种情况,它显示了两组平行线并且它们彼此垂直:(组(a)中的红线是平行的,组(b)中的绿线也是平行的。)< / p>

enter image description here

矩形应该受一个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;
}

有没有解决这个问题的算法,或者有人对此有所了解?

1 个答案:

答案 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

如果性能是个问题,您可以先计算所有非重叠矩形,然后从非重叠矩形组中创建重叠矩形,从而提高性能。它将为您节省一些距离计算,即,您可以简单地添加非重叠矩形的距离,而不是总是使用“复杂”公式重新计算。