zoukankan      html  css  js  c++  java
  • 计算几何--半平面交与平面区域

    内容参考书籍——《算法竞赛入门经典训练指南》、《算法竞赛入门到进阶》

    半平面就是平面的一半。

    简单地说,半平面交问题就是给出若干个半平面,求他们的公共部分。每个半平面用一条有向直线表示。

      有向直线的定义如下:

     1 //有向直线。它的左边就是对应的半平面。
     2 struct Line
     3 {
     4     Point P; //直线上的一个点
     5     Vector v;//方向向量,它的左边是半平面
     6     double ang;//极角,从x正半轴旋转到v的角度
     7     Line() {}
     8     Line (Point P, Vector v) :P(P),v(v) {ang = atan2(v.y,v.x);}
     9     bool operator < (Line &L) {return ang < L.ang;}//用于排序
    10 };

    半平面交最终形成的凸多边形,沿逆时针顺序看,它的边的极角(或者斜率)是单调递增的。那么,可以先按极角递增的顺序对半平面进行排序,然后逐个进行半平面交,最后就得得到了凸多边形。在这个过程中,用一个双端队列记录构成凸多边形的半平面:队列的首部指向最早加入凸多边形的半平面,尾部指向新加入的半平面。

      算法具体步骤如下:

      (1) 对所有半平面按极角排序。

           (2) 初始时,加入第一个半平面,双端队列的首部和尾部都指向它。

      (3) 逐个加入和处理半平面。注意这里会出现4种情况,算法复杂度是O(nlog2n)。

    题目:hdu 2297

  • 相关阅读:
    2017福建夏令营Day7(数论)
    2017福建夏令营Day3(搜索)
    【FZSZ2017暑假提高组Day9】猜数游戏(number)
    【FZSZ2017暑假提高组Day6】bd
    POJ 3660 传递闭包问题
    NOIP 提高组 2002 均分纸牌
    POJ 2387 Til the Cows Come Home
    NOIP 2016 Day2 T1 组合数问题
    06--ubuntu的sqlite安装
    ARM架构与体系学习(二)——3级流水线
  • 原文地址:https://www.cnblogs.com/125418a/p/11649372.html
Copyright © 2011-2022 走看看