sincerit 内心里的一把火(叉积公式求面积)

链接:https://ac.nowcoder.com/acm/contest/289/D
来源:牛客网

题目描述

小明在上学的路上,看到了小花,小花也看见了他,两个人深情的对视了一下,然后小花就对小明说:你爱过我吗?小明说:爱过。小花就对小明说,那你能帮我做一个题目吗?如果你能做对的话,就证明你爱过我。小明自信的回答好啊。小花说,给你三个人的坐标,以及小花的坐标,她想知道她是不是处在他们三个人的范围之内。小明顿时慌了,早知道我就不说了,他赶紧找到了acmer来帮他解决了。

在这里插入图片描述
输入描述:
多组输入,输入A,B,C的坐标(x1,y1,x2,y2,x3,y3),以及小花的坐标(x,y)。(范围都是在0到100之内的整数)
输出描述:
是的话就输出YES,否则输出NO
示例1
输入
复制
0 0 3 0 0 4
1 1
输出
复制
YES

看到题的最直观的思路就是看三角形 Sapc + Sapb + Sbpc == Sabc 这三个小三角下的面积是否等于三角形abc的面积,这里利用叉积公式求面积(适用于知道点的坐标)
a(x1, y1), b(x2, y2), c(x3, y3), p(x, y);
以ab和ac为平行四边形的面积是
ab向量 (x2-x1, y2-y1)
ac向量 (x3-x1, y3-y1) — 这里当成2阶行列式求解
Sabc = fabs( (x2-x1)(y3-y1) - (y2-y1)(x3-x1) ) / 2
特别注意:以上用叉积求得的面积是有向面积有正有负,
当Sabc < 0 时逆时针给出三角形,否则顺时针。
顺时针图
在这里插入图片描述
逆时针图
在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<math.h>
int main(){
    double x1,y1,x2,y2,x3,y3;
    double x,y;
    double X1,X2,X3,Y1,Y2,Y3;
    while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x,&y)){  
    float ST,S1,S2,S3;
    ST=fabs(x1*y2+x2*y3+x3*y1- x2*y1-x3*y2-x1*y3)/2;
    S1=fabs(x1*y+x*y2+x2*y1-x*y1-x2*y-x1*y2)/2;
    S2=fabs(x*y3+x3*y1+x1*y-x3*y-x1*y3-x*y1)/2;
    S3=fabs(x3*y+x*y2+x2*y3- x*y3-x2*y-x3*y2)/2;
    if(ST==S1+S2+S3)printf("YES\n");
    else printf("NO\n");
}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sincerit/article/details/84933472