计算几何,求线段有无可能相交

来源:互联网 发布:程控交换机如何编程 编辑:程序博客网 时间:2024/05/22 06:51

`题意:就是判断各线段之间有没有交点。

判断两线段相交,要运用到叉积。两个线段相交肯定相互跨越,假设一个条线段(p1p2),另一条是(q1q2),那么p1p2肯定在q1q2线段的两侧,那么运用叉积如果p1p2跨越q1q2的话(q1p1)x(q2p2)《= 0.同样也要验证 q1q2是不是也跨越p1p2,注意:p1p2跨越q1q2,不代两个线段相交,可能是p1p2跨越直线q1q2,所以说还是要再次判断q1q2是不是跨越p1p2

还有另外一种比较容易理解的解法:

就是如果两个线段相交,那么两线段两端端点的差即(p1-q1)与(p2-q2)的乘积肯定是小于等于0的(代码略)要参考地址请戳http://blog.csdn.net/yu_ch_sh/article/details/38711239`

#include <stdio.h>#include <math.h>struct node{    double x;    double y;}s[150],e[150];int chaji(node a, node b, node c){    return (a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y);}int main(){    int n;    while(scanf("%d",&n),n){        int i;        for (i = 0; i < n; i++){            scanf("%lf%lf%lf%lf",&s[i].x,&s[i].y,&e[i].x,&e[i].y);        }        int ans = 0;        for (i = 0; i < n-1; i++){            for (int j = i+1; j < n; j++){                double temp1 = chaji(s[i],e[i],s[j]);                double temp2 = chaji(s[i],e[i],e[j]);//temp1*temp2判断是s【j】是否的点是否在s【i】的两侧                double temp3 = chaji(s[j],e[j],s[i]);                double temp4 = chaji(s[j],e[j],e[i]);                if (temp1*temp2 <= 0 && temp3 * temp4 <= 0)//只有两个点都在两条线段的两侧,才相交                    ans++;            }        }        printf("%d\n",ans);    }}

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1086

原创粉丝点击