poj 1069 Intersecting Lines
一、问题描述
http://acm.pku.edu.cn/JudgeOnline/problem?id=1269
题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。
二、解题思路
先判断两条直线是不是同线,不是的话再判断是否平行,再不是的话就只能是相交的,求出交点。
如何判断是否同线?由叉积的原理知道如果p1,p2,p3共线的话那么(p2-p1)X(p3-p1)=0。因此如果p1,p2,p3共线,p1,p2,p4共线,那么两条直线共线。direction()求叉积,叉积为0说明共线。
如何判断是否平行?由向量可以判断出两直线是否平行。如果两直线平行,那么向量p1p2、p3p4也是平等的。即((p1.x-p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x-p4.x))==0说明向量平等。
如何求出交点?这里也用到叉积的原理。假设交点为p0(x0,y0)。则有:
(p1-p0)X(p2-p0)=0
(p3-p0)X(p2-p0)=0
展开后即是
(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0
(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0
将x0,y0作为变量求解二元一次方程组。
假设有二元一次方程组
a1x+b1y+c1=0;
a2x+b2y+c2=0
那么
x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
因为此处两直线不会平行,所以分母不会为0。
三、代码
#include<iostream>
using namespace std;
struct point
{
double x,y;
};
double multi(point p1,point p2,point p0)
{
return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
int judge(point a,point b,point c,point d)
{
if((multi(a,b,c))==0&&(multi(b,c,d))==0) return 0;
else if( ((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x))==0 ) return -1;
else return 1;
}
int main()
{
point a,b,c,d;
int n;
double a1,b1,c1,a2,b2,c2,k;
cin>>n;
cout<<"INTERSECTING LINES OUTPUT"<<endl;
for(int i=0;i<n;i++)
{ cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
k=judge(a,b,c,d);
if(k==0) cout<<"LINE"<<endl;
if(k==-1) cout<<"NONE"<<endl;
if(k==1)
{
a1=a.y-b.y;b1=b.x-a.x;c1=a.x*b.y-b.x*a.y;
a2=c.y-d.y;b2=d.x-c.x;c2=c.x*d.y-d.x*c.y;
point p;
p.x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
p.y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
printf("POINT %.2f %.2f\n",p.x,p.y);
}
}
cout<<"END OF OUTPUT"<<endl;
system("pause");
return 0;
}
poj 1069 Intersecting Lines相关推荐
- POJ 1269 Intersecting Lines(求直线交点)
http://poj.org/problem?id=1269 求交点见zhhx课件 #include<iostream> #include<cstdio> #include&l ...
- POJ - 1269 Intersecting Lines(计算几何 + 叉积 + 跨立实验)
链接 Intersecting Lines 题意 给出两条线段,判断是否共线,平行,或者相交,如果相交输出交点: 思路 如何判断共线: 我们知道两个向量叉积为 000,两向量共线: 所以我们只需要判断 ...
- 【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)
题干: We all know that a pair of distinct points on a plane defines a line and that a pair of lines on ...
- POJ1269:Intersecting Lines(判断两条直线的关系)
题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...
- POJ1269 Intersecting Lines 计算几何 C语言
题目:http://poj.org/problem?id=1269 题目大意:给出四个点确定两条直线.如果是一条线输出"LINE",如果平行输出"NONE", ...
- POJ1269:Intersecting Lines——题解
http://poj.org/problem?id=1269 题目大意:给四个点,求前两个点所构成的直线和后两个点所构成的直线的位置关系(平行,重合,相交),如果是相交,输出交点坐标. ------- ...
- uva 378 Intersecting Lines
题意:给你两条直线,求交点 分析:用叉积结合行列式做题,若共线重合输出LINE,若共线不重合输出NONE,若相交求出交点p0 /* 线段相交 */ #include <iostream> ...
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
- poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...
最新文章
- ORA-32004: obsolete and/or deprecated parameter(s) specified
- [Bash] Search for Text with `grep`
- 【多线程】多线程锁住的是什么、std::lock_guard<std::mutex> locker(mutex_)
- (转)Spring Boot(十二):Spring Boot 如何测试打包部署
- python pytest
- mysql 61错误解决方法
- Mysql中contact、group_concat、concat_ws、repeat
- python优秀源码2019_SUCTF2019,python源码分析,漏洞原理
- C语言 计算机考研408数据结构历年真题算法题简易暴力解
- 数字逻辑与数字电路知识点整理
- 3DMax教程: 3DMax快捷键与界面操作!
- @import ‘./common/stylus/mixins.styl‘引起的一系列错误
- 图像相似度比较之哈希算法
- 基础入门学习Python爬取微信公众号文章、标题、文章地址
- 印尼推出新的光伏发展激励措施
- Echarts参数属性学习Gird演示案例
- Go语言核心之美 3.4-Struct结构体
- android loadsvm raw,OpenCV机器学习:Android上利用SVM实现手写体数字识别
- IDEA mybatis XML文件格式化问题
- Android:音乐播放器(3)—从播放列表到播放歌曲
热门文章
- 联想笔记本摄像头被禁用
- 中国石油大学(北京)-《操作系统》第一次在线作业
- python网络爬虫技术课件_Python网络爬虫技术第7章 Scrapy爬虫.ppt
- proteus如何添加stm32_一个应用软件程序员的单片机STM32零基础入门
- 测试幼儿园指南纲要的软件,幼儿园指导纲要测试题
- 华科计算机学硕和武大,纠结武大和华科,看完这个分析表,你就会选了
- Mac系统快捷键大全(建议收藏)
- 网络安全老师的提问---第六章特洛伊木马
- 简单爬取阿里巴巴商品信息
- RGB 色彩表(tkinter使用,色彩名称,十六进制名称)