叉积_判断点与三角形的位置关系 P1355 神秘大三角

本文介绍了一种通过叉积来判断一个点与三角形位置关系的方法,包括点在三角形内部、外部、边界上及顶点上的情况,并提供了一个具体的C++实现示例。

题目描述

判断一个点与已知三角形的位置关系。

输入输出格式

输入格式:

 

前三行:每行一个坐标,表示该三角形的三个顶点

第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系

(详见样例)

所有坐标值均为整数。

 

输出格式:

 

若点在三角形内(不含边界),输出1;

若点在三角形外(不含边界),输出2;

若点在三角形边界上(不含顶点),输出3;

若点在三角形顶点上,输出4。

 

输入输出样例

输入样例#1: 复制
(0,0)
(3,0)
(0,3)
(1,1)
输出样例#1: 复制
1

说明

【数据规模与约定】

对于100%数据,0<=所有点的横、纵坐标<=100

 

 

//Pro: P1355 神秘大三角
//Strategy: cross product

//叉积判断点与三角形的位置关系,精度高 
//若点在三角形内(不含边界),输出1;
//若点在三角形外(不含边界),输出2;
//若点在三角形边界上(不含顶点),输出3;
//若点在三角形顶点上,输出4。

//设三角形三个顶点是A,B,C,要判断的点是P 
//由于输入的是整数,所以就比较容易了,不用担心精度问题。 

//点:判断在不在点上直接判就好了
//边:如果P在三角形的边所在直线上,那么P与边的端点构成的向量的叉积==0,如果P的坐标还在端点之间,那就在线段上了
//内外:将每条边看成是一个向量,那么可以有三条不同终点的向量
//在这儿规定这三个向量是AB,BC,CA,那么P指向这三个向量的终点,也可以对应得到三个向量PA,PB,PC
//如果对应的向量的叉积(如AB*PA)的值里有任意一个是负的,那么P就在三角形外,
//否则若都是正的,就在三角形内

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct Point    //存点 
{
    int x,y;
    Point(int x=0,int y=0){this->x=x,this->y=y;}
    Point operator + (const Point &a)
    {
        return Point(this->x+a.x,this->y+a.y);
    }
    Point operator - (const Point &a)
    {
        return Point(this->x-a.x,this->y-a.y);
    }
    int operator * (const Point &a)
    {
        return this->x*a.y-this->y*a.x;
    }
}A,B,C,P;

bool On_Point()        //在端点上 
{
    if(P.x-A.x==0&&P.y-A.y==0)
        return true;
    if(P.x-B.x==0&&P.y-B.y==0)
        return true;
    if(P.x-C.x==0&&P.y-C.y==0)
        return true;
    return false;
}

bool On_Edge()        //在边上 
{
    if((P-A)*(P-B)==0&&min(A.x,B.x)<=P.x&&min(A.y,B.y)<=P.y&&max(A.x,B.x)>=P.x&&max(A.y,B.y)>=P.y)
        return true;
    if((P-B)*(P-C)==0&&min(B.x,C.x)<=P.x&&min(B.y,C.y)<=P.y&&max(B.x,C.x)>=P.x&&max(B.y,C.y)>=P.y)
        return true;
    if((P-A)*(P-C)==0&&min(A.x,C.x)<=P.x&&min(A.y,C.y)<=P.y&&max(A.x,C.x)>=P.x&&max(A.y,C.y)>=P.y)
        return true;
    return false;
}

bool inside()    //在不在三角形内 
{
    if((B-A)*(P-A)<0)
        return false;
    if((C-B)*(P-B)<0)
        return false;
    if((A-C)*(P-C)<0)
        return false;
    return true;
}

char c;
int main()
{
    scanf("%*c%d%*c%d%*c",&A.x,&A.y);
    getchar();getchar();
    scanf("%*c%d%*c%d%*c",&B.x,&B.y);
    getchar();getchar();
    scanf("%*c%d%*c%d%*c",&C.x,&C.y);
    getchar();getchar();
    scanf("%*c%d%*c%d%*c",&P.x,&P.y);
    if((B-A)*(C-A)<0)    //重构三角形的顶点,让三角形当A在上时,B左C右 
        swap(A,B);
    if(On_Point())
        puts("4");
    else if(On_Edge())
        puts("3");
    else if(!inside())
        puts("2");
    else
        puts("1");
    return 0;
}

 

转载于:https://www.cnblogs.com/lovewhy/p/9023363.html

### 回答1: 要判断一个三角形位置关系,可以使用以下方法: 1. 计算该三角形每个顶的距离,如果有一个距离为0,则该在该顶上,直接返回该三角形内。 2. 计算该三角形每个边的距离,如果有一个距离为0,则该在该边上,直接返回该三角形内。 3. 如果上述两种情况都不满足,则该三角形内部的条件为:该三角形任意一的向量三角形任意一边的向量的方向相同,且该三角形每个顶的向量三角形任意一的向量的方向相同。 如果该三角形内部,则返回三角形内;如果该三角形外部,则返回三角形外。 ### 回答2: 要判断一个三角形位置关系,可以使用一些几何知识和计算方法。 首先,判断是否在三角形内部,可以使用面法。如果一个在一个三角形的内部,那么以这个为顶的三个三角形的面之和应该等于这个三角形的面。通过计算三角形的面,并将三个面相加,如果等于三角形的面,则可以判断三角形内部。 其次,判断是否在三角形的边上。可以通过判断是否在三条边的延长线上来进行判断。如果在某条边上,那么这条边的两个端所构成的向量该边所构成的向量应该成正比例关系。 最后,判断是否在三角形的外接圆内部。可以通过计算三角形的三个顶的距离,并将这三个距离三角形的三边的长度进行比较。如果该到三个顶的距离均小于三边的长度,则可以判断三角形的外接圆内。 通过以上的判断方法,可以获得三角形位置关系。但需要注意的是,如果三角形是等腰或等边三角形,需要单独处理,因为在这种情况下判断条件会有所不同。 ### 回答3: 要判断一个三角形位置关系,我们可以采取以下方法: 首先,我们可以利用向量的知识来求解三角形位置关系。通过计算三角形的每个顶所连成的向量三角形每个边的法向量的,可以判断三角形内部还是外部。如果三角形的每个顶所连成的向量三角形每个边的法向量的都小于零,则可以确定该三角形的内部。反之,如果有任意一个于等于零,则可以确定该三角形的外部。 其次,我们可以利用乘来判断三角形位置关系。通过计算三角形每两个相邻顶所连成的向量的乘,可以得到三个法向量,分别指向每个三角形的边。然后,计算三角形每个顶的向量对应边法向量的,如果三角形的每个顶所连成的向量对应边法向量的都小于等于零,则可以确定该三角形的内部。反之,如果有任意一个于零,则可以确定该三角形的外部。 最后,我们还可以通过三角形的方法来判断三角形位置关系。可以利用三角形每两个相邻顶所连成的向量的乘来计算每个小三角形的面,然后将这些小三角形的面累加起来,得到整个三角形的面。如果三角形的每个小三角形的面之和等于整个三角形的面,则可以确定该三角形的内部。反之,如果面之和于整个三角形的面,则可以确定该三角形的外部。 通过以上方法,我们可以较为准确地判断三角形位置关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值