两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交。 那给定两条直线怎么判断他们的位置关系呢。还是用到向量的叉积

例题:POJ 1269

题意:这道题是给定四个点p1, p2, p3, p4,直线L1,L2分别穿过前两个和后两个点。来判断直线L1和L2的关系

这三种关系一个一个来看:

1. 共线。 如果两条直线共线的话,那么另外一条直线上的点一定在这一条直线上。所以p3在p1p2上,所以用get_direction(p1, p2, p3)来判断p3相对于p1p2的关系,同理判断p4与p1p2的关系。

2. 平行。 如果两条直线平行的话,分别找出直线L1和L2的向量,那么向量的叉积等于0。其中L1的向量是 p2-p1, L2的向量是p4-p3

3. 相交。 这种情况是最复杂的一中情况,不过有了向量这一工具也不复杂了。

假设p0(x0, y0)是两条直线的交点,那么

p0p1×p2p0=0

p0p3×p4p0=0   (p0p1表示向量p0p1)

将p0代入之后结果得到方程组

x0*(y2-y1) + y0*(x1 - x2) + x2*y1 - x1*y2 = 0

x0*(y4-y3) + y0*(x3 - x4) + x4*y3 - x3*y4 = 0

这是典型的一元二次方程组,联立可得到x和y,

对于普通的二元一次方程组

a1x + b1y + c1 = 0

a2x + b2y + c2 = 0

的解为

x = (b1*c2 - b2*c1) / (b2*a1 - b1 * a2)

y = (a1*c2 - c1*a2) / (a2*b1 - a1 * b2)

所以最后可得出x和y也就是让求的交点坐标。代码如下

/*************************************************************************
> File Name: poj_1269_chaji.cpp
> Author:
> Mail:
> Created Time: 2015年04月01日 星期三 21时44分32秒
************************************************************************/ #include<iostream>
#include <cstdio>
using namespace std;
struct point{
int x, y;
};
point p1, p2, p3, p4;
int get_direction(point a, point b, point c)//判断点与直线的关系, 也就是叉积
{
point t1, t2;
t1.x = c.x - a.x; t1.y = c.y - a.y;
t2.x = b.x - a.x; t2.y = b.y - a.y;
return (t1.x * t2.y - t1.y * t2.x);
}
int on_line(point a, point b)//判断是否共线
{
return (a.x * b.y - a.y * b.x);
}
//求两直线的交点,返回x和y
void get_intersection(point p1, point p2, point p3, point p4, double &x, double &y)
{
double a1, b1, c1, a2, b2, c2;//求交点过程
a1 = (p2.y - p1.y) * 1.0;
b1 = (p1.x - p2.x) * 1.0;
c1 = (p2.x * p1.y - p1.x * p2.y) * 1.0;
a2 = (p4.y - p3.y) * 1.0;
b2 = (p3.x - p4.x) * 1.0;
c2 = (p3.y * p4.x - p4.y * p3.x) * 1.0;
x = (b1 * c2 - b2 * c1) / (b2 * a1 - b1 * a2);
y = (a1 * c2 - c1 * a2) / (a2 * b1 - a1 * b2);
}
int main()
{
int n;
scanf("%d", &n);
puts("INTERSECTING LINES OUTPUT");
while (n--)
{
scanf("%d %d %d %d %d %d %d %d", &p1.x, &p1.y, &p2.x, &p2.y, &p3.x, &p3.y, &p4.x, &p4.y);
if (get_direction(p1, p2, p3) == && get_direction(p1, p2, p4) == )
{
printf("LINE\n");
continue;
}
point v1, v2;
v1.x = p2.x - p1.x; v1.y = p2.y - p1.y;//直线1的向量
v2.x = p4.x - p3.x; v2.y = p4.y - p3.y;//直线2的向量
if (on_line(v1, v2) == )
{
printf("NONE\n");
continue;
}
double x, y;
get_intersection(p1, p2, p3, p4, x, y);
printf("POINT %.2f %.2f\n", x, y);
}
puts("END OF OUTPUT");
return ;
}

判断两条直线的位置关系 POJ 1269 Intersecting Lines的更多相关文章

  1. POJ 1269 /// 判断两条直线的位置关系

    题目大意: t个测试用例 每次给出一对直线的两点 判断直线的相对关系 平行输出NODE 重合输出LINE 相交输出POINT和交点坐标 1.直线平行 两向量叉积为0 2.求两直线ab与cd交点 设直线 ...

  2. 简单几何(直线位置) POJ 1269 Intersecting Lines

    题目传送门 题意:判断两条直线的位置关系,共线或平行或相交 分析:先判断平行还是共线,最后就是相交.平行用叉积判断向量,共线的话也用叉积判断点,相交求交点 /********************* ...

  3. POJ 1269 Intersecting Lines(判断两直线位置关系)

    题目传送门:POJ 1269 Intersecting Lines Description We all know that a pair of distinct points on a plane ...

  4. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  5. C# 判断两条直线距离

    本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...

  6. 2018-7-31-C#-判断两条直线距离

    title author date CreateTime categories C# 判断两条直线距离 lindexi 2018-07-31 14:38:13 +0800 2018-05-08 10: ...

  7. POJ 1269 Intersecting Lines (判断直线位置关系)

    题目链接:POJ 1269 Problem Description We all know that a pair of distinct points on a plane defines a li ...

  8. POJ 1269 Intersecting Lines【判断直线相交】

    题意:给两条直线,判断相交,重合或者平行 思路:判断重合可以用叉积,平行用斜率,其他情况即为相交. 求交点: 这里也用到叉积的原理.假设交点为p0(x0,y0).则有: (p1-p0)X(p2-p0) ...

  9. POJ 1269 Intersecting Lines(直线相交判断,求交点)

    Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8342   Accepted: 378 ...

随机推荐

  1. Python datetime time 常用操作

    测试版本: Python 2.7 获取当前时间的两种方法 import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") ...

  2. jQuery 的ready事件和 JavaScript 的load事件对比

    为了理解2个事件的异同,先了解一下HTML文档加载顺序 HTML DOM文档加载步骤 HTML DOM文档加载是按顺序执行的,这与浏览器的渲染方式有关,一般浏览器渲染操作的顺序大致按如下几个步骤 1, ...

  3. (兼容IE6)又一个提示框思密达,腾讯UED 201401242352

    找乐子 仿QQ空间的,先来看下,别嫌代码垃圾,业余菜鸟一个,用到的话就当个乐子就行了 注意: 因为有同学说需要IE6便做了一下. 已经处理了IE6,可测试. 腾讯的东西,感觉还好吧:) 使用方法老简单 ...

  4. ActiveX控件资料

    Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...

  5. python模块之time和datetime

    33.python模块之time      1.>>> time.time() 1470900847.8458395 ==>时间戳,从1970年到现在.      2.> ...

  6. select查询的性能

    为什么忘记commit也会造成select查询的性能问题 今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据, ...

  7. iOS程序-UIScrollView的基本使用

    iOS程序-UIScrollView的基本使用 scrollView的几个属性contentSize contentOffset contentInset 1.不能向上滑动很可能是因为contentS ...

  8. codevs 3269 混合背包

    题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体 ...

  9. Tomcat基础教程(二)

    上一篇说到了Tomcat的介绍,下载及安装,这一篇我会详述Tomcat服务器结构 一.Tomcat服务器结构图: Tomcat服务器中可以配置多个Service,每个Service可以包含多个Conn ...

  10. windows10 预览版 中英文官方下载地址+激活密钥+网盘分享

    windows10 预览版 中英文官方下载地址+激活密钥+网盘分享 产品密钥:NKJFK-GPHP7-G8C3J-P6JXR-HQRJR 英语 64 位 (x64)  http://iso.esd.m ...