謝勇大神畫了張圖,然後這個問題就解決了。。。
本質是「半平面交」問題。
直線切割多邊形,公共的部分就是多邊形的核
這裡找到乙個不錯的模板:
#include #include#include
#include
#include
#include
#include
#include
#include
#define cl(arr, val) memset(arr, val, sizeof(arr))
#define rep(i, n) for((i) = 0; (i) < (n); ++(i))
#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))
#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))
#define l(x) (x) << 1
#define r(x) (x) << 1 | 1
#define mid(l, r) (l + r) >> 1
#define min(x, y) x < y ? x : y
#define max(x, y) x < y ? y : x
#define e(x) (1 << (x))
const
double eps = 1e-8
;typedef
long
long
ll;using
namespace
std;
const
int maxn = 110
;struct
point
void
input()
};point point[maxn], p[maxn], q[maxn];
//讀入的多邊形的頂點(順時針)、p為存放最終切割得到的多邊形頂點的陣列、暫存核的頂點
int ccnt, n; //
此時ccnt為最終切割得到的多邊形的頂點數、暫存頂點個數
inline
int dbcmp(double x)
inline
void getline(point x, point y, double& a, double& b, double& c)
inline point intersect(point x, point y,
double a, double b, double c)
inline
void cut(double a, double b, double c)
}for(i = 1; i <= cur; ++i) p[i] =q[i];
p[cur+1] = q[1]; p[0] =p[cur];
ccnt =cur;
}void solve()
if(ccnt == 0) puts("no"
);
else puts("
yes");}
void
init()
intmain()
return0;
}
多邊形判斷模板
include include define maxn 1000 define offset 10000 define eps 1e 8 define zero x x 0?x x define sign x x eps?1 x eps?2 0 struct point struct line do...
多邊形面積交模板
多邊形的交,多邊形的邊一定是要按逆時針方向給出 還要判斷是凸包還是凹包,呼叫相應的函式 面積並,只要和面積減去交即可 include using namespace std const double eps 1e 8 int dcmp double x struct point double cro...
模板 計算幾何 多邊形
1 注意 運算子的優先順序是很低的。2 注意重合點和共線點的情況 const double eps 1e 9 const double pi acos 1.0 int sgn double x struct point point double x,double y x x y y double l...