poj3304(叉积判断直线和线段相交)
时间:2019-09-06
本文章向大家介绍poj3304(叉积判断直线和线段相交),主要包括poj3304(叉积判断直线和线段相交)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://vjudge.net/problem/POJ-3304
题意:求是否能找到一条直线,使得n条线段在该直线的投影有公共点。
思路:
如果存在这样的直线,那么在公共投影点作直线的垂线,显然该垂线会经过所有直线,那么原题转换为求是否有经过所有线段的直线。
如果存在这样的直线,那么该直线一定能通过平移和旋转之后经过所有线段中的两个端点,那么我们枚举所有两两线段的端点作为直线的两点,然后是判断直线是否经过所有线段。如果线段为p0p1,直线为p2p3,那么相交时满足:(p0p2^p0p3)*(p1p2^p1p3)<=0。总复杂度为O(n^3)。
AC code:
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; const int maxn=105; const double eps=1e-8; int T,n,flag; struct Point{ double x,y; Point(){} Point(double xx,double yy):x(xx),y(yy){} Point operator + (const Point& b)const{ return Point(x+b.x,y+b.y); } Point operator - (const Point& b)const{ return Point(x-b.x,y-b.y); } double operator * (const Point& b)const{ return x*b.x+y*b.y; } double operator ^ (const Point& b)const{ return x*b.y-b.x*y; } }; struct Line{ Point s,e; Line(){}; Line(Point ss,Point ee){ s=ss,e=ee; } }line[maxn]; int sgn(double x){ if(abs(x)<eps) return 0; if(x<0) return -1; return 1; } double dist(Point a,Point b){ return sqrt((b-a)*(b-a)); } double xmult(Point p0,Point p1,Point p2){ //p0p1 ^ p0p2 return (p1-p0)^(p2-p0); } bool seg_inter_line(Line l1,Line l2){ //判断直线l1和线段l2是否相交 return sgn(xmult(l2.s,l1.s,l1.e))*sgn(xmult(l2.e,l1.s,l1.e))<=0; } bool check(Point p1,Point p2){ if(sgn(dist(p1,p2))==0) return 0; Line l1=Line(p1,p2); for(int i=1;i<=n;++i) if(!seg_inter_line(l1,line[i])) return 0; return 1; } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); flag=0; for(int i=1;i<=n;++i){ double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); line[i]=Line(Point(x1,y1),Point(x2,y2)); } for(int i=1;i<=n;++i){ for(int j=i;j<=n;++j) if(check(line[i].s,line[j].s)||check(line[i].s,line[j].e)|| check(line[i].e,line[j].s)||check(line[i].e,line[j].e)){ flag=1; break; } if(flag) break; } if(flag) printf("Yes!\n"); else printf("No!\n"); } return 0; }
原文地址:https://www.cnblogs.com/FrankChen831X/p/11478029.html
- MySQL事务autocommit自动提交
- wcf webHttpBinding Post 大数据量提交 ios c#客户端
- 你现在还在手动生成set,get方法吗?
- ios 接收 c# socket udp 组播
- 大数据基础系列之JAVA引用详解
- Java集合深度解析之ArrayList
- wpf listBox 多列大图片效果
- ASP.NET 主题(Themes)FAQ
- wpf 解决 编码解码器无法使用提供的流类型 The codec cannot use the type of stream provided
- Java 9 逆天的十大新特性
- 设计模式:命令模式
- mysql的外键
- 设计模式:工厂方法模式
- 设计模式:抽象工厂方法模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel ORM关联关系中的 with和whereHas用法
- thinkPHP事务操作简单案例分析
- php 多个变量指向同一个引用($b = &$a)用法分析
- 浅谈laravel5.5 belongsToMany自身的正确用法
- 在 PHP 和 Laravel 中使用 Traits的方法
- Laravel 修改默认日志文件名称和位置的例子
- php 命名空间(namespace)原理与用法实例小结
- Laravel Eloquent ORM 实现查询表中指定的字段
- Yii框架 session 数据库存储操作方法示例
- 使用laravel指定日志文件记录任意日志
- php实现微信小程序授权登录功能(实现流程)
- PHP封装请求类实例分析【基于Yii框架】
- php 多继承的几种常见实现方法示例
- PHP中通过getopt解析GNU C风格命令行选项
- laravel高级的Join语法详解以及使用Join多个条件