日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51Nod 1298 圆与三角形相交 计算几何

發(fā)布時間:2024/10/6 编程问答 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51Nod 1298 圆与三角形相交 计算几何 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

51Nod-1298-圓與三角形

給出圓的圓心和半徑,以及三角形的三個頂點(diǎn),問圓同三角形是否相交。相交輸出"Yes",否則輸出"No"。(三角形的面積大于0)。

Input

?第1行:一個數(shù)T,表示輸入的測試數(shù)量(1 <= T <= 10000),之后每4行用來描述一組測試數(shù)據(jù)。

4-1:三個數(shù),前兩個數(shù)為圓心的坐標(biāo)xc, yc,第3個數(shù)為圓的半徑R。(-3000 <= xc, yc <= 3000, 1 <= R <= 3000)
4-2:2個數(shù),三角形第1個點(diǎn)的坐標(biāo)。
4-3:2個數(shù),三角形第2個點(diǎn)的坐標(biāo)。

4-4:2個數(shù),三角形第3個點(diǎn)的坐標(biāo)。(-3000 <= xi, yi <= 3000)

?Output?

?共T行,對于每組輸入數(shù)據(jù),相交輸出"Yes",否則輸出"No"。?

?Sample Input

2 0 0 10 10 0 15 0 15 5 0 0 10 0 0 5 0 5 5

Sample Output

Yes No

分析:

樣例1的解釋

樣例2的解釋

1.三點(diǎn)全部在圓內(nèi),輸出No?
2.三點(diǎn)全部在圓外
重點(diǎn):判斷三角形三條邊是否存在和圓相交的點(diǎn)
問題就轉(zhuǎn)化為判斷線段是否與圓相交

3.其他情況全部是相交??

核心代碼:

//判斷線段是否和圓相交 bool seg_circle(Point p1, Point p2) {ll a, b, c, dis1, dis2, angle1, angle2;//ax+by+c=0if (p1.x == p2.x){a = 1;b = 0;c = -p1.x;//垂直于x軸 }else if (p1.y == p2.y) {a = 0;b = 1;c = -p1.y;//垂直于y軸 }else {a = p1.y - p2.y;b = p2.x - p1.x;c = p1.x*p2.y - p1.y*p2.x;}dis1 = a*o.x + b*o.y + c;dis1 *= dis1;dis2 = (a*a + b*b)*r*r;if (dis1>dis2)return 0;angle1 = (o.x - p1.x)*(p2.x - p1.x) + (o.y - p1.y)*(p2.y - p1.y);angle2 = (o.x - p2.x)*(p1.x - p2.x) + (o.y - p2.y)*(p1.y - p2.y);if (angle1>0 && angle2>0)return 1;return 0; }

AC代碼

#include<cstdio> using namespace std; typedef long long ll; struct Point {ll x, y; }p[4]; Point o;//圓心 ll r;//半徑 //距離的平方 ll distance(Point a, Point b) {return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y); }//判斷線段是否和圓相交 bool seg_circle(Point p1, Point p2) {ll a, b, c, dis1, dis2, angle1, angle2;//ax+by+c=0if (p1.x == p2.x){a = 1;b = 0;c = -p1.x;//垂直于x軸 }else if (p1.y == p2.y) {a = 0;b = 1;c = -p1.y;//垂直于y軸 }else {a = p1.y - p2.y;b = p2.x - p1.x;c = p1.x*p2.y - p1.y*p2.x;}dis1 = a*o.x + b*o.y + c;dis1 *= dis1;dis2 = (a*a + b*b)*r*r;if (dis1>dis2)return 0;angle1 = (o.x - p1.x)*(p2.x - p1.x) + (o.y - p1.y)*(p2.y - p1.y);angle2 = (o.x - p2.x)*(p1.x - p2.x) + (o.y - p2.y)*(p1.y - p2.y);if (angle1>0 && angle2>0)return 1;return 0; } //判斷圓和三角形是否相交 bool intersect() {ll d0 = distance(o, p[0]), d1 = distance(o, p[1]), d2 = distance(o, p[2]);ll r2 = r*r;//三點(diǎn)在圓內(nèi) if (d0<r2&&d1<r2&&d2<r2)return 0;//三點(diǎn)在圓外 else if (d0>r2&&d1>r2&&d2>r2)return seg_circle(p[0], p[1]) || seg_circle(p[0], p[2]) || seg_circle(p[1], p[2]);return 1; } int main() {//ios::sync_with_stdio(0);int t;scanf("%d", &t);while (t--) {scanf("%lld%lld%lld", &o.x, &o.y, &r);for (int i = 0;i<3;i++)scanf("%lld%lld", &p[i].x, &p[i].y);printf("%s\n", intersect() ? "Yes" : "No");}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的51Nod 1298 圆与三角形相交 计算几何的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。