[fzu 2273]判断两个三角形的位置关系

首先判断是否相交,就是枚举3*3对边的相交关系。

如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外。两边各判断一次。

//http://acm.fzu.edu.cn/problem.php?pid=2273
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

const double eps=1e-8;
const double pi=acos(-1.0);
int sgn(double x)
{
    if (fabs(x)<eps) return 0;
    if (x<0) return -1;
    return 1;
}
struct Point
{
    double x,y;
    Point() {}
    Point(double _x,double _y)
    {
        x=_x;
        y=_y;
    }
    Point operator +(const Point &b) const
    {
        return Point(x+b.x,y+b.x);
    }
    Point operator -(const Point &b) const
    {
        return Point(x-b.x,y-b.x);
    }
    double operator ^(const Point &b) const
    {
        return x*b.y-y*b.x;
    }
    double operator *(const Point &b) const
    {
        return x*b.x+y*b.y;
    }
    Point operator /(const double b) const
    {
        return Point(x/b,y/b);
    }
};

struct Line
{
    Point s,e;
    Line() {}
    Line(Point _s,Point _e)
    {
        s=_s;
        e=_e;
    }
};

double dist(Point a,Point b)
{
    return sqrt((a-b)*(a-b));
}
bool inter(Line l1,Line l2)
{
    return
        max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x) &&
        max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x) &&
        max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y) &&
        max(l2.s.y,l2.e.y)>=min(l1.s.y,l1.e.y) &&
        sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e))<=0 &&
        sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e))<=0;
}
Point o;
bool _cmp(Point p1,Point p2)
{
    double tmp=(p1-o)^(p2-o);
    if (sgn(tmp)>0) return true;
    else if (sgn(tmp)==0 && sgn(dist(p1,o)-dist(p2,o))<=0) return true;
    else return false;
}

bool OnSeg(Point P,Line L)
{
    return
        sgn((L.s-P)^(L.e-P))==0 &&
        sgn((P.x-L.s.x)*(P.x-L.e.x))<=0 &&
        sgn((P.y-L.s.y)*(P.y-L.e.y))<=0;
}
int inConvexPoly(Point a,Point p[],int n)
{
    for (int i=0;i<n;i++)
    {
        if (sgn((p[i]-a)^(p[(i+1)%n]-a))<0) return -1;  // out
        else if (OnSeg(a,Line(p[i],p[(i+1)%n]))) return 0;  // on
    }
    return 1; // in
}

Point p[6];

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        for (int i=0;i<6;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
        bool xj=false;
        for (int i=0;i<3;i++)
        {
            for (int j=0;j<3;j++)
            {
                Line l1=Line(p[i],p[(i+1)%3]);
                Line l2=Line(p[j+3],p[(j+1)%3+3]);
                if (inter(l1,l2))
                {
                    xj=true;
                    break;
                }
            }
            if (xj) break;
        }
        if (xj)
        {
            printf("intersect\n");
            continue;
        }
        int in1=0,in2=0;
        o=(p[0]+p[1]+p[2])/3.0;
        sort(p,p+3,_cmp);
        o=(p[3]+p[4]+p[5])/3.0;
        sort(p+3,p+6,_cmp);
        for (int i=0;i<3;i++)
        {
            if (inConvexPoly(p[i],p+3,3)==1) in1++;
            if (inConvexPoly(p[i+3],p,3)==1) in2++;
        }
        if (in1==3||in2==3) printf("contain\n");
        else printf("disjoint\n");
    }
    return 0;
}
时间: 2024-11-10 14:13:48

[fzu 2273]判断两个三角形的位置关系的相关文章

判断两条直线的位置关系 POJ 1269 Intersecting Lines

两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, p2, p3, p4,直线L1,L2分别穿过前两个和后两个点.来判断直线L1和L2的关系 这三种关系一个一个来看: 1. 共线. 如果两条直线共线的话,那么另外一条直线上的点一定在这一条直线上.所以p3在p1p2上,所以用get_direction(p1, p2, p3)来判断p3相对于p1p2的关

实验12:Problem D: 判断两个圆之间的关系

Home Web Board ProblemSet Standing Status Statistics Problem D: 判断两个圆之间的关系 Problem D: 判断两个圆之间的关系 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 381  Solved: 325[Submit][Status][Web Board] Description 定义Point类,包括double类型的两个属性,分别表示二维空间中一个点的横纵坐标:定义其必要的构

Cupid&#39;s Arrow---hdu1756(判断点与多边形的位置关系 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n): 射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正 确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从点出 发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在 多边形边上时,如果是奇数,那么点就一定在多边形内部,否

LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边形的内部; 射线法判断即可适用于任何(凸或凹)多边形;时间复杂度为O(n); 判断一个点是在多边形内部,边上还是在外部,时间复杂度为O(n):射线法可以正确用于凹多边形: 射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题.该算法思想是从

Segments---poj3304(判断直线与线段的位置关系)

题目链接:http://poj.org/problem?id=3304 题意:给你n个线段,求是否有一条直线与所有的线段都相交,有Yes,没有No; 枚举所有的顶点作为直线的两点,然后判断这条直线是否和所有的线段相交即可;注意不能找两个相同的点作为直线上的两点: #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<stdio.h>

判断两个线段是否相交

我们的问题是这样的:给定一条线段的起点为$A_1$.终点为$A_2$,另一条线段的起点为$B_1$.终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交? 我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上. 方法一(解方程法): 容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$:同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r

Intersecting Lines---poj1269(求两直线的位置关系)

题目链接:http://poj.org/problem?id=1269 题意:给你两条直线上的任意不同的两点,然后求两条直线的位置关系,如果相交于一点输出该点坐标; #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<stdio.h> #include<map> #include<vector> #inclu

几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法.由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能.这里记录一下一些算法,如有误请指出,谢谢! 首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选. 常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面): 1.顺时针/逆时针判定法 该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3

华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列

描述: 判断两序列是否为同一二叉搜索树序列 输入 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO 本题思路:根