假設圓心為c,半徑為r。
如果a點在圓內,則|a
c|<
r |ac
|<
r;在圓上,則|a
c|=r
| ac
|=
r;在圓外,則|a
c|<
r |ac
|
若三角形
δ δ
的所有點都位於圓內(外),則這個三角形就整體位於圓內(外)。 |a
c|∀a∈δ
⇔δ在圓
內 |ac
|
∀a∈δ
⇔δ
在圓內|ac
|>r,
∀a∈δ
⇔δ在圓
外 |ac
|>r,
∀a∈δ
⇔δ
在圓外而|
ac|∀a∈δ
| ac
|
∀a∈δ
等價於maxa∈δ
|ac|
<
r maxa∈
δ|ac
|<
r, |a
c|>r,
∀a∈δ
| ac
|>r,
∀a∈δ
等價於mina∈δ
|ac|
>
r mina∈
δ|ac
|>
r所以 maxa∈
δ|ac
|δ在圓內
maxa∈δ
|ac|
δ在圓內
mina∈
δ|ac
|>r⇔
δ在圓外
mina∈δ
|ac|
>r⇔
δ在圓外
取補集得到
maxa∈δ
|ac|
≥r,mina∈
δ|ac
|≤r⇔
δ與圓相
交 maxa∈
δ|ac
|≥r,
mina∈δ
|ac|
≤r⇔δ
與圓相交
所以問題簡化成去尋找三角形上離圓心最近的點和最遠的點,若最近的點在圓內、上,最遠的點在圓外、上,三角形就會與圓相交。
對於線段bd,距離點c的最遠點一定是點b或點d。
所以只需比較三角形三個頂點就能找到最遠點。m∈
bd⇔∠
mbd≤
90∘,∠
mdb≤
90∘m ∈b
d⇔∠m
bd≤90
∘,∠m
db≤90
∘找到三條線段上的最近點然後在比較,找到最近點。
#include
#include
#include
#define for(i, a, b) for(int i = a; i < b; ++i)
using
namespace
std;
typedef
struct
}point;
istream& operator >>(istream &is, point &p)
float dis2(const point &a, const point &b)
float distance(const point &a, const point &line1, const point &line2)
else
return
abs(x-x1);
}bool less90(const point &a, const point &b, const point &c)
float shortest(const point &a, const point &line1, const point &line2)
int main()
float s = *min_element(short_dis,short_dis+3);
float l = *max_element(long_dis,long_dis+3);
if (s <= radius && l >= radius)
cout
<<"yes"
cout
<<"no"
0;}
向量法判斷圓與三角形相交
利用向量法避開討論正負的問題,大意就是給三角形判斷與圓是否相交的問題 struct l inline double dis double x,double y,double m,double n,double o,double p 判斷可能的三種情況,大於1為遠離點,小於0為近點,否則為中間點 us...
圓與三角形(圓與三角形是否相交)
給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出 yes 否則輸出 no 三角形的面積大於0 第1行 乙個數t,表示輸入的測試數量 1 t 10000 之後每4行用來描述一組測試資料。4 1 三個數,前兩個數為圓心的座標xc,yc,第3個數為圓的半徑r。3000 xc,yc ...
51nod 圓與三角形
當時想的好麻煩啊.後來突然靈光一閃有了思路。思路如下 1逐個判斷相鄰兩點組成的線是否與圓有交點 2 對於任意的一條線,如果兩端點只有乙個在圓內則有交點 3 對於任意的一條線,如果兩個端點都在圓內則沒有交點 4 對於任意的一條線,如果兩個端點都在圓外,則計算兩端點與圓心構成的角是否有鈍角,如果有則沒有...