BZOJ2618 半平面交)

2021-08-01 23:10:34 字數 2271 閱讀 2303

逆時針給出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 行每行兩個整數,逆時針給出各個頂點的...