我正在研究给定一组n
段{(a0, b0), (a1,b1), (a2, b2)...(an-1, bn-1) }
的算法。在这里,我们找到了点的最小数量m
,使得每个段包含至少一个点。
这里我从第一个坐标排序数据,即按升序排序,并比较b
坐标在当前结束范围的范围内,如下所示。
如果我使用lhs.end< = rhs.end算法工作,但如果是使用lhs.start< = rhs.start算法失败
struct Segment {
std::uint64_t start, end;
friend std::ostream & operator << (std::ostream &out, const Segment &c);
};
bool operator < (Segment lhs, Segment rhs) {
if(lhs.end <= rhs.end) {
return true;
}
else {
return false;
}
}
std::sort(segments.begin(), segments.end());
std::uint64_t uiPresentSegStart = segments[0].start;
std::uint64_t uiPresentSegEnd = segments[0].end;
std::uint64_t uiPresentIdxStart = 0;
std::uint64_t uiTotalSegments = 1;
for (size_t i = 1; i < segments.size(); ++i) {
if(segments[i].start <= uiPresentSegEnd) {
continue;
}
uiTotalSegments++;
uiPresentSegEnd = segments[i].end;
}
但是这个算法不起作用。当我查看算法时,它被告知我必须按b
坐标排序。我不明白为什么我们必须按b
坐标排序?任何人都可以举一个例子,为什么排序第一个坐标算法会失败?
答案 0 :(得分:0)
如您所知,使用扫描线计算交叉点的分段交叉算法。在这个算法中,我们应该指定事件点。扫描线中的事件点(从左到右)将是段的端点(您可以在算法中看到它)。因此,您应该将所有端点排序为扫描线的事件点以在它们上移动(所有起点和终点)。
总之,通过端点排序有助于算法知道分段线的完成位置,并且在通过分段线的端点后不会计算交叉计算中的完成分段线。