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 ...
随机推荐
- CSS—换行
关于文本溢出换行问题,先看下涉及到换行的相关属性,查看:http://www.w3school.com.cn 一.word-break 定义:word-break 属性规定自动换行的处理方法. 值 描 ...
- css3 盒模型记
css3 盒模型 css假定每个元素都会生成一个或多个矩形框,这称为元素框.各元素框中心有一个内容区.这个内容区周围有可选的内边距,边框和外边距.这些项之所以被认为是可选的,原因是它们的宽度可以设置为 ...
- Java之绘制五环图案
前面已经介绍过绘制方法.这里不再赘述. package com.caiduping; import java.awt.BasicStroke; import java.awt.Color; impor ...
- SQL Server的三种物理连接之Loop Join(一)
Sql Server有三种物理连接Loop Join,Merge Join,Hash Join, 当表之间连接的时候会选择其中之一,不同的连接产生的性能不同,理解这三种物理连接对性能调优有很大帮助. ...
- TabbarItem超炫小动画
本文转载自 不灭的小灯灯 的博客 Tabbar点击时候超炫小动画 感谢这位大神的分享! 对UITabBarController上TabBar按钮动画详细介绍-->>保证你有意外收获,如有 ...
- Cocos开发中Visual Studio下libcurl库开发环境设置
我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...
- 基数排序(RadixSort)
1 基数排序的特点是研究多个关键字key,且多个key之间有权重之分, 或者可把单个key建模为含有多个key的排序 而计数排序.桶排序始终只有个一个key,或者说围绕着一个比较规则 Ex:比较 ...
- struts2.3.15.1 中jsp:include与jsp:forward的用法
首先配置好struts2的过滤器:web.xml中的配置 <filter> <filter-name>struts-prepare</filter-name> &l ...
- 代码分享:php判断数组是否有序
发布:脚本学堂/PHP编程 编辑:JB02 2013-12-17 14:59:02 [大 中 小] 转自:http://www.jbxue.com/article/14723.html如何判断 ...
- php 随机显示图片的函数(实例)
转自:http://www.jbxue.com/article/12695.html 发布:thatboy 来源:Net [大 中 小] 本文分享一个php实现的随机显示图片的函数,可 ...