bnuoj 27874 "Center" of [p]erimeter midpoints(计算几何)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=27874
【题意】:
给你一个三角形三个顶点的坐标ABC,三角形各边取一点DEF,将三角形周长平均分割成两部分,求AE,DC,FB是否相交于一点,是,输出交点坐标,否,输出ERROR
【题解】:
几何体,一看就有点慌,就怕它卡精度,以前坑怕了,这里给出思路以及解题过程:
先求出DEF的坐标再说,拿D举例:
D在AB线段上,并满足AC+AD==DB+BC,这里我们可以用二分枚举来枚举出D的坐标
EF点同上
然后,CD与AE的交点O,判断O是不是也同时在BF上,在输出O的坐标,不在输出ERROR
【ACcode】:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm> using namespace std;
#define eps 1e-12 struct Nod
{
double x,y;
Nod(double dx,double dy)
{
x=dx;
y=dy;
}
Nod(){}
}node[],tp; double dis[];
double x[],y[];
double xx[],yy[]; double distance(int i)
{
return sqrt((x[i]-x[i+])*(x[i]-x[i+])+(y[i]-y[i+])*(y[i]-y[i+]));
} double distance(double x1,double y1,double x2,double y2)
{
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
} Nod bs(int i) //二分
{
double l=,r=,mid;
double tx,ty;
double len1 = dis[i+];
double len2 = dis[i+];
while(l<=r)
{
mid=(l+r)/;
tx=x[i]+mid*(x[i+]-x[i]);
ty=y[i]+mid*(y[i+]-y[i]);
double temp1 = distance(tx,ty,x[i],y[i]);
double temp2 = distance(tx,ty,x[i+],y[i+]);
if(len1+temp1<len2+temp2)
{
l=mid+eps;
}
else
{
r=mid-eps;
}
}
return Nod(tx,ty);
} Nod getPoint(Nod u1,Nod u2,Nod v1,Nod v2) //已知线段已经有交点,求交点坐标
{
Nod ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
} int main()
{
int t,cas=;
scanf("%d",&t);
while(t--)
{
int i;
for(i=;i<;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
x[i+]=x[i]; //做成循环,后面可以统一处理
y[i+]=y[i];
}
for(i=;i<;i++)
{
dis[i+]=dis[i]=distance(i);
}
for(i=;i<;i++)
{
node[i+]=node[i] = bs(i); //这里用二分来获取,周长分割中点
}
tp=getPoint(node[],Nod(x[],y[]),node[],Nod(x[],y[])); //得到两条线段的交点
double dis1 = distance(node[].x,node[].y,x[],y[]); //第三条线段的长度
double dis2 = distance(node[].x,node[].y,tp.x,tp.y)+distance(tp.x,tp.y,x[],y[]); //交点到第三条线段端点之和
printf("Case %d: ",cas++);
if(fabs(dis1-dis2)>=1e-) //判断距离是否相等
{
printf("ERROR\n");
}
else
{
if(fabs(tp.x)<1e-) tp.x=; //是否为-0
if(fabs(tp.y)<1e-) tp.y=;
printf("%.6lf %.6lf\n",tp.x,tp.y);
}
}
return ;
}
bnuoj 27874 "Center" of [p]erimeter midpoints(计算几何)的更多相关文章
- hdu 2105:The Center of Gravity(计算几何,求三角形重心)
The Center of Gravity Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- fzu 1330:Center of Gravity(计算几何,求扇形重心)
Problem 1330 Center of Gravity Accept: 443 Submit: 830Time Limit: 1000 mSec Memory Limit : 327 ...
- bnuoj 4209 Triangle(计算几何)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4209 题意:如题 题解:公式直接计算,或者角平分线求交点 [code1]: #include < ...
- bnuoj 1053 EASY Problem (计算几何)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=1053 [题意]:基本上就是求直线与圆的交点坐标 [题解]:这种题我都比较喜欢用二分,三分做,果然可以 ...
- UVALIVE 5893 计算几何+搜索
题意:很复杂的题意,我描述不清楚. 题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=3033#problem/33526 大致是,给定一个起 ...
- UVA12304 2D Geometry 110 in 1! 计算几何
计算几何: 堆几何模版就能够了. . .. Description Problem E 2D Geometry 110 in 1! This is a collection of 110 (in bi ...
- HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...
- POJ 2031 Building a Space Station (计算几何+最小生成树)
题目: Description You are a member of the space station engineering team, and are assigned a task in t ...
- 【kuangbin】计算几何部分最新模板
二维几何部分 // `计算几何模板` ; const double inf = 1e20; const double pi = acos(-1.0); ; //`Compares a double t ...
随机推荐
- discuze回放提示“抱歉,您的请求来路不正确或表单验证串不符,无法提交”
不知从哪里看到文章,但是实用: 背景:discuze就单纯的录制一个注册脚本,日志中没有报错,在报告中就提示"抱歉,您的请求来路不正确或表单验证串不符,无法提交"",以下 ...
- AutoCAD 2014 win 32bit破解版
AutoCAD 2014 win 32bit破解版 百度云盘:http://pan.baidu.com/s/1nu2u6Hr
- 纯CSS手风琴效果
CSS手风琴效果 主体代码如下: ...
- 使用iTextSharp来填充PDF模板文件
需求简介: 遇到了这样一个需求:某公司需要为所有用户的培训生成一个培训记录,过程如下: (1)用户在培训完之后会进入到一个填写信息的界面. (2)用户填写信息. (3) ...
- dispatch_async & dispatch_sync
Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行. dispatch_sync 也是将block发送到指定的线程去执行,但是当 ...
- 操作Excel导入的问题(转)
当Excel导入成为需要时,之前的导出Excel为html方式的方法就受阻了,于是,需要开始新的百度与google来解决问题. 前提为OLEDB+Excel. 根据需求,多数是对于表的数据的导入.于是 ...
- [译]使用Babel和Browserify创建你的ES6项目
原文地址:Setting up an ES6 Project Using Babel and Browserify JavaScript的发展日新月异,ES6很快就要接管JS了.很多著名的框架像Ang ...
- dom0级事件和dom2级事件
dom0级事件 <a href="#" id="hash" onclick="fn();fn1();"> <button ...
- CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)
c). 同步发送, 等待响应, 超时后收到1个系统消息. 贴上代码 #include <iostream> #include "caf/all.hpp" #includ ...
- linux同步
1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...