凸包算法

  凸包指的是当给定n个点的坐标时,我们可以用某几个点来将所有的点包围,形成一个凸包,这里我们采用的是Graham扫描算法。我们用一个栈来装载这几个点。
  首先我们选择最低的y坐标点,如果存在多个,选择最左端的即 x坐标最小的一个点,作为标准基点,然后以此点作为基准来计算其余各点的极坐标,按照逆时针的顺序排序,如果某几点的极坐标相等,则保留距离最远的那个点,删除另外的几点。对当前的几点依次取3点进行扫描,利用叉积判断点是向有 依次对所有的点进行判断。我们在判断的时候,假设三个点p0,p1,p2构成 凸包指的是当给定n个点的坐标时,我们可以用某几个点来将所有的点包围,形成一个凸包,这里我们采用的是Graham扫描算法。
 我们用一个栈来装载这几个点。首先我们选择最低的y坐标点,如果存在多个,选择最左端的即 x坐标最小的一个点,作为标准基点,然后以此点作为基准来计 算其余各点的极坐标,按照逆时针的顺序排序,如果某几点的 极坐标相等,则保留距离最远的那个点,删除另外的几点。 对当前的几点依次取3点进行扫描,利用叉积判断点是向有 依次对所有的点进行判断。我们在判断的时候,假设三个点p0,p1,p2构成,我们要判断的是p1这个点我们是否要保留,就是我们要判断p0到p1,与p0到p2的向量相乘,主要是为了判断如果直接连接p0,p2这两个点能否将p1包括。 向量的叉乘,如果向量叉积小于0则说明向左转,p1出栈。如果改点出站栈了,则栈里继续取两个点继续进行判断直到满足叉积情况,然后入栈. 同时栈里保证不小于2个元素,并且每一次的元素进栈都是对当前点进栈前栈顶的点进行的判断,这样我们就得到了这些点的凸包。,我们要判断的是p1这个点我们是否要保留,就是我们要判断p0到p1,与p0到p2的向量相乘,主要是为了判断如果直接连接p0,p2这两个点能否将p1包括。
  向量的叉乘,如果向量叉积小于0则说明向左转,p1出栈。如果改点出站栈了,则栈里继续取两个点继续进行判断直到满足叉积情况,然后入栈.同时栈里保证不小于2个元素,并且每一次的元素进栈都是对当前点进栈前栈顶的点进行的判断,这样我们就得到了这些点的凸包。

你可能感兴趣的:(acm)