分段线交叉算法为什么按端点排序

时间:2018-03-12 12:12:15

标签: algorithm

我正在研究给定一组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坐标排序?任何人都可以举一个例子,为什么排序第一个坐标算法会失败?

1 个答案:

答案 0 :(得分:0)

如您所知,使用扫描线计算交叉点的分段交叉算法。在这个算法中,我们应该指定事件点。扫描线中的事件点(从左到右)将是段的端点(您可以在算法中看到它)。因此,您应该将所有端点排序为扫描线的事件点以在它们上移动(所有起点和终点)。

总之,通过端点排序有助于算法知道分段线的完成位置,并且在通过分段线的端点后不会计算交叉计算中的完成分段线。