FZU 1576【计算几何/费马点】
Oaiei居住在A城市,并且是这个城市建设的总设计师。最近有个问题一直困恼着他。A城市里有三个大型工厂,每个大型工厂每天都需要消耗大量的石油,现在城市里要建设一个石油中转站,从石油中转站到三个大型工厂都需要铺设石油管道。现在你的问题来了,应该如何建设这个石油中转站,使得石油中转站到三个大型工厂所需要铺设的石油管道线路最短,你能够帮助他吗?
设石油中转站B的坐标为(X,Y),三个大型工厂的坐标分别为C(X1,Y1),D(X2,Y2),E(X3,Y3),所输要铺设的石油管道线路总长为distance(B,C)+distance(B,D)+distance(B,E),其中distance(A,B)表示A,B两点之间的欧几里德距离。
Input
第一行为一个整数C(1<=C<=200),表示测试数据的组数。
以下C行,每行6个整数,分别表示C、D、E点 (X,Y)的坐标。注意:B点的选址可以与C、D、E点相重合。
Output
对于每个输入数据,输出一行两个数M1,M2,中间用一个空格分隔开。M1,M2分别四舍五入到小数点后两位,表示石油中转站的坐标。
Sample Input
1
0.00 0.00 1.00 0.00 0.00 1.00
Sample Output
0.21 0.21 【模板】:http://blog.csdn.net/dingyaguang117/article/details/7216479
1.在一个三角形中,到3个顶点距离之和最小的点叫做这个三角形的费马点。
2.费马点计算方法:
(1)若三角形ABC的3个内角均小于120°,那么3条距离连线正好平分费马点所在的周角。所以三角形的费马点也称为三角形的等角中心。
3.如何计算等角中心呢?
做任意一条边的外接等边三角形,得到另一点,将此点与此边在三角形中对应的点相连
如此再取另一边作同样的连线,相交点即费马点

证明画几条辅助线就出来了~这里就不证明了
【代码】:
#include <iostream>
#include <math.h>
#include <windows.h>
#include <iomanip>
using namespace std; struct Vec
{
double x,y;
Vec(double xx=0,double yy=0)
{
x=xx;
y=yy;
}
}; struct Point
{
double x,y;
Point(double xx=0,double yy=0)
{
x=xx;
y=yy;
}
}; double ddot(Vec A,Vec B)
{
return A.x*B.x+A.y*B.y;
}
double getlen(Vec A)
{
return sqrt(A.x*A.x+A.y*A.y);
} double getlen(Point A,Point B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
} bool moreThan120(double xa,double ya,double xb,double yb,double xc,double yc)
{
Vec ab(xb-xa,yb-ya),ac(xc-xa,yc-ya);
if (ddot(ab,ac)/getlen(ab)/getlen(ac) < -0.5)
{
return true;
}
return false;
} inline void swap(double &a,double &b)
{
double t;
t=a;
a=b;
b=t;
} Point getAnotherPoint(Point A,Point B,Point C)
{
Point r,C1,C2;
Vec AB(B.x-A.x,B.y-A.y);
double len,len2;
double sqrt3=sqrt(3.0);
Vec AB2,crossAB,crossAB2; AB2.x=AB.x/2; AB2.y=AB.y/2;
crossAB.x=AB2.y; crossAB.y=-AB2.x;
crossAB2.x=-AB2.y; crossAB2.y=AB2.x; len=getlen(AB2); crossAB.x*=sqrt3; crossAB.y*=sqrt3;
crossAB2.x*=sqrt3; crossAB2.y*=sqrt3; C1.x=A.x+AB2.x+crossAB.x;C1.y=A.y+AB2.y+crossAB.y;
C2.x=A.x+AB2.x+crossAB2.x;C2.y=A.y+AB2.y+crossAB2.y; if (getlen(C,C1)<getlen(C,C2))
{
return C2;
}else
return C1; } /*
在平面内的两条直线AB,CD,求交点最直接的方法就是解下列的二元二次方程组:
Ax + (Bx - Ax)i = Cx + (Dx - Cx) j
Ay + (By - Ay)i = Cy + (Dy - Cy) j
交点是:
(Ax + (Bx - Ax) i, Ay + (By - Ay) i)
即:
Ax + (AAx)i = Bx + (BBx) j
Ay + (AAy)i = By + (BBy) j
交点是:
(Ax + (AAx)i, Ay + (AAy)i)
*/
Point getCrossPoint(Point A,Point A1,Point B,Point B1)
{
Point r;
Vec AA(A1.x-A.x,A1.y-A.y),BB(B1.x-B.x,B1.y-B.y);
double i,j,tmp,tmp2;
double Ax=A.x,Ay=A.y,AAx=AA.x,AAy=AA.y,Bx=B.x,By=B.y,BBx=BB.x,BBy=BB.y; if (AAx==0)
{
j=(Ax-Bx)/BBx;
i=(By+BBy*j-Ay)/AAx;
}else if (BBx==0)
{
i=(Bx-Ax)/AAx;
}else if (AAy==0)
{
j=(Ay-By)/BBy;
i=(Bx-Ax-BBx*j)/AAx;
}else if (BBy==0)
{
i=(By-Ay)/AAy;
}
else
{
tmp=AAx;
tmp2=AAy;
Ax*=AAy;AAx*=AAy;Bx*=AAy;BBx*=AAy;
Ay*=tmp;AAy*=tmp;By*=tmp;BBy*=tmp;
j=((Ax-Ay)-(Bx-By))/(BBx-BBy);
i=(Bx+BBx*j-Ax)/AAx;
} r.x=(Ax+AAx*i)/tmp2;
r.y=(Ay+AAy*i)/tmp;
return r;
} int main()
{
//freopen("cul.in9","r",stdin);
int t;
cin>>t;
while(t--)
{
double xa,ya,xb,yb,xc,yc;
Point C1,A1,R; cin>>xa>>ya>>xb>>yb>>xc>>yc;
cout.setf(ios::fixed); if (moreThan120(xa,ya,xb,yb,xc,yc))
{
cout<<setprecision(2)<<xa<<" "<<ya<<endl;
}else if (moreThan120(xb,yb,xa,ya,xc,yc))
{
cout<<setprecision(2)<<xb<<" "<<yb<<endl;
}else if (moreThan120(xc,yc,xa,ya,xb,yb))
{
cout<<setprecision(2)<<xc<<" "<<yc<<endl;
}else
{
C1=getAnotherPoint(Point(xa,ya),Point(xb,yb),Point(xc,yc));
A1=getAnotherPoint(Point(xc,yc),Point(xb,yb),Point(xa,ya)); R=getCrossPoint(Point(xa,ya),A1,Point(xc,yc),C1);
cout<<setprecision(2)<<R.x<<" "<<R.y<<endl;
}
}
//Sleep(1000000);
}
FZU 1576【计算几何/费马点】的更多相关文章
- POJ 2420 A Star not a Tree? (计算几何-费马点)
A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3435 Accepted: 172 ...
- hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1
In geometry the Fermat point of a triangle, also called Torricelli point, is a point such that the t ...
- hdu_4869(费马小定理+快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869 Turn the pokers Time Limit: 2000/1000 MS (Java/O ...
- hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)
题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3. ...
- nyoj1000_快速幂_费马小定理
又见斐波那契数列 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 斐波那契数列大家应该很熟悉了吧.下面给大家引入一种新的斐波那契数列:M斐波那契数列. M斐波那契数列 ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- 数论初步(费马小定理) - Happy 2004
Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...
- 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
随机推荐
- Hibernate调用Oracle的存储过程
众所周知,当过多的使用存储过程,触发器等 数据库方言相关的应用时,应用程序的移植性会变差,特别是在Hibernate中使用这些,简直是讽刺,但是当今中国又有哪家公司做项目会关心应用程序的移植性呢? 现 ...
- PostgreSQL DISTINCT ON
https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group select DISTINCT ...
- Leetcode279. Perfect Squares完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: 12 ...
- jiba中文分词原理
中文分词就是将一个汉字序列分成一个一个单独的词. 现有的分词算法有三大类: 基于字符串匹配的分词:机械分词方法,它是按照一定的策略将待分析的字符串与一个充分大的机器词典中的词条进行匹配,若在词典中找到 ...
- 基于httpd2.2配置https
本次演示使用一台主机实现,即自签自演 主机IP:192.168.1.105 开始配置: 1.创建私有CA # cd /etc/pki/CA # touch serial # touch index.t ...
- 前端在本地启动服务预览html页面
在开发移动端项目时浏览器里出来的效果往往到真机上和预想的有出入,在开发过程中知道了一个可以在本地自己启动一个服务器在手机预览的办法. 1.首先在终端安装http. npm i http-server ...
- git 命令行(一)-版本回退
1. 版本回退 在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么.版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用 git log 命 ...
- Linux下IP修改后重启服务器 oralce 出错(监听无法启动)
针对linux下修改IP导致的Oracle不能启动问题的解决 主要修改/etc/hosts配置文件.修改前配置: # Do not remove the following line, or vari ...
- node.js 安装步骤
1.打开链接(http://nodejs.cn/download/) 2.下载自己所需的安装包(32位 or 64位.哪个系统) 3.双击直接安装(成功如下图) 4.点击 Node.js comman ...
- 一维、二维数组 与 常用的返回数组 以及 fetch_all与fetch_row的区别
一维数组:单行单列的数组. 二维数组:多行多列的数组. (至少两行两列) 索引数组: fetch_all() 返回所有数组 fetch_row() 返回一行或一列数组 (第二行需要输入两 ...