判断一个点是否在三角形内
转自:https://www.cnblogs.com/simplekinght/p/9218310.html
面积法:若点P在三角形ABC内,则三角形ABP+三角形ACP+三角形BCP的面积等于三角形ABC
已知三角形三点坐标ABC,如何求三角形面积呢?
根据叉乘公式,向量A=(x1,y1) ,向量B=(x2,y2),A x B = x1*y2 - x2*y1
此时求得的是向量A和向量B的形成的平行四边形的面积,除以2就是三角形的面积了
1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <cstdio> 6 #include <algorithm> 7 using namespace std; 8 const double eps = 1e-8; 9 struct point 10 { 11 double x,y; 12 }; 13 double solve(point a,point b,point c) 14 { 15 point A; 16 A.x = b.x-a.x; 17 A.y = b.y-a.y; 18 B.x = c.x-a.x; 19 B.y = c.y-a.y; 20 return (A.x*B.y-B.x*A.y)/2.0; 21 } 22 23 int main() 24 { 25 point A,B,C,P; 26 cin>>A.x>>A.y; 27 cin>>B.x>>B.y; 28 cin>>C.x>>C.y; 29 cin>>P.x>>P.y; 30 double sum = solve(A,B,C); 31 double k=0; 32 k + = solve(A,B,P); 33 k + = solve(B,C,P); 34 k + = solve(A,C,P); 35 if((k-sum)>eps) cout<<"在三角形外"<<endl; 36 else cout<<"在三角形内"<<endl; 37 return 0; 38 }
补充一下:
a=(x1,y1) b=(x2,y2)
点积:a*b==x1*x2+y1*y2==|a|*|b|*cos(向量夹角)
叉积:
在三维几何中,向量a和向量b的叉乘结果是一个向量,该向量垂直于a和b向量构成的平面。可以通过右手定则判定其方向
在二维空间中,叉乘还有另外一个几何意义就是:|aXb|等于由向量a和向量b构成的平行四边形的面积。
具体见------>传送门
另外还有三种方法见:https://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html#!comments