hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1

Alice and Bob are learning geometry. Recently they are studying about the Fermat Point.
Alice: I wonder whether there is a similar point for quadrangle.
Bob: I think there must exist one.
Alice: Then how to know where it is? How to prove?
Bob: I don’t know. Wait… the point may hold the similar property as the case in triangle.
Alice: It sounds reasonable. Why not use our computer to solve the problem? Find the Fermat point, and then verify your assumption.
Bob: A good idea.
So they ask you, the best programmer, to solve it. Find the Fermat point for a quadrangle, i.e. find a point such that the total distance from the four vertices of the quadrangle to that point is the minimum.
Input
Each test case is a single line which contains eight float numbers, and it is formatted as below:
x 1 y 1 x 2 y 2 x 3 y 3 x 4 y 4
x i, y i are the x- and y-coordinates of the ith vertices of a quadrangle. They are float numbers and satisfy 0 ≤ x i ≤ 1000 and 0 ≤ y i ≤ 1000 (i = 1, …, 4).
The input is ended by eight -1.
Output
Sample Input
1 1 1 1 1 1 1 1
-1 -1 -1 -1 -1 -1 -1 -1
四边形费马点
平面四边形费马点证明图形
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std; const double eps=1e-10; double add(double a,double b)
{
if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
return a+b;
} struct point
{
double x,y;
point () {}
point (double x,double y) : x(x),y(y){ }
point operator + (point p)
{
return point (add(x,p.x),add(y,p.y));
}
point operator - (point p)
{
return point (add(x,-p.x),add(y,-p.y));
}
point operator * (double d)
{
return point (x*d,y*d);
}
double dot(point p)
{
return add(x*p.x,y*p.y);
}
double det(point p)
{
return add(x*p.y,-y*p.x);
}
}; bool on_seg(point p1,point p2,point q)
{
return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
} point intersection(point p1,point p2,point q1,point q2)
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
} bool cmp_x(const point&p,const point& q)
{
if(p.x!=q.x) return p.x<q.x;
return p.y<q.y;
} vector<point> convex_hull(point*ps,int n)
{
sort(ps,ps+n,cmp_x);
//for(int i=0;i<n;i++) printf("x=%.f %.f")
int k=0;
vector<point> qs(n*2);
for(int i=0;i<n;i++){
while(k>1&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--;
qs[k++]=ps[i];
}
for(int i=n-2,t=k;i>=0;i--){
while(k>t&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--;
qs[k++]=ps[i];
}
qs.resize(k-1);
return qs;
} double dis(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
bool equ(point p1,point p2)
{
if(fabs(p1.x-p2.x)<eps&&fabs(p1.y-p2.y)<eps)
return true;
return false;
}
int main()
{
point p[10];
for(int i=0;i<4;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
while(p[0].x!=-1&&p[0].y!=-1)
{
vector <point> m;
double minn=100000000,d;
m=convex_hull(p,4);//检查是否四边形
if(m.size()==4)//如果是四边形则加入对角线交点考虑
minn=dis(m[1],m[3])+dis(m[0],m[2]);
for(int i=0;i<4;i++)
{
d=0;
for(int j=0;j<4;j++)
d+=dis(p[i],p[j]);
minn=min(minn,d);
}
printf("%.4f\n",minn);
for(int i=0;i<4;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
}
return 0;
}
hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1的更多相关文章
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
		
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
 - hdu 3697 10 福州 现场 H - Selecting courses 贪心 难度:0
		
Description A new Semester is coming and students are troubling for selecting courses. Students ...
 - hdu 3699 10 福州 现场 J - A hard Aoshu Problem 暴力 难度:0
		
Description Math Olympiad is called “Aoshu” in China. Aoshu is very popular in elementary schools. N ...
 - hdu 3696 10 福州 现场 G - Farm Game DP+拓扑排序 or spfa+超级源 难度:0
		
Description “Farm Game” is one of the most popular games in online community. In the community each ...
 - hdu 3682 10 杭州 现场 C - To Be an Dream Architect 简单容斥 难度:1
		
C - To Be an Dream Architect Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
 - hdu 3685 10 杭州 现场 F - Rotational Painting 重心 计算几何 难度:1
		
F - Rotational Painting Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
 - hdu 3682 10 杭州 现场 C To Be an Dream Architect 容斥 难度:0
		
C - To Be an Dream Architect Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
 - hdu 3687 10 杭州 现场 H - National Day Parade 水题 难度:0
		
H - National Day Parade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
 - hdu 4770 13 杭州 现场 A - Lights Against Dudely 暴力 bfs 状态压缩DP 难度:1
		
Description Harry: "But Hagrid. How am I going to pay for all of this? I haven't any money.&quo ...
 
随机推荐
- 转!!java 堆栈内存 对象实例等查看
			
https://blog.csdn.net/fenglibing/article/details/6411999
 - JS模块化方案
 - 新安装和已安装nginx如何添加未编译安装模块/补丁
			
新安装和已安装nginx如何添加未编译安装模块/补丁 --http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10485& ...
 - eclipse怎么导出可执行jar包
			
在eclpse中找到你要导出的java程序 选中它 单击文件 -->export 在弹出的export对话框中找到 jar File 单击选中-->next 按图示顺序依次 选好你的jav ...
 - CSLA.Net学习(2)
			
采用CSLA.net 2.1.4.0版本的书写方式: using System; using System.ComponentModel; using Csla.Validation; using S ...
 - Openstack(三)Haproxy+Keepalived双机
			
3.1部署keepalived 3.1.1下载keepalived源码包,并解压 # wget http://www.keepalived.org/software/keepalived-1.4.2. ...
 - glassfish3新建domain
			
下载路径:http://download.oracle.com/glassfish/3.1.2.2/release/index.html .zip (解压缩)cd /glassfish3/glassf ...
 - linux创建新用户后shell无法自动补全命令或使用基本的shell命令
			
新建一用户lqding,切换到该用户下 root@lqding:~# su - lqding$$ echo $USERlqding$ ^[[A 提示符仅仅是一个$,很奇怪.输入命令,用TAB键也无法补 ...
 - 4.4 Routing -- Specifying A Route's Model
			
一.概述 应用程序中,templates被models支持.但是templates是如何知道它们应该显示哪个model呢? 例如,你有一个photos模板,它是如何知道它该呈现哪个model呢? 这就 ...
 - C# 使用BackgroundWorker实现WinForm异步
			
写了一个基于BackgorundWorker演示异步操作的例子.由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动.操作结束后的回调.异步操作的撤销和进度报告等等.尽管 ...