知识点
扫描线:将一条与x轴(或y轴)平行的直线向上(向右)平行移动寻找交点的直线。
平面扫描算法:
1、将已输入线段的端点按照y升序排序,添加到表EP
2、将二叉搜索树T置为空
3、按顺序取出EP的端点(相当于让扫描线自下而上移动),进行以下处理
- 如果取出的端点是垂直线段的上端点,则从T中删除该线段的x坐标
- 如果取出的端点是垂直线段的下端点,则将该线段的x坐标插入到T
- 如果取出的端点是垂直线段的左端点(扫描线与水平线段重合时),将该水平线段的两端点作为搜索范围,输出T中包含的值(即是垂直线段的x坐标)
问题链接
CGL_6_A:Segment Intersections: Manhattan Geometry
问题内容
求平面上所有线段之间相交点的个数。
思路
利用扫描平面算法
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
using namespace std;
#define EPS (1e-10)
#define equals(a,b) (fabs((a) - (b)) < EPS)
// 点类