逆時針給出n個凸多邊形的頂點座標,求它們交的面積。
給你n個凸多邊形,求多邊形的交的面積
給你一堆邊,讓你求半平面交的面積
半平面交模板
//定義點:
struct tpoint;
//定義線:一點+一方向
struct tline;
1.定義半平面為向量的左側(逆時針給出,只需要後乙個減前乙個是方向)
2.將所有向量進行逆時針極角排序
我們從x軸負半軸開始逆時針旋轉,將座標軸分為上下兩部
當兩個向量終點的y都在x軸上時,按x從小到大排
當兩個向量終點同在上部/同在下部時,按叉積排
當一上一下時,往下指的排前
平行:顯然要留下最左邊的,靠左的排在最後面
3.把邊一條條的加到棧,如果棧頂兩個邊的交點在當前半平面外,就是在這條直線的右側,那麼畫圖可知最後加的一條線是沒用的,限制不了最後的平面,因為當前的這條和棧裡第二條一起可以縮小範圍
4.然後考慮下面的一幅圖
發現我們維護的凸包首尾都是要刪除的
所以我們要寫乙個雙端佇列
5. 最後加完所有有用邊可能是這樣的:
所以最後還要模擬插入隊頭,把隊尾中多餘的半平面去掉
無限大的平面好像還要加邊界
//半平面在直線左側
#include
#include
#include
using
namespace
std;
const
int maxn = 550;
struct tpoint;
struct tline;
tpoint operator -(tpoint x,tpoint y)
tpoint operator +(tpoint x,tpoint y)
tpoint operator *(tpoint x,double d)
double
operator *(tpoint x,tpoint y)
double
operator ^(tpoint x,tpoint y)
int tt,n,m,z;
tpoint p[maxn],final_inter[maxn];
tline l[maxn],use[maxn];
void init()
l[++m].p = p[n];l[m].v = p[tmp]-p[n];
}}int is_left(tline x,tline y)
int cmp(tline x,tline y)
tpoint getinter(tline x,tline y)
double get_s(tpoint a,tpoint b,tpoint c)
int is_point_right(tpoint x,tline y)
void half_plan_intersection()
int l = 1,r = 2;
use[1] = l[1];use[2] = l[2];
for(int i = 3; i <= cnt ; i++)
while(l < r && is_point_right(getinter(use[r],use[r-1]),use[l])) r--;//最後可能有在封閉外的
if(r-l <= 1)//點或線
cnt = 0;
final_inter[++cnt] = getinter(use[l],use[r]);
for(int i = l + 1; i <= r ; i++) final_inter[++cnt] = getinter(use[i],use[i-1]);
double ans = 0;
for(int i = 3; i <= cnt ; i++) ans += get_s(final_inter[1],final_inter[i-1],final_inter[i]);
printf("%.3f",ans);
}int main()
bzoj 2618 半平面交模板 學習筆記
給你n個凸多邊形,求多邊形的交的面積 題意 給你一堆邊,讓你求半平面交的面積 半平面交模板 1.定義半平面為向量的左側 2.將所有向量的起點放到乙個中心,以中心參照進行逆時針極角排序 但是直接按叉積排序會轉圈圈 於是我們從 x 軸負半軸開始逆時針旋轉,將座標軸分為上下兩部 x 軸屬於下部 當兩個向量...
bzoj2618 凸多邊形 半平面交
bzoj上300題辣!啦啦啦上圖紀念!本來bzoj2618打算第299個做的,然後日常翻題解的時候發現popoqqq居然是第300題做的bzoj2618!為了和大爺同步我就先水另外一題,然後也在第300題a可bzoj2618!和大爺的300題一樣是不是有什麼含義 難道是乙個flag?多個凸多邊形求交...
演算法複習 半平面交(bzoj2618凸多邊形)
這裡套用wuvin 逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi 表示多邊形的邊數,以下mi 行每行兩個整數,逆時針給出各個頂點的...