1298 圆与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。

Input

第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据。
4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R。(-3000 <= xc, yc <= 3000, 1 <= R <= 3000)
4-2:2个数,三角形第1个点的坐标。
4-3:2个数,三角形第2个点的坐标。
4-4:2个数,三角形第3个点的坐标。(-3000 <= xi, yi <= 3000)

Output

共T行,对于每组输入数据,相交输出"Yes",否则输出"No"。

Input示例

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

Output示例

Yes
No
/*
   圆与三角形是否相交,转化为线段与圆相交

   1.两点都在圆内  --相离
   2.一点在圆内,一点在圆外  --相交
   3.两点都在圆外
    ① .如果圆心到线段所在直线的距离>r  --相离
    ② .距离<=r
     如果圆心与线段两个端点以及线段本身组成的夹角都是锐角   --相交
     否则  --相离
 */
#include <bits/stdc++.h>

#define MAXK 5

using namespace std;

struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;
        y=_y;
    }
};
int t;
double a,b,r;
Point p[MAXK],O;
bool ok;

int judge(Point *p1, Point *p2,double r) {//点p1和p2都不在圆内
    double a, b, c, dist1, dist2, angle1, angle2; // ax + by + c = 0;
    if (p1->x == p2->x)
        a = 1, b = 0, c = -p1->x;//特殊情况判断,分母不能为零
    else if (p1->y == p2->y)
        a = 0, b = 1, c = -p1->y;//特殊情况判断,分母不能为零
    else {
        a = p1->y - p2->y;
        b = p2->x - p1->x;
        c = p1->x * p2->y - p1->y * p2->x;
    }
    dist1 = a * O.x + b * O.y + c;
    dist1 *= dist1;
    dist2 = (a * a + b * b) * r * r;
    if (dist1 > dist2) return 0;//点到直线距离大于半径r
    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;
}

inline void init(){
    ok=false;
}

int main(){
//    freopen("in.txt","r",stdin);
    scanf("%d",&t);
    while(t--){
        init();
        scanf("%lf%lf%lf",&a,&b,&r);
        O.x=a;
        O.y=b;
        int flag1=0;//圆上
        int flag2=0;//圆外
        int flag3=0;//圆内
        for(int i=0;i<3;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
            if((a-p[i].x)*(a-p[i].x)+(b-p[i].y)*(b-p[i].y)==r*r)
                flag1++;
            else if((a-p[i].x)*(a-p[i].x)+(b-p[i].y)*(b-p[i].y)>r*r)
                flag2++;
            else
                flag3++;
        }
        if(flag1!=0){//有在圆上的
            puts("Yes");
            continue;
        }else if(flag2!=0&&flag3!=0){//有在内也有在外的
            puts("Yes");
            continue;
        }else if(flag2==0&&flag3!=0){//全部在圆内
            puts("No");
            continue;
        }else{//都在圆外就要讨论了
            for(int i=0;i<3;i++){
                if(judge(&p[i%3],&p[(i+1)%3],r)==true){
                    ok=true;
                    break;
                }
            }
            if(ok==false){
                puts("No");
            }else{
                puts("Yes");
            }
        }
    }
    return 0;
}
时间: 2024-08-29 21:02:02

1298 圆与三角形的相关文章

[51nod]1298 圆与三角形

1298 圆与三角形 题目来源: HackerRank 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R 

51 Nod 1298 圆与三角形(计算几何)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 题目: 1298 圆与三角形 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标x

51nod 1298 圆与三角形 (计算几何)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 求出圆心到三条线段的最短距离,然后判断是否有顶点在圆外,就把全部情况举出来. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 const double PI =

51nod-1298 圆与三角形(计算几何超详解)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据.4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.

C# Graphic 绘制圆、三角形、椭圆、图片

原文:C# Graphic 绘制圆.三角形.椭圆.图片 在form和panel上可以绘制图形,线段,圆,文字,图形等等. 绘制代码必须放在OnPaint()函数里面,因为窗体刷新的时候,都会调用该函数,重新刷新所绘的图. 示例代码在Panel上绘制图形来简单的描述下绘线和绘图原理. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System

51nod 1298 园与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R <= 3000) 4-2:2个数,三角形第1个点的

51Nod 圆与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R <= 3000) 4-2:2个数,三角形第1个点的

圆与三角形碰撞检测

圆与三角形之间的碰撞检测算法可以综合运用之前写过的基本图形间的碰撞检测算法. 如果圆心在三角形内,则三角形与圆必然相交,转换为判断点在三角形内,参考:判断点是否在三角形内: 如果圆与三角形任一条边相交,则三角形与圆必然相交,转换为圆与线段相交,参考:圆与线段碰撞检测: 算法实现如下: 圆与三角形碰撞检测

均匀的生成圆和三角形内的随机点

代码在每一章节最后   一.均匀生成圆内的随机点 我们知道生成矩形内的随机点比较容易,只要分别随机生成相应的横坐标和纵坐标,比如随机生成范围[-10,10]内横坐标x,随机生成范围[-20,20]内的纵坐标y,那么(x,y)就是生成的随机点.由此,我们很容易的想到了算法1 算法1(正确的): 每个圆对应一个外切矩形,我们随机生成矩形内的点,如果该点在圆内,就返回改点,否则重新生成直到生成的点在圆内. 该方法的缺点是有可能连续几次都生成不了符合要求的点.(可以求得:每次生成点时,该点有 的概率在圆