ps:虽然是第一次做计算几何,但是还是acacac了开心。(虽然罚时多了点OrzOrzOrz)

题目链接:

http://codeforces.com/gym/102056/problem/F

题面:

题意:

给定三维空间的一个起点sss终点eee和一个ooo为球心的球,问sss到eee的最短距离,不能穿过球,可以沿着球面走。

思路:

思路出的很快,就是考虑线段与球相交与否,如果不相交,显然就是线段长度,相交的话考虑切线和切点构成的弧长,具体情况有下面三种:


前两种答案就是线段长度,后面那种就是sx+弧xx+exsx+弧xx+exsx+弧xx+ex。
当然要是只是判断球心到直线距离?d≤r?d \leq r?d≤r就是线段与球相交(这里是线段不是直线!!)那你就会像我一样:

还存在着这样一种:线段和球没有交点但是d≤rd \leq rd≤r,因为这里的ddd是球到直线的距离。

这种情况也就是∠eso≥90∘或者∠seo≥90∘\angle eso \geq 90^\circ 或者\angle seo \geq 90^\circ∠eso≥90∘或者∠seo≥90∘,特判一下就好。(具体看代码)
还是不知道为啥点到线段距离不行,回头修修板子。

参考代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const double pi = acos(-1);
const double eps=1e-6;
int sgn(double x) {if(fabs(x)<eps)return 0;if(x<0)return -1;return 1;
}
struct Point {double x,y,z;Point(double x=0,double y=0,double z=0):x(x),y(y),z(z) {}double dis(const Point& b)const {return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z));}double len() {return sqrt(x*x+y*y+z*z);}Point operator ^(const Point &b)const { //叉乘return Point(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);}Point operator -(const Point &b)const {return Point(x-b.x,y-b.y,z-b.z);}bool operator ==(const Point &b)const {return sgn(x-b.x)==0 && sgn(y-b.y)==0 && sgn(z-b.z)==0;}double operator *(const Point &b)const {return x*b.x+y*b.y+z*b.z;}double cross(Point b,Point a) { //计算角度return b.x*a.y-b.y*a.x;}double dis_z(Point s,Point e) { //点到直线距离return ((e-s)^(Point(x,y,z)-s)).len()/s.dis(e);}double dis_x(Point s,Point e) { //点到线段距离if(sgn((Point(x,y,z)-s)*(e-s))>=0&&sgn((Point(x,y,z)-e)*(s-e))>=0)return fabs(cross(Point(x,y,z)-s,e-s))/(e-s).len();return min((Point(x,y,z)-s).len(),(Point(x,y,z)-e).len());}
};
double jd(double a,double b,double c) {return acos((a*a+b*b-c*c)/(2*a*b));
}
int main() {int t;scanf("%d",&t);while(t--) {double r;Point s,e,o;scanf("%lf%lf%lf%lf",&o.x,&o.y,&o.z,&r);scanf("%lf%lf%lf%lf%lf%lf",&s.x,&s.y,&s.z,&e.x,&e.y,&e.z);double se=s.dis(e);double ro=o.dis_z(s,e);double so=s.dis(o);double eo=e.dis(o);//printf("ro:%lf\n",ro);if(s==e) {printf("%.8f\n",0.0);} else if(sgn(ro-r)>=0 || jd(so,se,eo)>=(pi/2)||jd(eo,se,so)>=(pi/2) ) {printf("%.8f\n",se);} else {double sx=sqrt(so*so-r*r);double ex=sqrt(eo*eo-r*r);double ans=0.0;double sox=jd(so,r,sx);double eox=jd(eo,r,ex);double soe=jd(so,eo,se);double ans_=soe-sox-eox;ans=ans_*r;printf("%.8f\n",sx+ex+ans);}}return 0;
}
/*
10
10 10 10 1
1 2 1 2 7 3
*/

2018-2019 ACM-ICPC, Asia East Continent FinalsGym 102056F Interstellar … Fantasy(计算几何)相关推荐

  1. 【2020 ICPC Asia East Continent Final】赛前训练

    这里写自定义目录标题 [2020 ICPC Asia East Continent Final]赛前训练 A - Namomo Subsequence 输入: 输出: 样例: 解析: 代码: F - ...

  2. 2020 ICPC Asia East Continent Final_K.Allin

    题面: 题意: 打牌题,意思是说给你五张牌h1,h2,c1,c2,c3:除此之外本题还要考虑未给出的四张牌c4,c5,以及p1,p2. p1,p2是对面已知有的牌,h1,h2是我手上已知有的牌. c1 ...

  3. 2020 ICPC Asia East Continent Final D. City Brain(最短路+三分)

    传送门 题意: 给出nnn​​ 个点,mmm条边的无向带权图,初始边权都为111,一共有kkk 次操作机会,每次操作可以选择一条边使其边权+1+1+1, 通过一条边的时间为 1/1/1/边权 ,求mi ...

  4. 2014 ACM/ICPC Asia Regional Guangzhou Online C题Wang Xifeng's Little Plot(dfs)

    Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  5. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  6. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)

    G.(2019 ACM/ICPC 全国邀请赛(西安)B) Product Weblink https://nanti.jisuanke.com/t/39269 Problem && S ...

  7. 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final) 题解(10 / 13)

    2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final) 9题金 6题银 5题铜 题目比较简单,但是读题太难了- 比赛链接:htt ...

  8. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online

    网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...

  9. 2015 ACM/ICPC Asia Regional Shenyang Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...

最新文章

  1. mysql主主和F5高可用_MYSQL 主主热备高可用方案与实现
  2. eclipse 使 用Ctrl+鼠标左键进入mapper.xml文件的方法
  3. Android Studio中引入RecyclerView的v7包
  4. 绝非玩笑!人工智能或开创黑客新时代
  5. Android插u盘自动执行,android tv box ---- 插入u盘直接播放指定文件夹中的视频
  6. html怎样在一张图片里写字,用HTML代码在图片上写字
  7. pytorch源码解析2——数据处理torch.utils.data
  8. C核心技术手册(二十八)
  9. 浅谈计算机是如何工作的及Linux下的简单反汇编操作
  10. 非堵塞socket实现android手机与PC的文件传输
  11. 我的世界Java种子算法_Minecraft:说说“种子”的使用和原理吧
  12. 男人,如何洞悉女人的内心世界笔记
  13. Docker 安装可视化管理工具Portainer
  14. MySQL添加索引及添加字段并建立索引
  15. docker 和 k8s预研
  16. CMA资质认定和CNAS实验室认可的区别有哪些?
  17. ubuntu下ftp安装和使用(vsftpd)
  18. 关于OV5640的DVP接口的小结
  19. 网站备案靠谱吗_域名快速备案靠谱吗
  20. 6300v2 php服务器,网件R6300 V2与R6300 V1的区别

热门文章

  1. 【JDBC】The new driver class is `com.mysql.cj.jdbc.Driver‘. The driver is automatically
  2. uniapp如何真机测试、微信小程序端测试与模拟器测试
  3. R-Studio万能通用数据恢复方法
  4. 图片边框放在图片中的html,css怎么给图片加上下边框?
  5. Python_PyQuery模块打开本地文件报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 84
  6. 2020年汽车驾驶员(高级)作业考试题库及汽车驾驶员(高级)模拟考试系统
  7. 【iOS】生成Appicon图标、为iOS应用添加图标
  8. 计算机辅助教学发展的现状,计算机辅助教学的应用现状及对策研究
  9. 一文看透指令集、微架构、CPU
  10. C++ Primer第四版(中文版) pdf下载