hust1346(两个线段的最近距离和最小距离)
题意:
给出两个线段的端点,让你求这两条线段的最近距离和最远距离。
思路:
最近距离只可能出现在端点到垂足或者端点到端点上,最长距离只会出现在端点到端点上。
代码:
#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 && 文章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 ...
- 求空间两条直线之间的距离
1. 前言 最近老板让写一段空间点匹配的代码, 其中涉及到求空间两直线之间的距离,写起来满费劲的, 这里做一个记录. 2. 处理思路 空间两直线之间的位置关系主要可以分为: 重合, 平行, 相交, 异 ...
- 点到线段直线的距离, 直线与直线的关系 直线与线段的关系
//代码参考与kuangbin的模板#include<bits/stdc++.h> using namespace std;const double eps = 1e-8; const d ...
- LeetCode简单题之两栋颜色不同且距离最远的房子
题目 街上有 n 栋房子整齐地排成一列,每栋房子都粉刷上了漂亮的颜色.给你一个下标从 0 开始且长度为 n 的整数数组 colors ,其中 colors[i] 表示第 i 栋房子的颜色. 返回 两栋 ...
- gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法
<PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法>要点: 本文介绍了PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法,希望对您有用.如果有疑问,可以联系我们. 本文实 ...
- R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离
R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...
- c#算两个火星坐标的距离(高德or百度)
/// <summary>/// 获取两个坐标之间的距离/// </summary>/// <param name="lat1">第一个坐标的X ...
- sklearn计算两个向量之间的距离
from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import euc ...
最新文章
- 新时代的网络工程师需要掌握哪些技能
- Redis 与 MQ 的区别
- 使用Dockerfile创建一个tomcat镜像
- 设置vim打开文件光标指在上次退出位置
- 依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection
- php基础教程 第七步数组补充及循环基础
- android逆向分析有什么用,如何开始对Android应用的逆向分析?
- sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
- php 百度报表工具下载,PHP Report Maker12最新版
- css就近原则_CSS的引入方式和优先级
- Java学习之InputStream中read()与read(byte[] b)
- 大数据杀熟?还是??
- 整理牛人看文献的方法
- 安卓真机如何连接本地服务器_Android真机连接本地服务器安装部署方法
- 用map集合形容朋友
- Java字符串基础语法
- “感动阿里”的技术小二刘畅:善良的事情,我身边很多人都在做
- 美式期权定价利率衍生证券
- 从前慢-谷粒商城篇章4
- 七夕学习礼物:轻巧好用的讯飞智能录音笔SR101
热门文章
- [云炬python3玩转机器学习] 5-6最好的衡量线性回归法的指标: R Squared
- adf检验代码 python_第22期:向量自回归(VAR)模型预测——Python实现
- 如何把ACCESS转成SQL数据库
- 三个很有用的sqlserver中的处理多个以分隔符分隔的参数的函数
- bash-shell详解
- 程序猿要什么爱情,陪你未来的是键盘和代码啊!
- jmeter结果分析
- 王爽汇编语言实验7一个很好的解法(转)
- 第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
- Altium Designer -- PCB 叠层设计