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

19人阅读 评论(0) 收藏 举报
分类:
题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"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)三角形的三点都在圆内,即圆心到三条边的距离都小于半径R
2)当三角形的三点都在圆外时,只有圆心到三条边的距离都大于半径R时才满足不相交。

其余的情况都是相交。

这里还要解决的一个问题就是如何求圆心到三条边的距离?
利用海伦公式,p=(a+b+c)/2;S=sqrt(p*(p-a)*(p-b)*(p-c));-->S=h*d/2;
把三角形上的两个点与圆心看成一个三角形,通过这个三角形的面积来求出圆心到这条边的距离。

#include<bits/stdc++.h>
#define M 1e-6
using namespace std;
double dis1(double a,double b,double x,double y)
{
    return sqrt((a-x)*(a-x)+(b-y)*(b-y));
}
double dis2(double a1,double b1,double a2,double b2,double x,double y)
{
    double a=dis1(a1,b1,x,y);
    double b=dis1(a2,b2,x,y);
    double c=dis1(a1,b1,a2,b2);
    if(a*a>=b*b+c*c)
        return b;
    else if(b*b>=a*a+c*c)
        return a;
    double p=(a+b+c)/2;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));
    return s*2/c;///海伦公式 利用圆心与三角形的两点形成的三角形来求圆心到边的距离
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        double x,y,r;
        double a1,b1,a2,b2,a3,b3;
        double d1,d2,d3,d4,d5,d6;
        cin>>x>>y>>r;
        cin>>a1>>b1;
        cin>>a2>>b2;
        cin>>a3>>b3;
        d1=dis1(a1,b1,x,y);
        d2=dis1(a2,b2,x,y);
        d3=dis1(a3,b3,x,y);///三点到圆心的距离
        d4=dis2(a1,b1,a2,b2,x,y);
        d5=dis2(a1,b1,a3,b3,x,y);
        d6=dis2(a2,b2,a3,b3,x,y);///求圆心到三边的距离
        if(d4-r>M&&d5-r>M&&d6-r>M)
            printf("No\n");
        else if(d1<r&&d2<r&&d3<r)
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}

查看评论

51实战演练之存储器

-
  • 1970年01月01日 08:00

R语言:图形

常用的图形,这里给出案例:barplot条形图、单向量条形图> attach(mtcars) The following object is masked from package:ggplot2: ...
  • xxzhangx
  • xxzhangx
  • 2016-12-04 23:44:04
  • 739

R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)

首先准备测试数据*(mtcars)分别为CSV.    TXTR语言数据分析案例:直通车read.table 默认形式读取CSV(×)与TXT(效果理想)① &amp;gt; test&amp;lt;...
  • HHTNAN
  • HHTNAN
  • 2017-01-24 12:23:26
  • 20289

R语言从基础入门到提高(六) frame 框架

第1程序: What's a dataframe? 100xp You may remember from the chapter aboutmatrices that all the elem...
  • qq_26816591
  • qq_26816591
  • 2016-09-01 16:35:41
  • 1821

dplyr包之排列: arrange()

Description This function completes the subsetting, transforming and ordering triad with a function...
  • lanfengchalan
  • lanfengchalan
  • 2017-03-30 17:08:53
  • 904

机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新......)

机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新……)author@jason_ql http://blog.csdn.net/lql07161、机器学习/深度学习1.1...
  • lql0716
  • lql0716
  • 2017-04-23 00:55:15
  • 11017

R - 内置数据集

Iris (鸢尾花)数据集 Sepal花萼 Petal 花瓣 Species 种属 &amp;gt; iris Sepal.Length Sepal.Width Petal.Len...
  • u013043762
  • u013043762
  • 2018-02-17 10:10:05
  • 199

Hadoop数据去重详解

Hadoop集群(第9期)_MapReduce初级案例 1、数据去重    "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从...
  • lzq123_1
  • lzq123_1
  • 2014-11-07 17:12:00
  • 4397

R语言绘图-散点图

R语言绘图-散点图散点图是展示两个或多个数值型变量相关性特征的常用工具,通常包括简单散点图、三维散点图、矩阵散点图等。简单散点图简单散点图是将观测数据绘制在一个二维平面中,以此观察数值型变量之间的相关...
  • guomj_cdc
  • guomj_cdc
  • 2017-10-22 11:30:29
  • 301

hadoop的编程实例

原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮...
  • qiezikuaichuan
  • qiezikuaichuan
  • 2015-06-10 21:26:34
  • 947
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2115
    排名: 2万+
    最新评论