NEFU 652 叉积

先介绍一下叉积,定义三个向量A,B,C;

cross=(C-A)x(B-A);

if(cross>0)

  则AB向右拐得到BC;

if(cross==0)

  ABC共线

if(cross<0)

  则AB向左拐得到BC;

叉积与面积的关系,s=abs(cross)/2;

因此我们可以判断一个点在不在一个几何图形的内部,如果各任意三边叉积绝对值之和=该店与任意两边叉积绝对值之和 则在内部或者边上;

NEFU652题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=652

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
struct point
{
    int x,y;
}p[3];
int cross( point A,point B,point C)
{
    return (C.x-A.x)*(B.y-A.y)-(C.y-A.y)*(B.x-A.x);
}
int main()
{
    point t;
    while(~scanf("%d%d",&p[0].x,&p[0].y))
    {
        scanf("%d%d%d%d",&p[1].x,&p[1].y,&p[2].x,&p[2].y);
        scanf("%d%d",&t.x,&t.y);
        if(!p[0].x&&!p[0].y&&!p[1].x&&!p[1].y&&!p[2].y&&!p[2].x&&!t.x&&!t.y)
            break;
        int m,m1,m2,m3;
        m=abs(cross(p[0],p[1],p[2]));
        m1=abs(cross(t,p[0],p[1]));
        m2=abs(cross(t,p[0],p[2]));
        m3=abs(cross(t,p[1],p[2]));
        if(m==0&&m1==0&&m2==0&&m3==0)
            puts("YES");
        else if(m==0||m1==0||m2==0||m3==0)
            puts("NO");
        else
        {
        if(m==m1+m2+m3)
            printf("YES\n");
        else
            printf("NO\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值