两条直线可能有三种关系: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);
         && 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的向量
        )
        {
            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");
    ;
}

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

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

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

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

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

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

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

  4. POJ 1269 - Intersecting Lines 直线与直线相交

    题意:    判断直线间位置关系: 相交,平行,重合 include <iostream> #include <cstdio> using namespace std; str ...

  5. poj 1269 Intersecting Lines

    题目链接:http://poj.org/problem?id=1269 题目大意:给出四个点的坐标x1,y1,x2,y2,x3,y3,x4,y4,前两个形成一条直线,后两个坐标形成一条直线.然后问你是 ...

  6. POJ 1269 Intersecting Lines --计算几何

    题意: 二维平面,给两条线段,判断形成的直线是否重合,或是相交于一点,或是不相交. 解法: 简单几何. 重合: 叉积为0,且一条线段的一个端点到另一条直线的距离为0 不相交: 不满足重合的情况下叉积为 ...

  7. POJ 1269 Intersecting Lines(计算几何)

    题意:给定4个点的坐标,前2个点是一条线,后2个点是另一条线,求这两条线的关系,如果相交,就输出交点. 题解:先判断是否共线,我用的是叉积的性质,用了2遍就可以判断4个点是否共线了,在用斜率判断是否平 ...

  8. ●POJ 1269 Intersecting Lines

    题链: http://poj.org/problem?id=1269 题解: 计算几何,直线交点 模板题,试了一下直线的向量参数方程求交点的方法. (方法详见<算法竞赛入门经典——训练指南> ...

  9. POJ 1269 Intersecting Lines(几何)

    题目链接 题意 : 给你两条线段的起点和终点,一共四个点,让你求交点坐标,如果这四个点是共线的,输出“LINE”,如果是平行的就输出“NONE”. 思路 : 照着ZN留下的模板果然好用,直接套上模板了 ...

随机推荐

  1. Html注册表单示例

    注册表单示例,出自<网页开发手记:Html,CSS,JavaScript实战详解>.   <html>   <head>   <title>注册表单&l ...

  2. 在已有 Ubuntu 的基础上硬盘安装 Win7 实现双系统

    . . . . . LZ 的笔记本电脑一直安装的是 Ubuntu 系统,最近由于工作需要,要安装一个 Win7 系统.大家都知道,Linux 和 Windows 装双系统的时候要先装 Win 再装 L ...

  3. Web前端技术研究:Css hack技术---令人沮丧的技术

    我最近想好好整理下csshack技术,但是结果很沮丧,下面我将我最初写的笔记和大家分享下. 我在单位整理的研究笔记: 不同的浏览器对某些CSS代码解析会存在一定的差异,因此就会导致不同浏览器下给用户展 ...

  4. android GestureDetector 手势基础

    1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...

  5. Java实现注册邮箱激活验证

    邮件发送servelet实现 package com.xbs.register.main; import java.io.IOException;import java.util.Date;impor ...

  6. atitit.查看预编译sql问号 本质and原理and查看原生sql语句

    atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look  gene ...

  7. stage划分

    整个stage的划分会根据最后触发的action进行倒推,如果碰到宽依赖就将当前范围内的rdd划分为一个stage,直到所有的RDD遍历完为止.

  8. 即时通讯UI-聊天界面(UITableView显示左右两人聊天)

    目录 1.创建UITableView对象并设置相关属性 2.创建cellModel模型 //枚举类型 typedef enum { ChatMessageFrom = ,//来自对方的消息 ChatM ...

  9. Jquery正则表达式公式.例子

    1.非负整数         /^\d+$/     2.正整数           /^[0-9]*[1-9][0-9]*$/     3.非正整数       /^((-\d+)|(0+))$/  ...

  10. 消息提示和消息推送插件toastr

    http://www.jq22.com/yanshi476 比较棒的消息提示和消息推送插件toastr function myIntervalshow() { // showPopup1(300, 1 ...