tkdsheep-solution-0021
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
开飞机,很明显直接对这些点求一个凸包即可,给出的点是按x排序的,所以O(n)扫过去就行
每次扫到一个点x,就从栈里面抛出最近的两个点构成一个向量v,然后做叉积,看x在v的顺时针方向还是逆时针方向,是逆时针的话,栈就要抛出一个点继续比较,顺时针就直接将x入栈,扫下一个点
}}}
{{{
补一下叉积
double chaji(POINT sp,POINT ep,POINT np) //sp是原向量的起点,ep是原向量的终点,np是新加入的点
{
return (ep.x - sp.x) * (np.y - sp.y) - (np.x - sp.x) * (ep.y - sp.y);
//结果为正,则np在(sp,ep)的逆时针方向
//结果为0,共线
//结果为负,则np在顺时针方向
}
}}}
开飞机,很明显直接对这些点求一个凸包即可,给出的点是按x排序的,所以O(n)扫过去就行
每次扫到一个点x,就从栈里面抛出最近的两个点构成一个向量v,然后做叉积,看x在v的顺时针方向还是逆时针方向,是逆时针的话,栈就要抛出一个点继续比较,顺时针就直接将x入栈,扫下一个点
补一下叉积
double chaji(POINT sp,POINT ep,POINT np) //sp是原向量的起点,ep是原向量的终点,np是新加入的点
{
return (ep.x - sp.x) * (np.y - sp.y) - (np.x - sp.x) * (ep.y - sp.y);
//结果为正,则np在(sp,ep)的逆时针方向
//结果为0,共线
//结果为负,则np在顺时针方向
}