//半平面交(返回半平面交点的个数)
//点p在有向直线L的左边
bool OnLeft(Line L, Point p)
{
return Cross(L.v, p-L.P) > 0;
}
//二直线交点。假定交点唯一存在
Point GetIntersection(Line a, Line b)
{
Vector u = a.P-b.P;
double t = Cross(b.v, u) / Cross(a.v, b.v);
return a.P+a.v*t;
}
int HalfPlaneIntersection(Line* L, int n, Point* poly)
{
sort(L, L+n);//按极角排序
int first, last;//双端队列的第一个元素和最后一个元素的下标
Point *p = new Point[n];//p[i]为q[i]和q[i+1]的交点
Line *q = new Line[n];//双端队列
q[first=last=0] = L[0];//双端队列初始化为只有半平面L[0]
for(int i = 1; i < n; i++)
{
while(first < last && !OnLeft(L[i], p[last-1])) last--;
while(first < last && !OnLeft(L[i], p[first])) first++;
q[++last] = L[i];
if(fabs(Cross(q[last].v, q[last-1].v)) < eps)
//两向量平行且同向,取内侧的一个
{
last--;
if(OnLeft(q[last], L[i].P)
半平交面模版
最新推荐文章于 2021-09-11 10:57:17 发布