小明在上学的路上,看到了小花,小花也看见了他,两个人深情的对视了一下,然后小花就对小明说:你爱过我吗?小明说:爱过。小花就对小明说,那你能帮我做一个题目吗?如果你能做对的话,就证明你爱过我。小明自信的回答好啊。小花说,给你三个人的坐标,以及小花的坐标,她想知道她是不是处在他们三个人的范围之内。小明顿时慌了,早知道我就不说了,他赶紧找到了acmer来帮他解决了。
原题网址:https://ac.nowcoder.com/acm/contest/289/D
涉及的几何原理:https://www.cnblogs.com/TenosDoIt/p/4024413.html
总结:1.面积法:利用已知三点,求出一组共点向量,用两向量叉乘得到的系数行列式除以二,即可得到三角形面积该算法在结果的精度以及算法的代码量都比海伦公式法更优秀。
2.叉乘法:假设三角形的三个点按照顺时针(或者逆时针)顺序是A,B,C。对于某一点P,求出三个向量PA,PB,PC, 然后计算以下三个叉乘(^表示叉乘符号):
t1 = PA^PB,
t2 = PB^PC,
t3 = PC^PA,
如果t1,t2,t3同号(同正或同负),那么P在三角形内部,否则在外部。
该题可以直接利用向量的叉乘算出三角形面积,通过三角形面积之和来判断点p是否在三角形内部
#include <iostream> #include <cmath> using namespace std; int S(int x1,int y1,int x2,int y2,int x,int y) { return x1*y2+x*y1+x2*y-x1*y-x*y2-x2*y1; //向量叉乘行列式的计算 } int main() { int x1,y1,x2,y2,x3,y3,x,y; while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x>>y) { if(abs(S(x1,y1,x2,y2,x3,y3))==abs(S(x1,y1,x2,y2,x,y))+abs(S(x1,y1,x3,y3,x,y))+abs(S(x2,y2,x3,y3,x,y))) //向量叉乘存在正负号,用abs函数比较绝对值 cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }