POJ 1410 判断线段相交点在多边形内外

题意:判断一线段与矩形是否相交。需要注意的是输入可能不是按照左上右下的顺序,如果线段两个端点都在举行内的话也算相交。

这题分为判断线段与4边是否有交点,如果没有判断两点是否在矩形内就可以了。我用的方法是射线法。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double PointType;
struct point
{
    PointType x,y;
};
PointType Direction(point pi,point pj,point pk) //判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线
{
    return (pj.x-pi.x)*(pk.y-pi.y)-(pk.x-pi.x)*(pj.y-pi.y);
}
bool On_Segment(point pi,point pj,point pk)
{
    if(pk.x>=min(pi.x,pj.x)&&pk.x<=max(pi.x,pj.x)&&pk.y>=min(pi.y,pj.y)&&pk.y<=max(pi.y,pj.y))
        return 1;
    return 0;
}
bool Segment_Intersect(point p1,point p2,point p3,point p4)
{
    PointType d1=Direction(p3,p4,p1),d2=Direction(p3,p4,p2),d3=Direction(p1,p2,p3),d4=Direction(p1,p2,p4);
    if(((d1>0&&d2<0)||(d1<0&&d2>0))&&((d3>0&&d4<0)||(d3<0&&d4>0)))
        return 1;
    if(d1==0&&On_Segment(p3,p4,p1))
        return 1;
    if(d2==0&&On_Segment(p3,p4,p2))
        return 1;
    if(d3==0&&On_Segment(p1,p2,p3))
        return 1;
    if(d4==0&&On_Segment(p1,p2,p4))
        return 1;
    return 0;
}
int Pandingdian(point a,int n,point *polygon)//1在多边形上 2在多边形外 0在多边形内
{
    point b;
    b.x=-9999999;
    b.y=a.y;
    int sum=0;polygon[n]=polygon[0];
    for(int i=1; i<=n; i++)
        if(polygon[i].y-polygon[i-1].y!=0&&Segment_Intersect(a,b,polygon[i],polygon[i-1]))
        {
            if(Direction(a,polygon[i],polygon[i-1])==0)
                return 1;
            sum++;
        }
    if(sum&1)
        return 0;
    return 2;
}
int main()
{
    point a,b,lt,rb,lb,rt,polygon[10];
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,<.x,<.y,&rb.x,&rb.y);
        if(lt.x>rb.x)
            swap(lt.x,rb.x);
        if(lt.y<rb.y)
            swap(lt.y,rb.y);
        rt.x=rb.x,rt.y=lt.y;
        lb.x=lt.x,lb.y=rb.y;
        polygon[0]=lb,polygon[1]=rb,polygon[2]=rt,polygon[3]=lt,polygon[4]=lb;
        int ans=0;
        for(int i=1;i<5;i++)
        if(Segment_Intersect(a,b,polygon[i],polygon[i-1]))
        {
            puts("T"),ans=1;
            break;
        }
        if(ans)
        continue;
        if(Pandingdian(a,4,polygon)==0&&Pandingdian(b,4,polygon)==0)
        {
            puts("T");
            continue;
        }
        puts("F");
    }
    return 0;
}
时间: 2024-10-31 22:58:56

POJ 1410 判断线段相交点在多边形内外的相关文章

POJ 1584 判断凸包,点在多边形内外,点到直线最短距离

题意求给出一个多边形,问这个多边形是否是凸包,如果不是数出HOLE IS ILL-FORMED,如果是问一个棍子能否穿过,给出底面的圆心和半径. 分3步: 1.判断是否是凸多边形 2.判断点是否在多边形内部 3.判断点到各边的最小距离是否大于等于半径 由于输入是按照顺时针或者逆时针,所以只要判断相邻叉积同号就可以.. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm&

POJ 1066 判断线段相交

题意:有个考古队进金字塔里盗墓,大小100*100,样图是一个俯视图,给了财宝坐标,又给了各个墙.题目规定考古队在每面墙的中点处开一个洞,这样就避免了两墙交点的情况,求最小的凿墙数目. 很明显,枚举连接四面两个墙之间中点与宝藏的线段,求出这种线段与墓里墙相交的最小值.其实可以不用枚举中点,直接用墙的端点与宝藏相连的线段就行,细想一想可以想明白. #include <iostream> #include<cstdio> #include<cstring> #include

判断线段与多边形、多边形与多边形是否相交的算法(C#)

问题描述 判断线段与多边形.多边形与多边形是否相交(C#),包括线段.多边形包含在多边形内,线段与多边形某一条边重合的情况判断.求教各位大神!我有写一个判断线段与多边形的边时候相交的算法,但是貌似没有判断成功,请各位大神指导!谢谢!publicboolGetLineIntersection(GraphicGraphic,GraphicDrawPolygonGraphic){doubledistAB,theCos,theSin,newX,ABpos;doubleX=0;doubleY=0;Draw

HDU 1756 判断点在多边形内外

题意:判断点在多边形内外,用来试模版的 #include <iostream> #include <stdio.h> #include <math.h> typedef double DIY; const DIY EPS = 0; const DIY N = 1000005; using namespace std; struct Point { DIY x,y; }; struct Segment { Point a; Point b; }; typedef Poin

POJ 2826 两线段关系求面积

题意:两个木板接雨,问你能解多少雨,也就是面积. 这题考虑几种情况:1,有线段平行x轴,接不到:2,两线段没交点,接不到:3,取两线段高的端点如果比两线段交点低也接不到:4,最不容易想到的,两木板在同侧并且上面的木板盖住了下面的木板也接不到.这四条单独判断然后求三角形面积就可以了. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cm

算法代码-求算线段或直线与线段的交点(用C#代码实现)

问题描述 求算线段或直线与线段的交点(用C#代码实现) 希望能有详细的代码,就是可以输入两条线段总共四个点的坐标,然后根据坐标可以判断两条线段是否相交(相交判断有一个交点或是无穷多交点),或是不想交. 谢谢! 解决方案 这用数学解一次不就可以了么,如果你数学忘记了,回去补补吧,这样都来求.

php+mongodb判断坐标是否在指定多边形区域内的实例_php实例

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将提供使用PHP连接mongodb,判断坐标是否在指定多边形区域内的实例. 1.定义多边形区域 多边形的坐标点如下: 113.314882,23.163055 113.355845,23.167042 113.370289,23.149564 113.356779,23.129758 113.338238,23.13913 113.330979,23.124706 113.313588,23.140858 1

php+mongodb判断坐标是否在指定多边形区域内的实例

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将提供使用PHP连接mongodb,判断坐标是否在指定多边形区域内的实例. 1.定义多边形区域 多边形的坐标点如下: 113.314882,23.163055 113.355845,23.167042 113.370289,23.149564 113.356779,23.129758 113.338238,23.13913 113.330979,23.124706 113.313588,23.140858 1

POJ 2398 判断点在多边形内外

题意:给出一个矩形,再给出n条两端点分别在上下边的线段,然后给出m个点,要求按每个区域内的点数的升序输出点数t,后面为区域内有t的区域数. 这题按照题意做注意要对矩形内的边排序然后再二分判断点在那个区域里. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct point { double x,y; }; s