POJ 3304 Segments(计算几何:直线与线段相交)
2024-09-02 21:35:02
大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点。
思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes。可是注意去重。
struct Point
{
double x, y;
} P[210];
struct Line
{
Point a, b;
} L[110]; double xmult(Point p1, Point p2, Point p)
{
return (p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x);
} bool segLineInter(Line seg, Line line)
{
double d1, d2;
d1 = xmult(seg.a, line.a, line.b);
d2 = xmult(seg.b, line.a, line.b);
if((d1>eps && d2 < -eps) || (d1 < -eps && d2 > eps))
return true;
if(fabs(d1) < eps || fabs(d2) < eps)
return true;
return false;
} int T;
int n; void Solve()
{
Line l1, l2;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int t = 0;
for(int i = 0; i < n; ++i)
{
scanf("%lf%lf%lf%lf", &L[i].a.x, &L[i].a.y, &L[i].b.x, &L[i].b.y);
P[t++] = L[i].a;
P[t++] = L[i].b;
}
bool ans = false;
for(int i = 0; !ans && i < t; ++i)
{
for(int j = i+1; j < t; ++j)
{
bool flag = true;
if(fabs(P[i].x-P[j].x) < eps && fabs(P[i].y-P[j].y) < eps) continue;
for(int k = 0; k < n; ++k)
{
if(segLineInter(L[k], (Line){P[i], P[j]}) == false)
{
flag = false;
break;
}
}
if(flag == true)
{
ans = true;
break;
}
}
}
printf("%s!\n", ans?"Yes":"No");
}
}
最新文章
- Mac OS apache php配置
- wdcp 下apache模式开启https访问,支持多站点
- Spring Collections XML 配置
- perl常用代码
- Node.js 入门(2)
- jQuery.innerWidth() 函数详解
- Socket 基础解析使用ServerSocket建立聊天服务器
- PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
- 使用jmeter进行批量数据创建
- CMD远程连接服务器上的MySQL
- 《java入门第一季》模拟用户登陆注册案例集合版
- 通过<;meta>;标签指定IE的文档模式实现CSS3兼容
- apache Storm 学习笔记
- Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)
- sass个人学习笔记
- CSS3-flex弹性布局之flex属性
- Luogu P2048 [NOI2010]超级钢琴
- 分享我对JS插件开发的一些感想和心得
- js获取n分钟(或n小时或n个月)后(或前)的时间(日期)
- 20155215 《Java程序设计》实验二( Java面向对象程序设计)实验报告