求凸包點和面積及周長

2021-08-28 15:19:58 字數 1490 閱讀 2893

/**

author: linzhiq

date: 2018-10-01 17:28

graham掃瞄法 求凸包

*/#includeusing namespace std;

const double eps = 1e-8;

const double pi = acos(-1.0);

struct point

point(double _x, double _y)

point operator -(const point &b)const // (點 a - 點 b) 表示以 b 為座標軸原點重新定義 a 的座標

double operator ^(const point &b)const //cross 比較 點 a 與 點 b 到原點 連線的斜率 ,a的斜率小則返回值 大於零,等於零表示在同一直線

double operator *(const point &b)const //dot 點自己 乘 自己 表示 點到原點距離的平方 也就是點乘

void transxy(double b)

} p[105], lis[105];

bool checkcross(point a, point b, point c)

return false;

// 求交叉積(ab,ac)

// return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);

// 返回值小於0表示c在ab右側,大於0則在左側

} bool cmp1(const point &a, const point &b) // 按照點的 y 座標從小到大,x 座標從小到大 (逆時針)

bool cmp2(const point &a, const point &b) // 極角排序,如果 a與b 在同一直線,那就與原點距離近的優先,否則極角小的優先

int t, n, m;

void polaranglesort()

p[1].x = p[1].y = 0;

sort(p + 1, p + 1 + n, cmp2);

}void convexhull()

lis[++m] = p[i]; }}

double getarea()

return fabs(area) / 2.0;

}double dis(const point &a, const point &b)

double getperimeter()

sum += dis(lis[m], lis[1]);

return sum;

} int main()

convexhull();

for(int i = 1; i <= m; i++)

printf("%lf %lf\n",getarea(),getperimeter());

} return 0;

}

poj1113 求凸包 計算凸包周長

經典的求凸包題,模板題。要求用資源最少,那肯定這個多邊形是個凸多邊形,也就是凸包。所以先求出凸包,計算它的周長。還有就是這道題所說的,要離城牆l遠,其實就是在加上乙個圓的周長,圓的半徑就是l。都說到這了,這道題還差什麼?還差乙個經典的凸包模板!哈哈 如下 include include includ...

hdu1392凸包求周長

浩哥告訴說要用atan掃點而且只用掃瞄一遍就好了 我用兩都掃的方法不知道為什麼錯了好多次,求高手指教!下面是我用tan排序ac的 include include include define max 1000 define eps 1e 12 using namespace std struct p...

POJ 1113 Wall 凸包求周長

大意 給定些點,組成多邊形,問有沒有圓把多邊形圍起來並且圓距離多邊形最小的距離是m 求多邊形的邊長。思路 首先要知道怎麼求外邊圓的周長,l圓 l 半徑為m的圓 凸包外接圓半徑。至於為什麼要加上小圓半徑因為所有的小圓的一部分角度加和一定為360。include include include incl...