三角形面積並 CQOI2005

2022-05-27 11:33:11 字數 2256 閱讀 9429

【題目描述】

給出\(n\)個三角形,求它們並的面積。

【輸入格式】

第一行為\(n(n \leq 100)\),即三角形的個數

以下\(n\)行,每行\(6\)個整數\(x_1, y_1, x_2, y_2, x_3, y_3\),代表三角形的頂點座標。座標均為不超過\(10^6\)

【輸出格式】

輸出並的面積\(u\), 保留兩位小數。

我們把三角形的所有頂點和所有交點全部摳出來 然後過每乙個點作一條平行於y軸的直線

容易發現 任意相鄰兩條直線之間的有效面積都是乙個(也可能是多個)三角形或矩形的面積

所以 只要我們求出左邊那條直線穿過三角形的長度\(ld\)和右邊那條直線的\(rd\),那麼總面積就加上\(\frac\)就好啦!

怎麼求?具體來說 就是對於每個三角形分別求出這條線\(x=k\)穿過它的範圍\([a,b]\),然後區間求並即可

怎麼求?對於每個三角形 算出這條線和它的三邊有幾個交點 如果是3個交點就說明這條線過它的乙個頂點 如果2個就說明穿過了兩條邊 如果0個或1個就不用管這個三角形了

萬一有乙個三角形有一條邊也平行於y軸 與某條直線產生了無數個交點呢?

注意到答案保留兩位小數就可以了 我們可以用一些奇技♂淫巧

把那種與y軸平行的三角形邊稍稍傾斜乙個小角度即可 對面積的影響微乎其微

至於求交點那些建議用計算幾何算 避免被卡精度

#include using namespace std;

const double eps = 1e-8;

inline int sgn(double x)

struct point

};typedef point vec;

struct edge

};inline vec operator + (vec a, vec b)

inline vec operator - (point a, point b)

inline vec operator * (vec a, double p)

inline vec operator / (vec a, double p)

inline bool operator < (const point a, const point b)

inline double dot(vec a, vec b)

inline double cross(vec a, vec b)

inline point line_intersection(point p, point p2, point q, point q2)

inline bool gfxj(point a, point b, point p, point q)

inline bool bgfxj(point a, point b, point p, point q)

int n, tot, ee;

double ans;

point p[100005];

edge e[305];

vector> sol;

double solve(double x)

pairtmp;

tmp.first = 2e6, tmp.second = -2e6;

for (int j = 0; j <= 2; j++)

} sol.push_back(tmp);

} sort(sol.begin(), sol.end());

if (!sol.size()) return 0;

double lst = sol[0].first, ret = 0;

for (int i = 0; i < sol.size(); i++)

return ret;

}int main()

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

} }sort(p + 1, p + tot + 1);

double lst = 0, lstx = 114514, now = 0;

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

lstx = p[i].x;

lst = now;

while (p[i+1].x == p[i].x) i++;

} printf("%.2lf\n", ans);

return 0;

}

CQOI2005 三角形面積並

給出n個三角形,求它們的面積並。首先求出所有點的座標 包括三角形的頂點座標和三角形邊的所有交點 根據它們的橫座標分段之後可以發現每一部分的面積都等價於梯形,然後暴力求出這幾個橫座標上的線段長度和,再逐塊相加即可。include define db double define p pair defin...

三角形面積

算是自己第一道正式寫的演算法幾何吧,先從簡單的開始吧,加油!描述 給你三個點,表示乙個三角形的三個頂點,現你的任務是求出該三角形的面積 輸入 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。座標值都在0到10000之間 輸入0 0 0 0 0 0表示輸入結束...

三角形面積

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 給你三個點,表示乙個三角形的三個頂點,現你的任務是求出該三角形的面積 輸入每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。座標值都在0到10000之間 輸入0 0 0 0 0 0表示輸入...