在我的代码中,我计算了两个直线的交叉点。它们存在的交点保存在矢量中。现在要对该载体进行分类,以便形成蛇形结构。这里解释一下我的函数的当前输出:
-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
。但我不确定如何处理我的代码。
答案 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;
}
}
}