[計算幾何]圓與三角形是否相交
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298
把三角形的每條邊單獨判斷,先判斷兩個點是否都在裡面,是否一個點在裡面一個點在外面,直接return。
然後判斷點到直線的距離是否小於等於r,是的話用餘弦定理判斷和圓是否有交點,原理畫圖就能明白,如果沒有交點的話在圓外的兩個角必定有一個是鈍角,用餘弦定理判斷是否小於0即可。
順便一提,如果不需要用到double型別就都用long long型別,提高精度,點積叉積兩點間距離的平方都是整數。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct vec{
ll x, y;
}c;
ll r;
ll dot(const vec &a, const vec &b){ return a.x * b.x + a.y * b.y; }
ll cross(const vec &a, const vec &b){ return a.x * b.y - a.y * b.x; }
vec sub(const vec &a, const vec &b){ return vec{b.x - a.x, b.y - a.y}; }
ll dist2(const vec &a, const vec &b){ return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); }
bool judge(const vec &a, const vec &b)
{
if (dist2(c, a) < r * r && dist2(c, b) < r * r) return 0;
if (dist2(c, a) <= r * r && dist2(c, b) >= r * r || dist2(c, b) <= r * r && dist2(c, a) >= r * r) return 1;
if (cross(sub(a, c), sub(a, b)) * cross(sub(a, c), sub(a, b)) > r * r * dist2(a, b)) return 0;
if (dist2(a, b) + dist2(b, c) < dist2(a, c) || dist2(b, a) + dist2(a, c) < dist2(b, c)) return 0;
else return 1;
}
inline ll in()
{
ll res=0,p=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') p=-1; c=getchar();}
while(c>='0'&&c<='9') res=res*10+c-48,c=getchar();
return p*res;
}
int main()
{
int t;
t = in();
vec p1, p2, p3;
while (t--){
c.x = in(), c.y = in(), r = in();
p1.x = in(), p1.y = in(), p2.x = in(), p2.y = in(), p3.x = in(), p3.y = in();
if (judge(p1, p2) || judge(p2, p3) || judge(p3, p1)) puts("Yes");
else puts("No");
}
return 0;
}
相關文章
- 【計算幾何】線段相交
- 【計算幾何】求線段相交交點座標
- POJ 1127-Jack Straws(計算幾何 線段相交)
- POJ 1039-Pipe(計算幾何-線段相交、求交點)
- 計算幾何
- 計算幾何:模板
- 【計算幾何】點定位(線段,三角形,多邊形)
- [筆記] 計算幾何筆記
- 【計算幾何】向量表示
- 【總結】計算幾何模板
- 二維計算幾何模板
- 三維計算幾何模板
- 計算幾何 —— 二維幾何基礎 —— 距離度量方法
- 邊緣計算、霧計算、雲端計算區別幾何?
- 【學習筆記】計算幾何筆記
- 計算幾何_向量的實現
- 【計算幾何】多邊形交集
- POJ - 1556 【計算幾何 + 最短路】
- An Easy Problem?! POJ 2826 計算幾何
- 計算幾何常用的函式/方法函式
- 丘成桐演講全文:幾何與計算數學的關係
- 幾種計算圓周率的軟體比較
- BNUOJ 12887 isumi(計算幾何+最大流)
- SGU 124 Broken line(計算幾何)
- 【計算幾何】Triangles HUST 1607
- 【計算幾何】多邊形點集排序排序
- 兩圓相交求面積c++C++
- BZOJ 1043: [HAOI2008]下落的圓盤 計算幾何,貪心,線段交
- C++計算幾何演算法大全C++演算法
- POJ 2991 Crane(線段樹+計算幾何)
- 【計算幾何】點在多邊形內部
- POJ 1556 The Doors(Dijkstra+計算幾何)
- 二維幾何常用運算
- SGU 120 SGU 228 Archipelago(計算幾何)Go
- 計算機視覺—圖片幾何變換(2)計算機視覺
- BZOJ 1027 合金 計算幾何,Floyd判環
- CG_Hadoop:基於MapReduce的計算幾何Hadoop
- 計算機圖形學(四)_幾何變換_1_基本的二維幾何變換(一)計算機