本文主要是介绍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;
}
这篇关于sincerit 内心里的一把火(叉积公式求面积)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!