假設圓心為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 #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 ... 當時想的好麻煩啊.後來突然靈光一閃有了思路。思路如下 1逐個判斷相鄰兩點組成的線是否與圓有交點 2 對於任意的一條線,如果兩端點只有乙個在圓內則有交點 3 對於任意的一條線,如果兩個端點都在圓內則沒有交點 4 對於任意的一條線,如果兩個端點都在圓外,則計算兩端點與圓心構成的角是否有鈍角,如果有則沒有...#include
向量法判斷圓與三角形相交
圓與三角形(圓與三角形是否相交)
51nod 圓與三角形