圓與三角形相交問題(51nod 1298)

2021-08-19 15:51:17 字數 2180 閱讀 3239

假設圓心為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 對於任意的一條線,如果兩個端點都在圓外,則計算兩端點與圓心構成的角是否有鈍角,如果有則沒有...