1. 程式人生 > >HDU 5120 Intersection (計算幾何)

HDU 5120 Intersection (計算幾何)

題意:

,

分析:

++
ans=2+
,,,,
把重合當成相含了, 一直沒考慮相含卡到死。。。

程式碼:

//
//  Created by TaoSama on 2015-10-11
//  Copyright (c) 2015 TaoSama. All rights reserved.
//
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <cctype>
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " "
#define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; const double PI = acos(-1), EPS = 1e-10; int sgn(double a) { return a < -EPS ? -1 : a < EPS ? 0 : 1; } struct Point { double x, y; }; double getDis(const Point& p1, const
Point& p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } double getAngle(double a, double b, double c) { return acos((a * a + b * b - c * c) / 2 / a / b); } struct Circle { double r; Point p; Circle() {} Circle(double r, double x, double y) { this->r = r; p = (Point) {x, y}; } }; double getIntersectionArea(const Circle& c1, const Circle& c2) { double dis = getDis(c1.p, c2.p); if(sgn(dis - (c1.r + c2.r)) > 0) return 0; if(sgn(dis - abs(c1.r - c2.r)) <= 0) { double minr = min(c1.r, c2.r); return PI * minr * minr; } double alpha = getAngle(c1.r, dis, c2.r) * 2; double beta = getAngle(c2.r, dis, c1.r) * 2; double area = 0.5 * alpha * c1.r * c1.r + 0.5 * beta * c2.r * c2.r; area -= 0.5 * c1.r * c1.r * sin(alpha) + 0.5 * c2.r * c2.r * sin(beta); return area; } int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); int kase = 0; while(t--) { double r, R; double x1, y1, x2, y2; scanf("%lf%lf%lf%lf%lf%lf", &r, &R, &x1, &y1, &x2, &y2); Circle a1(R, x1, y1), a2(R, x2, y2); Circle b1(r, x1, y1), b2(r, x2, y2); double ans = getIntersectionArea(a1, a2) - getIntersectionArea(a1, b2) - getIntersectionArea(a2, b1) + getIntersectionArea(b1, b2); printf("Case #%d: %.6f\n", ++kase, ans); } return 0; }

相關推薦

HDU 5120 Intersection 計算幾何

題意: 求兩個一模一樣,但位置不一定相同的圓環的環相交面積 分析: 其實就是圓交面積++−− ans=大圓交−2∗一大一小圓交+小圓交 寫圓交函數的時候,注意有三種情況,相含,相交,相離 把重合當成相含了, 一直沒考慮相含卡

HDU 5120 Intersection 計算幾何2014ICPC 北京站現場賽

Intersection Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 1253    Accepte

HDU 5120 Intersection計算幾何

Description 給出兩個圓環的內外半徑和圓心座標,問這兩個圓環的相交面積 Input 第一行為一整數T表示用例組數,每組用例第一行兩個整數r和R分別表示圓環內外半徑,第二行和第三行為兩個圓

HDU 5120 Intersection計算幾何+容斥

Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famous examples you may know.  A ri

POJ - 1410 - Intersection計算幾何

You are to write a program that has to decide whether a given line segment intersects a given rectangle. An example: line: start point: (4,9) end

Intersection 計算幾何

Output For each test case in the input file, the output file should contain a line consisting either of the letter "T" if the line segment intersects

5120 Intersection簡單幾何——2014ACM/ICPC亞洲區北京站

傳送門 Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famou

HDU 6055 17多校 Regular polygon計算幾何

ati sort 結果 stream int tom tle eight idt Problem Description On a two-dimensional plane, give you n integer points. Your task is to figur

HDU 5120 Intersection 求圓環相交面積

ifd endif cstring pen syn %d nbsp efi ase 題意:給定圓環的內徑r和外徑R,以及2個相同圓環的圓心,求兩個圓環的相交面積。 思路: S = A大B大 - A大B小 - A小B大 + A小B小。(A表示A環,大表示大圓,B同)

hdu 6127 : Hard challenge (2017 多校第七場 1008計算幾何

for %d logs opera log val r+ ++ show 題目鏈接 題意:二維平面上有n個點(沒有重疊,都不在原點,任意兩點連線不過原點),每個點有一個權值,用一條過原點的直線把他們劃分成兩部分,使兩部分的權值和的乘積最大。輸出最大的乘積。 極角排序後,將原

hdu 5120 Intersection兩圓相交面積模板

Intersection 題目連結: 解題思路: 在紙上畫畫圖,不難發現,根據容斥定理:所要求的面積為兩外環的交集(ans1)-外環和內環的交集(ans2*2,對稱)+兩內環的 交集(多減去的部分,

hdu 5120 Intersection求相交圓的面積

#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; double S1,S2,S3,a1,a2,d,p,ans,mi;

HDU 5858 Hard problem計算幾何

Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description cjj is fun with math prob

HDU 5858 Hard problem計算幾何【較難】【多校聯合8.18】

解題思路: 看懂這個圖,這個題就能A掉了。 下面是AC程式碼: #include<cstdio> #include<cstring> #include<c

HDU 4766 Network計算幾何 二分+三分

這個題目標準解法估計不是二分+三分,不過我一見到這個題目就認為是二分或者三分,所以一直想下去就寫成了下面的程式碼,dubug好久才AC 二分列舉到房子的距離也就是路由器到房子的距離,然後三分判斷在以房子為圓心這個距離為半徑的的圓周上是否存在點能使這點到所有其他點 距離&l

Codeforces 849B Tell Your World 計算幾何

continue int ++i 滿足 light size sizeof tar tell 題目鏈接 Tell Your World 題意 給出N個點(i, xi),問是否存在兩條平行的直線,使得每一個點恰好在兩條直線的其中一條上。 每條直線必須穿過至少一個點。 考

POJ 2318 TOYS 計算幾何叉積的運用

line sync ted all names pri char ems sizeof Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have

51 Nod 1298 圓與三角形計算幾何

tput body bits truct 大於 簡單 以及 else c++ 題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 題目: 1298 圓與三角形

POJ - 1039 Pipe計算幾何

std algo double 透明 pac down queue == 是否 http://poj.org/problem?id=1039 題意 有一寬度為1的折線管道,上面頂點為(xi,yi),所對應的下面頂點為(xi,yi-1),假設管道都是不透明的,不反射的,光

Thinking-Bear magic 計算幾何

return name code 數加 重復 ack tps href tac ---- 點我 ---- 題目大意: 給你一個正n邊形及邊長 a和一個正整數L, 求正多邊形的面積s,若s大於L,則連接相鄰兩邊的中點,形成新的正多邊形,重復這個操作直至s小於L:如圖: