poj1269计算几何直线和直线的关系
We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection because they are parallel, 2) intersect in a line because they are on top of one another (i.e. they are the same line), 3) intersect in a point. In this problem you will use your algebraic knowledge to create a program that determines how and where two lines intersect.
Your program will repeatedly read in four points that define two lines in the x-y plane and determine how and where the lines intersect. All numbers required by this problem will be reasonable, say between -1000 and 1000.
Input
Output
Sample Input
- 5
- 0 0 4 4 0 4 4 0
- 5 0 7 6 1 0 2 3
- 5 0 7 6 3 -6 4 -3
- 2 0 2 27 1 5 18 5
- 0 3 4 0 1 2 2 5
Sample Output
- INTERSECTING LINES OUTPUT
- POINT 2.00 2.00
- NONE
- LINE
- POINT 2.00 5.00
- POINT 1.07 2.20
- END OF OUTPUT
很简单直接暴力分类,类别也不是很多,有一个坑点就是double型的0乘负数会变成负0,太坑了!!
这里放一下测试代码
- #include<map>
- #include<set>
- #include<list>
- #include<cmath>
- #include<queue>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define pi acos(-1)
- #define ll long long
- #define mod 1000000007
- using namespace std;
- const int N=,maxn=,inf=0x3f3f3f3f3f;
- int main()
- {
- double x=0.0,y=x*(-);
- printf("%.2f\n",y);
- if(y==)y=fabs(y);
- printf("%.2f\n",y);
- return ;
- }
- #include<map>
- #include<set>
- #include<list>
- #include<cmath>
- #include<queue>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define pi acos(-1)
- #define ll long long
- #define mod 1000000007
- using namespace std;
- const double eps=1e-;
- const int N=,maxn=,inf=0x3f3f3f3f;
- struct point{
- int x,y;
- };
- struct line{
- point a,b;
- }l[N];
- int main()
- {
- int t;
- double x1,y1,x2,y2,x3,y3,x4,y4;
- cin>>t;
- cout<<"INTERSECTING LINES OUTPUT"<<endl;
- while(t--){
- cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
- if((y4-y3)*(x2-x1)==(y2-y1)*(x4-x3))
- {
- if((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))
- cout<<"NONE"<<endl;
- else
- cout<<"LINE"<<endl;
- }
- else
- {
- double x,y;
- if(x2==x1)
- {
- x=x1;
- y=y3+(x-x3)*(y4-y3)/(x4-x3);
- }
- else if(x3==x4)
- {
- x=x3;
- y=y1+(x-x1)*(y2-y1)/(x2-x1);
- }
- else
- {
- x=(y3-y1+x1*(y2-y1)/(x2-x1)-x3*(y4-y3)/(x4-x3))/((y2-y1)/(x2-x1)-(y4-y3)/(x4-x3));
- y=(x-x1)*(y2-y1)/(x2-x1)+y1;
- }
- if(x==)x=fabs(x);
- if(y==)y=fabs(y);
- printf("POINT %.2f %.2f\n",x,y);
- }
- }
- cout<<"END OF OUTPUT"<<endl;
- return ;
- }
又看了一下网上的题解发现有更简单的叉积判断
首先判断斜率是非相同还是用公式直接来(x4-x3)*(y2-y1)==(y4-y3)*(x2-x1)
然后用叉积(x2-x1)*(y3-y1)==(y2-y1)*(x3-x1)判断x3是不是在x1,x2这条线上是的话就是LINE,否则就是NONE
最后叉积计算交点:
设交点(x0,y0)
(x2-x1)*(y0-y1)-(y2-y1)*(x0-x1)=0;
(x4-x3)*(y0-y3)-(y4-y3)*(x0-x3)=0;
化简可得:
(y1-y2)*x0+(x2-x1)*y0+x1*y2-x2*y1=0;
(y3-y4)*x0+(x4-x3)*y0+x3*y4-x4*y3=0;
建立二元一次方程:
a1*x0+b1*y0+c1=0;
a2*x0+b2*y0+c2=0;
解得:
x0=(c2*b1-c1*b2)/(b2*a1-b1*a2);
y0=(a2*c1-a1*c2)/(b2*a1-b1*a2);
带入就好了,以下是新方法 的ac代码:
- #include<map>
- #include<set>
- #include<list>
- #include<cmath>
- #include<queue>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define pi acos(-1)
- #define ll long long
- #define mod 1000000007
- using namespace std;
- const double eps=1e-;
- const int N=,maxn=,inf=0x3f3f3f3f;
- struct point{
- double x,y;
- };
- struct line{
- point a,b;
- }l[N];
- int main()
- {
- int t;
- double x1,x2,x3,x4,y1,y2,y3,y4;
- cin>>t;
- cout<<"INTERSECTING LINES OUTPUT"<<endl;
- while(t--){
- cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
- if((x4-x3)*(y2-y1)==(y4-y3)*(x2-x1))//斜率判断
- {
- if((x2-x1)*(y3-y1)==(y2-y1)*(x3-x1))cout<<"LINE"<<endl;//用叉积判断共线
- else cout<<"NONE"<<endl;
- }
- else
- {
- double a1=y1-y2,b1=x2-x1,c1=x1*y2-x2*y1;
- double a2=y3-y4,b2=x4-x3,c2=x3*y4-x4*y3;
- double x=(c2*b1-c1*b2)/(b2*a1-b1*a2);
- double y=(a2*c1-a1*c2)/(b2*a1-b1*a2);
- printf("POINT %.2f %.2f\n",x,y);
- }
- }
- cout<<"END OF OUTPUT"<<endl;
- return ;
- }
poj1269计算几何直线和直线的关系的更多相关文章
- POJ1269求两个直线的关系平行,重合,相交
依旧是叉积的应用 判定重合:也就是判断给定的点是否共线的问题——叉积为0 if(!cross(p1,p2,p3) && !cross(p1,p2,p4))printf("LI ...
- uva 11178 Morley's Theorem(计算几何-点和直线)
Problem D Morley's Theorem Input: Standard Input Output: Standard Output Morley's theorem states tha ...
- 计算几何——线段和直线判交点poj3304
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...
- POJ 1269 - Intersecting Lines 直线与直线相交
题意: 判断直线间位置关系: 相交,平行,重合 include <iostream> #include <cstdio> using namespace std; str ...
- BZOJ 1007: [HNOI2008]水平可见直线 平面直线
1007: [HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则 ...
- poj 2318 TOYS(计算几何 点与线段的关系)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12015 Accepted: 5792 Description ...
- UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)
Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...
- hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)
Mirror and Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Intersecting Lines (计算几何基础+判断两直线的位置关系)
题目链接:http://poj.org/problem?id=1269 题面: Description We all know that a pair of distinct points on a ...
随机推荐
- iOS网络编程笔记——社交网络编程
社交网络编程主要使用iOS提供的social框架,目前social框架主要分为两个类: (1)SLComposeViewController提供撰写社交信息(如微博信息)的视图控制器,由iOS系统提供 ...
- mysql---数据控制语言(用户及其权限管理)
用户管理 用户数据所在位置: mysql中的所有用户,都存储在系统数据库(mysql)中的user 表中--不管哪个数据库的用户,都存储在这里.
- C++数据
const :常量 ~x == -++x == -(x+1) 二进制数,1变为0,0变为1 ^ 相同为0,不同为1 & ...
- 【SF】开源的.NET CORE 基础管理系统 - 安装篇
[SF]开源的.NET CORE 基础管理系统 -系列导航 1.开发必备工具 IDE:VS2017 运行环境:netcoreapp1.1 数据库:SQL Server 2012+ 2.获取最新源代码 ...
- Cassandra-java操作——基本操作
接着上篇博客,我们来谈谈java操作cassandra; 上篇博客的环境:jdk1.7 + python2.7.10 + cassandra2.2.8; 由于2.2.8没有对应的驱动文档,那么我们就用 ...
- iOS开发之Autolayout
1.概述 在以前的iOS程序中,是如何设置布局UI界面的? (1)经常编写大量的坐标计算代码 (2)为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还需要分别为2种屏幕 ...
- Java单例模式再加强——按组多单例
最近要使用alibaba的rocket mq(我们公司对其进行了封装,使其运行在dotNet平台上,Java还是和原生的差不多,涉及公司的内容本文不会提及),其中 在生产者组这一块,建议是用单例模式的 ...
- webpack使用总结
我们可以在js中引入样式文件 require('myStyle.css') 这时我们便需要引入相应的webpack loader来帮助我们解析这段代码. 一般来说需要引入css-loader和styl ...
- BZOJ3224普通平衡树【Splay】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11751 Solved: 5013 Descriptio ...
- 聊天界面使用IQKeyboardManager导航栏及整个页面上移的解决方法
问题: 使用第三方库IQKeyboardManager时会使整个页面上移,导航栏页偏移出了显示范围.在聊天界面就会使得上面的消息看不到. 解决方法: 首先说明:在聊天界面使用IQKeyboardMan ...