题意:

给出两个线段的端点,让你求这两条线段的最近距离和最远距离。


思路:

最近距离只可能出现在端点到垂足或者端点到端点上,最长距离只会出现在端点到端点上。

代码:

#include<cstdio>
#include<cstring>
#include<climits>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<sstream>using namespace std;const double eps = 1e-5;
const int maxn=10000;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) {};friend point operator + (const point & a, const point &b){return point(a.x + b.x , a.y + b.y );}friend point operator - (const point & a, const point &b){return point(a.x - b.x, a.y - b.y);}friend point operator * (const point & a, const double &b){return point(a.x * b, a.y * b);}friend point operator / (const point & a, const double &b){return point(a.x / (b+eps), a.y / (b + eps));}friend bool operator == (const point& a, const point& b){return cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0;}double norm(){return sqrt(x*x + y*y);}
};double det(const point &a,const point &b)
{return a.x * b.y - a.y * b.x;
}double dot(point a, point b)
{return a.x * b.x + a.y * b.y;
}
void PointPro(point p,point s,point t,point &cp)
{double r = dot((t - s),(p - s))/dot(t-s,t - s);cp = s +  (( t - s) * r);
}bool On(point p, point s, point t)
{return cmp(det(p-s, t - s)) == 0&& cmp(dot(p-s,p-t))<=0;
}struct polygon
{int n;point a[maxn];polygon() {};double area(){
//      printf("nnnnnnnnnnnnnnnnnnnnnnnn%d\n", n);double sum = 0;a[n] = a[0];for(int i = 0; i < n; i++){
//            puts("JJJJJ");sum += det(a[i + 1], a[i]);}return sum / 2;}point center(){point ans = point(0, 0);
//      printf("a = %lf\n",area());if(cmp(area()) == 0) return ans;a[n] = a[0];for(int i = 0; i < n; i++){ans = ans +(a[i] + a[i + 1]) * det(a[i + 1], a[i]);}return ans / area() / 6.0;}
};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 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)/(s-t).norm());
}struct line
{point a, b;line(const point& a, const point& b) : a(a), b(b) {}
};bool line_jiao(line a, line b)
{bool res=true;res=res&&(cmp(det(a.b-a.a,b.a-a.a))*cmp(det(a.b-a.a,b.b-a.a))<0);res=res&&(cmp(det(a.a-a.b,b.a-a.b))*cmp(det(a.a-a.b,b.b-a.b))<0);res=res&&(cmp(det(b.b-b.a,a.a-b.a))*cmp(det(b.b-b.a,a.b-b.a))<0);res=res&&(cmp(det(b.a-b.b,a.a-b.b))*cmp(det(b.a-b.b,a.b-b.b))<0);return res;
}double _max(double a,double b)
{if(cmp(a-b)>0)return a;return b;
}double _min(double a,double b)
{if(cmp(a- b)>0)return b;return a;
}int main()
{//freopen("in.txt","r",stdin);//printf("%d\n",line_jiao(line(point(0,0),point(2,0)),line(point(1,1),point(1,-1))));point a,b,c,d;int cas=1;while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y)!=EOF){double minans=1000000000000.0;double maxans=-1000000000000.0;minans=_min(minans,dis_point_segment(a,c,d));minans=_min(minans,dis_point_segment(b,c,d));minans=_min(minans,dis_point_segment(c,a,b));minans=_min(minans,dis_point_segment(d,a,b));minans=_min(minans,dis(a,c));minans=_min(minans,dis(a,d));minans=_min(minans,dis(b,c));minans=_min(minans,dis(b,d));if(line_jiao(line(a, b), line(c, d)))minans=0.0;maxans=_max(maxans,dis(a,c));maxans=_max(maxans,dis(a,d));maxans=_max(maxans,dis(b,c));maxans=_max(maxans,dis(b,d));if(a==b&&c==d)minans=maxans;printf("Case #%d: %.3lf %.3lf\n",cas++,maxans,minans);}return 0;
}

hust1346(两个线段的最近距离和最小距离)相关推荐

  1. 计算空间中两线段之间的距离

    最近在建立气凝胶的有限元模型中需要计算每两根纤维(线段)之间的距离,最初参考的两篇文章确实提供了关于一些数值方法的计算思路(文章1 && 文章2),但忽略了线段距离问题的理论推导,导致 ...

  2. 三维空间两直线/线段最短距离、线段计算算法

    设有两空间线段 1. Ls L_s,其起点.终点坐标为 s0.s1 s_0.s_1 ,方向向量 u⃗ =s1−s0 \vec u = s_1-s_0 2. Lt L_t,其起点.终点坐标为 t0.t1 ...

  3. 求空间两条直线之间的距离

    1. 前言 最近老板让写一段空间点匹配的代码, 其中涉及到求空间两直线之间的距离,写起来满费劲的, 这里做一个记录. 2. 处理思路 空间两直线之间的位置关系主要可以分为: 重合, 平行, 相交, 异 ...

  4. 点到线段直线的距离, 直线与直线的关系 直线与线段的关系

    //代码参考与kuangbin的模板#include<bits/stdc++.h> using namespace std;const double eps = 1e-8; const d ...

  5. LeetCode简单题之两栋颜色不同且距离最远的房子

    题目 街上有 n 栋房子整齐地排成一列,每栋房子都粉刷上了漂亮的颜色.给你一个下标从 0 开始且长度为 n 的整数数组 colors ,其中 colors[i] 表示第 i 栋房子的颜色. 返回 两栋 ...

  6. gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法

    <PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法>要点: 本文介绍了PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法,希望对您有用.如果有疑问,可以联系我们. 本文实 ...

  7. R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离

    R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...

  8. c#算两个火星坐标的距离(高德or百度)

    /// <summary>/// 获取两个坐标之间的距离/// </summary>/// <param name="lat1">第一个坐标的X ...

  9. sklearn计算两个向量之间的距离

    from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import euc ...

最新文章

  1. 新时代的网络工程师需要掌握哪些技能
  2. Redis 与 MQ 的区别
  3. 使用Dockerfile创建一个tomcat镜像
  4. 设置vim打开文件光标指在上次退出位置
  5. 依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection
  6. php基础教程 第七步数组补充及循环基础
  7. android逆向分析有什么用,如何开始对Android应用的逆向分析?
  8. sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
  9. php 百度报表工具下载,PHP Report Maker12最新版
  10. css就近原则_CSS的引入方式和优先级
  11. Java学习之InputStream中read()与read(byte[] b)
  12. 大数据杀熟?还是??
  13. 整理牛人看文献的方法
  14. 安卓真机如何连接本地服务器_Android真机连接本地服务器安装部署方法
  15. 用map集合形容朋友
  16. Java字符串基础语法
  17. “感动阿里”的技术小二刘畅:善良的事情,我身边很多人都在做
  18. 美式期权定价利率衍生证券
  19. 从前慢-谷粒商城篇章4
  20. 七夕学习礼物:轻巧好用的讯飞智能录音笔SR101

热门文章

  1. [云炬python3玩转机器学习] 5-6最好的衡量线性回归法的指标: R Squared
  2. adf检验代码 python_第22期:向量自回归(VAR)模型预测——Python实现
  3. 如何把ACCESS转成SQL数据库
  4. 三个很有用的sqlserver中的处理多个以分隔符分隔的参数的函数
  5. bash-shell详解
  6. 程序猿要什么爱情,陪你未来的是键盘和代码啊!
  7. jmeter结果分析
  8. 王爽汇编语言实验7一个很好的解法(转)
  9. 第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
  10. Altium Designer -- PCB 叠层设计