题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1503
————————————————————————————————————————————
1503: 点到圆弧的距离
Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 850 Solved: 221 SpecialJudge
Description
输入一个点P和一条圆弧(圆周的一部分),你的任务是计算P到圆弧的最短距离。换句话说,你需要在圆弧上找一个点,到P点的距离最小。
提示:请尽量使用精确算法。相比之下,近似算法更难通过本题的数据。

Input
输入包含最多10000组数据。每组数据包含8个整数x1, y1, x2, y2, x3, y3, xp, yp。圆弧的起点是A(x1,y1),经过点B(x2,y2),结束位置是C(x3,y3)。点P的位置是 (xp,yp)。输入保证A, B, C各不相同且不会共线。上述所有点的坐标绝对值不超过20。

Output
对于每组数据,输出测试点编号和P到圆弧的距离,保留三位小数。你的输出和标准输出之间最多能有0.001的误差。

Sample Input
0 0 1 1 2 0 1 -1
3 4 0 5 -3 4 0 1
Sample Output
Case 1: 1.414
Case 2: 4.000
Hint
Source
湖南省第十届大学生计算机程序设计竞赛

————————————————————————————————————————————

首先能确定的是,在圆弧所在的扇形的角内的点,最近距离是dis(p,r),否则是min(dis(p,a),dis(p,c)).

所以就是如何确定在不在扇形所在的角内了 扇形所在的角如下图所示

分为劣弧和优弧,

在判断上要有所不同,

  • 劣弧
    劣弧的时候很好判定这里运用了向量叉积的判定方法,只要ra−→和rp→在rc→的同一侧且rc→和rp→在ra−→的同一侧 \overrightarrow{r a} 和\overrightarrow{rp} 在\overrightarrow{r c} 的同一侧 且 \overrightarrow{r c} 和\overrightarrow{rp} 在\overrightarrow{r a} 的同一侧 就能保证了,

  • 优弧
    优弧的时候麻烦一些,对于p’ 可以和劣弧相同,不赘述
    对于p和p”却要不一样, 首先我们只要b可以再弧上的任意位置,以b为参考点是不行的.
    但其实仔细观察∠arc\angle arc和点p” 其实发现这就是反过来的劣弧的情况,所以在判断是优弧的情况下来重复劣弧的过程就行了,

那么就只剩下怎么判断优劣弧,
其实只要判断∠abc\angle abc的角度就好了 大于90度就是劣弧,小于90度就是优弧,(不解释)
为了方便计算我们转化为余弦公式计算,判断正负就好了

附本题代码
————————————————————————————————————————————

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL ;
const int N = 1000+7;
const int MOD = 1000000007;
#define abs(x)  (((x)>0)?(x):-(x))/***************************************/struct point{double x,y;
}a,b,c,r,p;double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}double dis2(point a,point b){return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}double mutli(point p1,point p2,point p3){return ((p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x));
}point solvepointR(){double  x1,x2,x3,y1,y2,y3;x1=a.x,y1=a.y;x2=b.x,y2=b.y;x3=c.x,y3=c.y;point t;t.x=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2*(x3-x1)*(y2-y1)-2*((x2-x1)*(y3-y1)));t.y=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2*(y3-y1)*(x2-x1)-2*((y2-y1)*(x3-x1)));return t;
}int Main(){int kcase = 0;while(~scanf("%lf%lf",&a.x,&a.y)){scanf("%lf%lf",&b.x,&b.y);scanf("%lf%lf",&c.x,&c.y);scanf("%lf%lf",&p.x,&p.y);r = solvepointR();
//        printf("R : %lf %lf\n",r.x,r.y);double R = dis(r,a);double pa = dis(p,a),pc = dis(p,c),pcir=fabs(dis(p,r)-R);
//        printf("%lf %lf %lf\n",pa,pc,pcir);double ans = min(pa,pc);if(mutli(r,c,p)*mutli(r,c,b)>=0 && mutli(r,a,p)*mutli(r,a,b)>=0)ans = pcir;if( (dis2(a,b)+dis2(b,c)-dis2(a,c))/(2*dis(a,b)*dis(b,c)) >=0 ){if(mutli(r,c,p)*mutli(r,c,a)<0 || mutli(r,a,p)*mutli(r,a,c)<0){
//                puts("----");ans = pcir;}}printf("Case %d: %.3f\n",++kcase,ans);}return 0;
}

CSUOJ 1503: 点到圆弧的距离 [叉积+三角形外心]【计算几何】相关推荐

  1. 点到直线的距离c语言程序,计算几何算法2. 关于线和点到线的距离(二维和三维)...

    关于直线 直线方程 点到直线的距离 用两点表示的直线 2d隐式表示的直线的情形 参数方程表示的直线 一个点到射线或线段的距离 代码实现 距离计算是计算机图形学和计算几何的基本问题,而且有很多关于这方面 ...

  2. 三维向量的简单运算(点积、叉积及点到直线的距离)

    三维向量的点积(Dot Product) 点乘比较简单,是相应元素的乘积的和:    V1( x1, y1, z1)·V2(x2, y2, z2) = x1*x2 + y1*y2 + z1*z2; 注 ...

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

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

  4. 叉积求点到平面距离_OpenCV计算点到直线的距离 数学法

    我们在检测图像的边缘图时,有时需要检测出直线目标,hough变换检测出直线后怎么能更进一步的缩小区域呢?其中,可以根据距离来再做一判断,就涉及到了点与直线的距离问题. 点到直线距离代码如下: //== ...

  5. 关于计算点到线段的距离

    已知线段AB,求某点到该线段的距离.有三种情况,如图:图中只画出两种,其实垂足在另一侧也是一样的.还有就是垂足与A或B共点,这两种情形可以按照前述两种情况任意之一处理. 当垂足在线段上时(包括垂足与A ...

  6. c# 计算点到线段的距离

    //计算点到线段的距离 public double pointToLine(Vector2 point,LineBase line) {//距离double distance =0;//线段的起点与终 ...

  7. 点到线段的距离_直线垂直,垂线的性质,点到直线的距离

    欢迎关注公z号:沈阳奥数 两条直线相交所成的四个角中,有一个角是直角时,就说这两条直线互相垂直,其中一条直线叫做另一条直线的垂线,它们的交点叫垂足. 如图,直线AB与CD垂直于点E,记作:AB⊥CD于 ...

  8. 玲珑杯-射击气球-点到线段的距离

    玲珑杯-射击气球-点到线段的距离 求点到线段的距离 由于网页显示吃tab键,缩进无法正常显示 对于空间V-xyz三维几何中点到水平线段的距离,可以投影到xy平面(欧式几何)上.distance = √ ...

  9. URAL 1348. Goat in the Garden 2[求点到线段的距离]

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1348 题目的意思是:求一个点到线段的最短距离和最长距离.. 最长距离比较容易,就是求点到 ...

最新文章

  1. dataframe重命名
  2. 前端模拟数据的技术方案(二)
  3. linux下shell的工作原理
  4. vdp备份oracle系统,VDP文件级恢复需要在用VDP备份的机器上浏览
  5. [[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
  6. 利用python转载朋友微信表情包
  7. linux文件误删除该如何恢复?
  8. 从概念入手,了解AWS在Iaas、Paas,Saas层的服务
  9. 导弹发射-河南省第九届省赛D题
  10. String StringBuffer StringBuilber
  11. 原创如何解决内存不能为“read”或“written”
  12. android 文本框(textview)左右滑动
  13. 微信拓客php开发,微擎框架二次开发基础+红包拓客裂变应用
  14. ASEMI超快恢复二极管与肖特基二极管可以互换吗
  15. 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类
  16. 【BMS】锂电池充放电倍率C
  17. Redox OS 发布 0.5 版
  18. 基于51单片机的光照强度检测c语言程序,智能仪器课程设计-基于51单片机的光照强度检测报告.doc...
  19. 解决Google中文简体搜索模式无法搜索到敏感内容
  20. google colab代码自动补全快捷键设置

热门文章

  1. 分形(Fractal)及分形维数(Fractal dimension)
  2. 论文中的“东中西部”到底如何划分?权威解答+代码
  3. win7系统数据库服务器,win7可以做数据库服务器吗
  4. PICGO配置七牛平台失败-getaddrinfo ENOTFOUND upload
  5. 计算机视觉技术公司列表
  6. Nginx 解决跨域问题
  7. 解决html访问本地数据时出现的跨域问题
  8. 画ROC为什么clf.predict_proba(X_train)[:, 1] 而不是[:,0]?
  9. ASP.NET 电影票信息的增删查改
  10. Ubuntu18.04报错解决方案:could not select device driver ““ with capabilities: [[gpu]]