计算几何——直线交点poj1269
求直线交点还是要推一个公式的。。
见博客https://blog.csdn.net/u013050857/article/details/40923789
还要学一下向量的定点比分法
另外poj精度好像卡的厉害,zoj1280就没啥问题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std; const double esp = 1e-;
const double inf = 1e20;
const double pi = acos(-1.0);
const int maxp = ; int sgn(double x){
if(fabs(x) < esp)return ;
if(x < )return -;
else return ;
}
inline double sqr(double x){return x*x;} struct Point{
double x,y;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
void input(){scanf("%lf%lf",&x,&y);}
void output(){printf("%.2lf %.2lf\n",x,y);}
bool operator==(Point b)const {
return sgn(x-b.x)== && sgn(y-b.y)==;
}
bool operator < (Point b)const {//判左下
if( sgn(x-b.x)== ) //横坐标相等
return sgn(y-b.y)<;
return x<b.x;
}
Point operator - (const Point &b)const {
return Point(x-b.x,y-b.y);
}
double operator ^(const Point &b)const {
return x*b.y-y*b.x;
}
double operator *(const Point &b)const {
return x*b.x+y*b.y;
}
double len(){
return hypot(x,y);
}
double len2(){
return x*x+y*y;
}
double distance(Point p){
return hypot(x-p.x,y-p.y);
}
Point operator +(const Point &b)const {
return Point(x+b.x,y+b.y);
}
Point operator *(const double &k)const {
return Point(x*k,y*k);
}
Point operator /(const double &k)const {
return Point(x/k,y/k);
}
double rad(Point a,Point b){
Point p=*this;
return fabs(atan2( fabs((a-p)^(b-p)),(a-p)*(b-p) ));
}
Point trunc(double r){
double l=len();
if(!sgn(l))return *this;
r/=l;
return Point(x*r,y*r);
}
Point rotleft(){
return Point(-y,x);
}
Point rotright(){
return Point(y,-x);
}
Point rotate(Point p,double angle){
Point v=(*this)-p;
double c=cos(angle),s=sin(angle);
return Point(p.x+v.x*c-v.y*s, p.y+v.x*s+v.y*c);
}
};
struct Line{
Point s,e;
Line(){}
Line(Point s,Point e):s(s),e(e){}
bool operator ==(Line v){
return (s==v.s) && (e==v.e);
}
Line(Point p,double angle){
s=p;
if(sgn(angle-pi/)==)
e=s+Point(,);
else e=s+Point(,tan(angle));
}
Line(double a,double b,double c){
if(sgn(a)==){
s=Point(,-c/b);
e=Point(,-c/b);
}
else if(sgn(b)==){
s=Point(-c/a,);
e=Point(-c/a,);
}
else {
s=Point(,-c/b);
e=Point(,(-c-a)/b);
}
}
void input(){
s.input();
e.input();
}
void adjust(){
if(e<s)swap(e,s);
}
double length(){
return s.distance(e);
}
double angle(){
double k=atan2(e.y-s.y,e.x-s.x);
if(sgn(k)<)k+=pi;
if(sgn(k-pi)==) k-=pi;
return k;
}
int relation(Point p){
int c=sgn((p-s)^(e-s));
if(c<)return ;
else if(c>)return ;
else return ;
}
bool pointonseg(Point p){
return sgn((p-s)^(e-s))== && sgn((p-s)*(p-e))<=;
}
bool parallel(Line v){
return sgn((e-s)^(v.e-v.s))==;
}
int segcrossseg(Line v){
int d1=sgn((e-s)^(v.s-s));
int d2=sgn((e-s)^(v.e-s));
int d3=sgn((v.e-v.s)^(s-v.s));
int d4=sgn((v.e-v.s)^(e-v.s));
if( (d1^d2)==- && (d3^d4)==-) return ;
return (d1== && sgn((v.s-s)*(v.s-e))<=) ||
(d2== && sgn((v.e-s)*(v.e-e))<=) ||
(d3== && sgn((s-v.s)^(s-v.e))<=) ||
(d4== && sgn((e-v.s)^(e-v.e))<=);
}
int linecrossseg(Line v){
int d1=sgn((e-s)^(v.s-s));
int d2=sgn((e-s)^(v.e-s));
//cout<<(d1^d2)<<'\n';
if((d1^d2)==-)return ;
return d1== || d2==;
}
int linecrossline(Line v){
if((*this).parallel(v))
return v.relation(s)==;
return ;
}
Point crosspoint(Line v){
double a1=(v.e-v.s)^(s-v.s);//面积
double a2=(v.e-v.s)^(e-v.s);
return Point((s.x*a2-e.x*a1)/(a2-a1),
(s.y*a2-e.y*a1)/(a2-a1));
}
double dispointtoline(Point p){
return fabs((p-s)^(e-s))/length();
}
double dispointtoseg(Point p){
if(sgn((p-s)*(e-s))< || sgn((p-e)*(s-e))<)
return min(p.distance(s),p.distance(e));
return dispointtoline(p);
}
double dissegtoseg(Line v){
return min(min(dispointtoseg(v.s),dispointtoseg(v.e)),
min(v.dispointtoline(s),v.dispointtoline(e)));
}
Point lineprog(Point p){//s+vt
return s+( ((e-s)*((e-s)*(p-s)))/(e-s).len2() );
}
Point symmetrypoint(Point p){
Point q=lineprog(p);
return Point(*q.x-p.x,*q.y-p.y);
}
}; //判两直线是否相交
int main(){
int t;cin>>t;
puts("INTERSECTING LINES OUTPUT");
for(int tt=;tt<=t;tt++){
double x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
Line line1=Line(Point(x1,y1),Point(x2,y2));
cin>>x1>>y1>>x2>>y2;
Line line2=Line(Point(x1,y1),Point(x2,y2));
if(line1.linecrossline(line2)==)
puts("NONE");
else if(line1.linecrossline(line2)==)
puts("LINE");
else if(line1.linecrossline(line2)==){
Point p=line1.crosspoint(line2);
printf("POINT %.2lf %.2lf\n",p.x,p.y);
}
}
puts("END OF OUTPUT");
}
计算几何——直线交点poj1269的更多相关文章
- UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)
Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...
- hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
Area Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- UVA 11178 Morley's Theorem(旋转+直线交点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18543 [思路] 旋转+直线交点 第一个计算几何题,照着书上代码打 ...
- POJ_1269_Intersecting Lines_求直线交点
POJ_1269_Intersecting Lines_求直线交点 Description We all know that a pair of distinct points on a plane ...
- ZOJ 1280 Interesting Lines | 求两直线交点
原题: 求两直线交点 思路借鉴于:http://blog.csdn.net/zxy_snow/article/details/6341282 感谢大佬 #include<cstdio> # ...
- 2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars(计算几何 直线相交)
题目描述 Two out-of-control cars crashed within about a half-hour Wednesday afternoon on Deer Park Avenu ...
- hdu 1086 You can Solve a Geometry Problem too 求n条直线交点的个数
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- poj1269(直线交点)
传送门:Intersecting Lines 题意:给出N组直线,每组2条直线,求出直线是否相交.如果共线则输出LINE,相交则输入点坐标,否则输出NONE. 分析:模板裸题,直接上模板... #in ...
- poj1269计算几何直线和直线的关系
We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a p ...
随机推荐
- Java利用MD5WithRSA签名及DESede加密
前言:近期公司做数据加密及签名,整理如下: 一.数字签名. 是只有信息的发送者才能产生的别人无法伪造的一段数字串,具有不可抵赖性,可验证信息完整性的一种手段. 签名不可伪造:其他人因为没有对应的私钥, ...
- day05 mysql pymysql的使用 (前端+flask+pymysql的使用) 索引 解释执行 慢日志 分页性能方案
day05 mysql pymysql 一.pymysql的操作 commit(): 在数据库里增删改的时候,必须要进行提交,否则插入的数据不生效 1.增, 删, 改 #co ...
- centos WPS 字体安装
首先下载字体,解压后将整个wps_symbol_fonts目录拷贝到/usr/share/fonts目录下,然后赋予可读可执行权限. 权限设置操作如下: cd /usr/share/fonts/ ch ...
- $.extend() $.fn.extend()
(非原创)jQuery为开发插件提拱了两个方法,分别是:jQuery.fn.extend();jQuery.extend();虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便 ...
- mysql服务命令行操作
启动 net start mysql 关闭 net stop mysql 登陆 mysql -hlocalhost -uusername -ppassword 退出 exit 显示数据库 show d ...
- Zookeeper_CAP原则
CAP原则 简单介绍CAP 想要进行分布式事务控制,CAP理论是我们必须要知道的: CAP原则:也叫CAP定理,指的是在一个分布式系统中,一致性.可用性.分区容错性三者不可兼得 一致性(Consist ...
- 最佳实践:阿里云VPC、ECS支持IPv6啦!
12月6日,阿里云宣布为企业提供全栈IPv6解决方案. 阿里云专有网络VPC.云服务器ECS,作为阿里云的核心产品,也于2018年11月底上线双栈VPC.双栈ECS,目前正在对外公测中. 那么如何在阿 ...
- bzoj3505: [Cqoi2014]数三角形 [数论][gcd]
Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...
- RDBMS关系型数据库与HBase的对比
关系型数据库 结构: * 数据库以表的形式存在 * 支持FAT.NTFS.EXT.文件系统 * 使用Commit log存储日志 * 参考系统是坐标系统 * 使用主键(PK) * 支持分区 * 使用行 ...
- js的线程和同步异步以及console.log机制
项目上线了,闲下来就写写东西吧.积累了好多东西都没有做笔记~挑几个印象深刻的记录一下吧. js的同步异步以及单线程问题: 都知道单线程是js的一大特性.但是通常io(ajax获取服务器数据).用户/浏 ...