向量叉积判断两线段是否相交

判断两直线p1p2与q1q2是否相交,用向量叉积来判断

如果P x Q >0,则P在Q的顺时针方向;

如果P x Q <0,则P在Q的逆时针方向;

如果P x Q=0,则P与Q共线,可能同向也可能反向

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>

typedef struct node
{
    double x,y;
}point;

point p1,p2,q1,q2;
double result1,result2;

double crossProduct(point a,point b1,point b2)
{
    double x1,y1,x2,y2;
    x1=a.x-b1.x;
    y1=a.y-b1.y;
    x2=b2.x-b1.x;
    y2=b2.y-b1.y;
    return x1*y2-x2*y1;
}

int main()
{
    while(1)
    {
        scanf("%lf%lf",&p1.x,&p1.y);
        scanf("%lf%lf",&p2.x,&p2.y);
        scanf("%lf%lf",&q1.x,&q1.y);
        scanf("%lf%lf",&q2.x,&q2.y);

        result1=crossProduct(p1,q1,q2);//注意向量顺序
        result2=crossProduct(p2,q2,q1);
        printf("%lf  %lf\n",result1,result2);

        if(result1*result2>=0)printf("YES\n");//如果叉乘大于0则相交
        else printf("NO\n");
    }
    return 0;
}

转自:http://www.cnblogs.com/ysh-blog/archive/2012/07/10/2583905.html

向量叉积判断两线段是否相交

时间: 2024-10-17 13:08:09

向量叉积判断两线段是否相交的相关文章

判断两线段是否相交

今日集训第一日,遇到了判断线段相交问题.跟面积问题一样,这个同样可以用叉积来解决. 数学原理证明: 首先引出计算几何学中一个最基本的问题:如何判断向量在的顺时针方向还是逆时针方向? 把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2).向量的叉积(cross product)实际上就是矩阵的行列式: 代码实现: 1 int direction(Point p0, Point p1, Point p2) { 2 int px02 = p2.x - p0.x; 3 int py02

判断两线段是否相交 模板

1 struct point 2 { 3 double x, y; 4 point( double _x = 0, double _y = 0 ) 5 { 6 x = _x; 7 y = _y; 8 } 9 point operator-( point t ) 10 { 11 return point( x - t.x, y - t.y ); 12 } 13 double operator*( point t ) 14 { 15 return x * t.y - y * t.x; 16 } 17

模板:判断两线段是否相交

根据叉乘判断. 1 inline double CrossProduct(node a, node b, node c){ 2 return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x); 3 } 4 //Calculate the crossproduct 5 6 7 inline bool SegX(node p1, node p2, node p3, node p4){ 8 double d1 = CrossProduct(p3

Pick-up sticks--poj2653(判断两线段是否相交)

http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个 分析:  我刚开始想倒着遍历  因为n是100000   想着会超时吧  后来一看说  在上面的不会超过1000个 这就放心了 简单优化一下就过了 最后一个肯定是在最上面的 让后从他的下一个开始  每一个跟他相交的都是在他下面的  下一次就直接不循环他了 但是一直wa   彻底懵逼了 后来看了学长博客  他是正这循环  只要有跟他相交的就跳出  然后我就正这便利

判断平面上两线段是否相交

计算几何基础——矢量和叉积 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量 p2 矢量的加减 设二维矢量 P = (x1, y1), Q = (x2, y2),则 P + Q = (x1 + x2, y1 + y2), P - Q = (x1 - x2, y1 - y2),且有 P + Q = Q + P, P - Q = -(Q - P) 矢量叉积 设矢量 P = (x1, y1), Q = (x2, y2

You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6837 Accepted Submission(s): 3303 Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. A

如何判断单链表是否存在环 &amp; 判断两链表是否相交

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

判断两矩形是否相交

转自Avril,略有改动 Problem: 给定两个边与坐标轴平行的矩形,分别由左上角与右下角两点指定,判断两矩形是否相交. Solution: 如下图所示,首先求出$P_1$与$P_3$点(即坐标值较小的两点)在$X$方向较大值与$Y$方向较大值构成的点,在下图中就是$P_3$,用红点(记为M点)表示. 然后求出$P_2$与$P_4$点(即坐标值较小的两点)在X方向较小值与Y方向较小值构成的点,在下图中就是$P_2$,用橙色点(记为N点)表示. 如果M点的X坐标和Y坐标值均比N点相应的X坐标和

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短