[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 <= 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

要点:  关键是判断圆与三角形是否相交,相交有多种情况:顶点在圆上,至少一个顶点在圆内至少一个在圆外,顶点都在圆外但是有边在圆的内部,相切的情况等,所以选择判断不相交的情况。只有两种:三个顶点都在圆内或者圆心到三条边的距离都大于半径。其余的就是相交的情况。代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

const double eps = 1e-8;
int cmp(double x)
{
    if (fabs(x) < eps) return 0;
    if (x > 0) return 1;
    return -1;
}

struct point
{
    double x, y;

    point() {}
    point(double a, double b):x(a),y(b) {}

    void input() {
        scanf("%lf%lf", &x, &y);
    }
    friend point operator - (const point &a, const point &b) {
        return point(a.x-b.x, a.y-b.y);
    }
    double norm() {
        return sqrt(x*x + y*y);
    }
};

struct cicle
{
    point p;
    double r;

    void input() {
        scanf("%lf%lf%lf", &p.x, &p.y, &r);
    }
};

double dot(const point &a, const point &b)
{
    return a.x*b.x + a.y*b.y;
}

double det(const point &a, const point &b)
{
    return a.x*b.y - a.y*b.x;
}

double dist(const point &a, const point &b)
{
    return (a-b).norm();
}

double dis_point_segment(const point p, const point s, const point t)
{
    if (cmp(dot(p-s,t-s))<0) return (p-s).norm();
    if (cmp(dot(p-t,s-t))<0) return (p-t).norm();
    return fabs(det(s-p,t-p)/dist(s, t));
}

bool cross(cicle o, point a, point b, point c)
{
    double d1, d2, d3;
    d1 = dist(o.p, a);
    d2 = dist(o.p, b);
    d3 = dist(o.p, c);

    if (d1<o.r && d2<o.r && d3<o.r)
        return false;
    if (dis_point_segment(o.p, a, b)>o.r
        && dis_point_segment(o.p, a, c)>o.r
        && dis_point_segment(o.p, b, c)>o.r)
        return false;
    return true;
}

int main()
{
    //freopen("1.txt", "r", stdin);
    int T;
    scanf("%d", &T);
    while (T--) {
        cicle o;
        o.input();
        point a, b, c;
        a.input();
        b.input();
        c.input();
        if (cross(o, a, b, c))
            printf("Yes\n");
        else
            printf("No\n");

    }

    return 0;
}
时间: 2024-10-14 15:47:51

[51nod]1298 圆与三角形的相关文章

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 =

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 园与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"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个点的

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个点的

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

圆与三角形碰撞检测

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

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

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