1503: 点到圆弧的距离

分析:

先判断点和圆心的连线是否在圆弧范围内,如果在,最短距离即到圆心的距离减去半径的绝对值;反之,为到端点的最短距离。

具体看注释

#include <bits/stdc++.h>
using namespace std; #define eps 1e-8
const double pi=acos(-1); struct Point
{
double x,y;
Point(double a=0,double b=0)
{
x=a;
y=b;
}
}; Point operator - (Point a,Point b)
{
return Point(a.x-b.x,a.y-b.y);
} double dist(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} double multi(Point a,Point b)
{
return a.x*b.x+a.y*b.y;
} double cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
} Point TriangleCircumCenter(Point a,Point b,Point c)
{
Point res;
double a1=atan2(b.y-a.y,b.x-a.x)+pi/2;
double a2=atan2(c.y-b.y,c.x-b.x)+pi/2;
double ax=(a.x+b.x)/2;
double ay=(a.y+b.y)/2;
double bx=(c.x+b.x)/2;
double by=(c.y+b.y)/2;
double r1=(sin(a2)*(ax-bx)+cos(a2)*(by-ay))/(sin(a1)*cos(a2)-sin(a2)*cos(a1));
return Point(ax+r1*cos(a1),ay+r1*sin(a1));
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int x1,y1,x2,y2,x3,y3,xp,yp;
int kase=0;
while(~scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&xp,&yp))
{
Point p1=Point(x1,y1);
Point p2=Point(x2,y2);
Point p3=Point(x3,y3);
Point pp=Point(xp,yp);
Point pc=TriangleCircumCenter(p1,p2,p3); //算圆心
double temp=cross(p2-p1,p3-p1);
if(temp<0) //如果是顺时针,把p1和p3点互换
{
Point t=p1;
p1=p3;
p3=t;
}
double cosA=multi(p1-pc,p3-pc)/(dist(p1,pc)*dist(p3,pc));
if(fabs(cosA)>1) //如果fabs(cosA)>1,那么acos(cosA)算出的结果是不合法的
{
if(cosA<0) cosA+=eps;
else cosA-=eps;
}
double maxd=acos(cosA); //算p1-pc与p3-pc的夹角
if(cross(p1-pc,p3-pc)<0 && fabs(cross(p1-pc,p3-pc))>eps)
maxd=2*pi-maxd;
double cosB=multi(p1-pc,pp-pc)/(dist(p1,pc)*dist(pp,pc));
if(fabs(cosB)>1)
{
if(cosB<0) cosB+=eps;
else cosB-=eps;
}
double degree=acos(cosB); //算p1-pc与pp-pc的夹角
if(cross(p1-pc,pp-pc)<0 && fabs(cross(p1-pc,pp-pc))>eps)
degree=2*pi-degree;
if(degree<maxd)
printf("Case %d: %.3lf\n",++kase,fabs(dist(pp,pc)-dist(p1,pc)));
else
printf("Case %d: %.3lf\n",++kase,min(dist(pp,p1),dist(pp,p3)));
}
return 0;
}

csu-acm 1503: 点到圆弧的距离的更多相关文章

  1. csu 1503: 点到圆弧的距离

    1503: 点到圆弧的距离 Time Limit: 1 Sec  Memory Limit: 128 MB  Special JudgeSubmit: 614  Solved: 101[Submit] ...

  2. csuoj 1503: 点到圆弧的距离

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec  内存限制: 128 MB  Speci ...

  3. CSU 1503: 点到圆弧的距离(计算几何)

    题目描述 输入一个点 P 和一条圆弧(圆周的一部分),你的任务是计算 P 到圆弧的最短距离.换句话 说,你需要在圆弧上找一个点,到 P点的距离最小. 提示:请尽量使用精确算法.相比之下,近似算法更难通 ...

  4. CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...

  5. 点到圆弧的距离(csu1503)+几何

    1503: 点到圆弧的距离 Time Limit: 1 Sec  Memory Limit: 128 MB  Special JudgeSubmit: 325  Solved: 70[Submit][ ...

  6. csu 1503: 点弧之间的距离-湖南省第十届大学生计算机程序设计大赛

    这是--比量p并用交点连接中心不上弧.在于:它至p距离.是不是p与端点之间的最短距离 #include<iostream> #include<map> #include< ...

  7. LA 3027 Corporative Network 并查集记录点到根的距离

    Corporative Network Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [S ...

  8. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  9. POJ1584 判断多边形是否为凸多边形,并判断点到直线的距离

    求点到直线的距离: double dis(point p1,point p2){   if(fabs(p1.x-p2.x)<exp)//相等的  {    return fabs(p2.x-pe ...

随机推荐

  1. HDFS 高可用(HA)环境搭建

    步骤一:修改公共属性配置 core-site.xml 文件 [root@node-01 ~]# cd /root/apps/hadoop-3.2.1/etc/hadoop [root@node-01 ...

  2. Mybatis 逆向工程使用(Day_17)

    有三个方法可以解决所有的问题:接受,改变,离开.不能接受那就改变,不能改变,那就离开. [何为逆向工程?] 众 所 周 知 ,正向工程就是通过JAVA类的设置来生成对应的数据库表. MyBatis逆向 ...

  3. GO学习-(21) Go语言基础之Go性能调优

    Go性能调优 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况. Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling ...

  4. Docker学习(2) 安装

    1 在Ubanru中安装 简单安装: 2 windows安装docker 3 OS X 安装docker

  5. 微信内 H5 页面自定义分享

    起源: 最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等).问题是点击微信的原生分享时,会把携带的这些参数一起分享出去,等于 ...

  6. 硬件delay评估表

    硬件delay评估表 硬件延时评估表用于快速评估一个模型在特定硬件环境和推理引擎上的推理速度. Bw 主要用于定义PaddleSlim支持的硬件延时评估表的格式. 概述 硬件延时评估表中存放着所有可能 ...

  7. GPU加速库AmgX

    GPU加速库AmgX AmgX提供了一条简单的途径来加速NVIDIA GPU上的核心求解器技术.AmgX可以为模拟的计算密集型线性求解器部分提供高达10倍的加速度,特别适合于隐式非结构化方法. 它是一 ...

  8. CVPR 2020目标跟踪多篇开源论文(上)

    CVPR 2020目标跟踪多篇开源论文(上) 1. SiamBAN:面向目标跟踪的Siamese Box自适应网络 作者团队:华侨大学&中科院&哈工大&鹏城实验室&厦门 ...

  9. CodeGen准备存储库

    CodeGen准备存储库 CodeGen几乎总是与提供用于生成源文件的元数据的存储库结构一起使用,并且许多令牌需要使用存储库结构. 基本要求是有一个结构定义,并且该结构定义包含一个或多个字段定义.有些 ...

  10. ieda引入jstl后报错解决办法

    报错如下: HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in ei ...