以蛇形图案排序点坐标

时间:2016-08-22 08:43:21

标签: c++ sorting coordinates

在我的代码中,我计算了两个直线的交叉点。它们存在的交点保存在矢量中。现在要对该载体进行分类,以便形成蛇形结构。这里解释一下我的函数的当前输出:

-2.8    -3.5
-2.6    -3.5
 3.1    -3.5
-3.8    -2.5
-3.6    -2.5
 3.8    -2.5
 4      -2.5
-4.3    -1.4
 4.4    -1.4
-4.5    -0.5
 4.6    -0.5
 4.7    -0.5
-4.5     0.5
 4.6     0.5
 4.7     0.5
-4.2     1.5
 4.4     1.5
-3.8     2.5
-3.6     2.5
 3.8     2.5
 3.9     2.5
 4       2.5
 2.9     3.5
 3.1     3.5
-2.8     3.5

第二列可能已按升序排序,但现在必须对第一列进行排序,以便它们再次按升序和降序排序。 预期的输出应如下所示:

-2.8    -3.5
-2.6    -3.5
 3.1    -3.5
 4      -2.5
 3.8    -2.5
-3.6    -2.5
-3.8    -2.5
-4.3    -1.4
 4.4    -1.4
 4.7    -0.5
 4.6    -0.5
-4.5    -0.5
-4.5     0.5
 4.6     0.5
 4.7     0.5
 4.4     1.5
-4.2     1.5
-3.8     2.5
-3.6     2.5
 3.8     2.5
 3.9     2.5
 4       2.5
 3.1     3.5
 2.9     3.5
-2.8     3.5

实际输出如下:

 3.1    -3.5
-2.6    -3.5
-2.8    -3.5
-3.8    -2.5
-3.6    -2.5
 3.8    -2.5
 4      -2.5
 4.4    -1.4
-4.3    -1.4
-4.5    -0.5
 4.6    -0.5
 4.7    -0.5
 4.7     0.5
 4.6     0.5
-4.5     0.5
-4.2     1.5
 4.4     1.5
 4       2.5
 3.9     2.5
 3.8     2.5
-3.6     2.5
-3.8     2.5
 2.9     3.5
 3.1     3.5
-2.8     3.5

我的第一次尝试看起来像这样

bool ascending_first = false;
auto firstInRange = intersects.begin();

while(firstInRange != intersects.end()) {
    auto endInRange = 
    adjacent_find(firstInRange, intersects.end(), [](const std::array<double, 3>& a, const std::array<double, 3>& b) 
        {return a[1] != b[1]; });

    if (endInRange != intersects.end()) ++endInRange;
    std::sort(firstInRange, endInRange, [ascending_first](const std::array<double, 3>& a, const std::array<double, 3>& b)
        {return ascending_first ? a[0] < b[0] : b[0] < a[0] ;});

    ascending_first = ! ascending_first;
    firstInRange = endInRange;
}

此代码的问题在于,只有在为两个点提供相同的y坐标时,它才有效。如果找到具有相同y坐标的更多交点,则无法正确创建蛇形图案。 任何人都可以提出我仍然可以达到预期效果的提示吗?

修改:我刚刚检查了我的代码。而且我已经看到排序功能不是问题所在。因为我只有一个小数位的数字,所以我舍入双值。为此,我使用了地板功能。

for(size_t b=0; b<intersects.size(); b++)
{
    intersects[b][0]=intersects[b][0]*10;
    intersects[b][1]=intersects[b][1]*10;
    intersects[b][2]=intersects[b][2]*10;

    intersects[b][0]=floor(intersects[b][0]);
    intersects[b][1]=floor(intersects[b][1]);
    intersects[b][2]=floor(intersects[b][2]);

    intersects[b][0]=intersects[b][0]/10;
    intersects[b][1]=intersects[b][1]/10;
    intersects[b][2]=intersects[b][2]/10;
}

然而,这里似乎是十进制不完全匹配的情况。我对这个提取物的处理方法是扩展范围可能性的排序函数。它将sort函数扩展为±0.1。但我不确定如何处理我的代码。

1 个答案:

答案 0 :(得分:0)

typedef pair<float, float> pff;
std::vector<pff> vp{
    {-2.6, -3.5}, {-2.8, -3.5}, {3.1, -3.5},  {-3.8, -2.5}, {-3.6, -2.5},
    {3.8, -2.5},  {4, -2.5},    {-4.3, -1.4}, {4.4, -1.4},  {-4.5, -0.5},
    {4.6, -0.5},  {4.7, -0.5},  {-4.5, 0.5},  {4.6, 0.5},   {4.7, 0.5},
    {-4.2, 1.5},  {4.4, 1.5},   {-3.8, 2.5},  {-3.6, 2.5},  {3.8, 2.5},
    {3.9, 2.5},   {4, 2.5},     {2.9, 3.5},   {3.1, 3.5},   {-2.8, 3.5}};

template <class T>
struct xx_than_key
{
    inline bool operator() (const pff &a, const pff &b) const
    {
        return T()(a.first, b.first);
    }
};

void sort()
{
    auto c = vp.begin();
    int b = true;
    for (auto p = vp.begin(); p < vp.end(); ++p)
    {
        if (p->second != c->second)
        {
            if (b)
            {
                std::sort(c, p, xx_than_key<std::less<float>>());
            }
            else
            {
                std::sort(c, p, xx_than_key<std::greater<float>>());
            }
            b = !b;
            c = p;
        }
    }
}