就这样莫名其妙的过了,不过可以确定之前都是被精度卡死了。真心受不了精度问题了。

题意:一条直线在一个不规则多边形内的长度,包括边重合部分。

首先计算出所有交点,然后按想x,y的大小进行二级排序。

然后判断相邻两点之间的线段是否在多边形内。

设两点为a,b,其重点为c。

若c在内部或边上,则线段ab必符合条件。

判断点在多边形内的方法可以参考下面的链接:

http://www.cnblogs.com/hhyypp/archive/2011/12/05/2276984.html

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm> #define LL long long
#define EPS (1e-8) const double Double_PI = 2.0*acos(-1.0); using namespace std; struct P
{
double x,y;
}sp[100100],p[100100]; int top; bool cmp(P p1,P p2)
{
if(fabs(p1.x - p2.x) < EPS)
{
return p1.y < p2.y;
}
return p1.x < p2.x;
} double X_Mul(P a1,P a2,P b1,P b2)
{
P v1 = {a2.x-a1.x , a2.y-a1.y},v2 = {b2.x-b1.x , b2.y-b1.y}; return (v1.x*v2.y-v1.y*v2.x);
} P Line_Cross_Position(P l1,P l2,P s1,P s2)
{
P cp = s1; double t = fabs(X_Mul(l1,l2,l1,s1)) / fabs(X_Mul(l1,l2,s2,s1)); cp.x += t*(s2.x-s1.x);
cp.y += t*(s2.y-s1.y); return cp;
} double Cal_Angle(P a1,P a2,P b1,P b2)
{
P v1 = {a2.x-a1.x,a2.y-a1.y},v2 = {b2.x-b1.x,b2.y-b1.y}; if(fabs(X_Mul(a1,a2,b1,b2)) < EPS)
return 0; if(X_Mul(a1,a2,b1,b2) >= EPS)
return acos((v1.x*v2.x+v1.y*v2.y)/(sqrt( (v1.x*v1.x + v1.y*v1.y)*(v2.x*v2.x + v2.y*v2.y) )));
return -acos((v1.x*v2.x+v1.y*v2.y)/(sqrt( (v1.x*v1.x + v1.y*v1.y)*(v2.x*v2.x + v2.y*v2.y) ) ) );
} double Cal_Point_Dis(P p1,P p2)
{
return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );
} double Point_In_Segment(P p,P p1,P p2)
{
if( fabs(Cal_Point_Dis(p1,p2) - Cal_Point_Dis(p,p1) - Cal_Point_Dis(p,p2) ) < EPS)
return true;
return false;
} bool Is_Point_In_Polygon(P tp,int n)
{
int i; double asum = 0; for(i = 0;i < n; ++i)
{
asum += Cal_Angle(tp,p[i],tp,p[i+1]);
} if(fabs(fabs(asum) - Double_PI) < EPS)
return true;
for(i = 0;i < n; ++i)
{
if(Point_In_Segment(tp,p[i],p[i+1]) )
return true;
}
return false;
} double Length_In_Polygon(P pa,P pb,int n)
{
double lsum,xm1,xm2;
int i;
P temp; for(i = 0;i < n; ++i)
{
xm1 = X_Mul(pa,pb,pa,p[i]);
xm2 = X_Mul(pa,pb,pa,p[i+1]); if(xm1*xm2 < -EPS)
{
sp[top++] = Line_Cross_Position(pa,pb,p[i],p[i+1]);
}
else
{
if(fabs(xm1) < EPS)
sp[top++] = p[i];
if(fabs(xm2) < EPS)
sp[top++] = p[i+1];
}
} sort(sp,sp+top,cmp); for(i = 1,lsum = 0;i < top; ++i)
{
temp.x = (sp[i].x + sp[i-1].x)/2;
temp.y = (sp[i].y + sp[i-1].y)/2; if(Is_Point_In_Polygon(temp,n))
{
lsum += Cal_Point_Dis(sp[i],sp[i-1]);
}
}
return lsum;
} int main()
{
int i,n,m;
P pa,pb; while( scanf("%d %d",&n,&m) && (n||m) )
{
for(i = 0;i < n; ++i)
{
scanf("%lf %lf",&p[i].x,&p[i].y);
} p[n] = p[0]; while(m--)
{
scanf("%lf %lf %lf %lf",&pa.x,&pa.y,&pb.x,&pb.y); top = 0; printf("%.3lf\n",Length_In_Polygon(pa,pb,n));
}
}
return 0;
}

POJ 2462 / HDU 1154 Cutting a Polygon的更多相关文章

  1. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  2. poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题

    poj 1251  && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...

  3. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  4. POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

    求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...

  5. POJ 1308&&HDU 1272 并查集判断图

      HDU 1272 I - 小希的迷宫 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  6. POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3

    http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...

  7. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  8. POJ 1904 HDU 4685

    这两道题差不多,POJ这道我很久以前就做过,但是比赛的时候居然没想起来.. POJ 这道题的题意是,N个王子每个人都有喜欢的公主,当他们选定一个公主结婚时,必须是的剩下的人也能找到他喜欢的公主结婚. ...

  9. 【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms

    题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...

随机推荐

  1. ArcGIS案例学习笔记3_2

    ArcGIS案例学习笔记3_2 联系方式:谢老师,135-4855-4328, xiexiaokui#qq.com 时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性, ...

  2. java列表转成 int[] 的格式

    java 稀疏矩阵中输入的索引系列和对应的值系列需要用 int[] r_indices = new int[featureIdxList.size()]; 的数据格式. 但是实际中可能实现没法确定 f ...

  3. 岭回归和lasso回归(转)

    回归和分类是机器学习算法所要解决的两个主要问题.分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题.但是回归就稍微复杂一些,回归模型的输出值 ...

  4. oracle 文件系统

    oracle数据文件信息 select * from v$datafile;--查看数据文件信息select * from v$controlfile;--查看控制文件信息 一.控制文件(Contro ...

  5. kubeadmin 部署(centos 7)

    安装指定版本docker:# yum list docker-ce --showduplicates | sort -ryum install docker-ce-18.06.1.ce-3.el7vi ...

  6. node连续查询两次数据库返回方式(文档未定)

    function db(callback){ var mysql = require('mysql'); var connection = mysql.createConnection({ host ...

  7. CentOS7.0重置Root的密码 (忘记密码)

    首先进入开启菜单,按下e键进入编辑现有的内核,如下图所示 然后滚动列表,找到ro,将它替换成rw,并加上init=/sysroot/bin/sh,最终变为如下图 然后按CTRL+X进入到单用户模式,在 ...

  8. java并发:volatile关键字

    java并发需要保证原子性,可见性,有序性. http://www.cnblogs.com/expiator/p/9226775.html 一.volatile关键字作用如下: 1.volatile关 ...

  9. 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)

    昨天做了一个题,简化题意后就是求2的n次方对1e9+7的模,其中1<=n<=10100000.这个就算用快速幂加大数也会超时,查了之后才知道这类题是对费马小定理的考察. 费马小定理:假如p ...

  10. Web服务技术协议:REST与SOAP

    Web服务技术就有SOAP(Simple Object Access Protocol,简单对象访问协议)和REST(Representational State Transfer,表示性状态转移) ...