几何问题
Description
如果在一个二维坐标系中,已知三角形三个点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在三角形边线上也认为在三角形内)?
Input
本问题有多组测试数据,每组数据一行,共8个实数,每两个实数表示一个点,前三个点表示三角形的三个点,后一个点表示需要你判断是不是在内部的点。
Output
如果再三角形内(边上也算内),输出“Yes”,否则输出“No”。
Sample Input
0.0 0.0 4.0 4.0 6.0 0.0 3.0 2.5
Sample Output
Yes
想法
如何计算各个三角形的面积?已知条件只有点坐标,学过解析几何的同学知道可以用坐
标的行列式方法计算,也可以用海伦公式计算,今天我们就用海伦公式来计算。
海伦公式必须要知道三角形的边长,所以先要算出边长。
l = (a + b + c)/ 2
s =sqrt ( l * (l − a) * (l − b) * (l − c) )
Code
#include<bits/stdc++.h>
using namespace std;
const int MAX=100005;
#define EPS 1E-5
typedef long long ll;
struct TPoint{
double x;
double y;
};
double dDist(TPoint tA,TPoint tB){
double dDx,dDy;
dDx=tB.x-tA.x;
dDy=tB.y-tA.y;
return sqrt(dDx*dDx+dDy*dDy);
}
double dArea(TPoint tA,TPoint tB,TPoint tC){
double dAB,dBC,dCA,dHalfL;
dAB=dDist(tA,tB);
dBC=dDist(tB,tC);
dCA=dDist(tC,tA);
dHalfL=(dAB+dBC+dCA)/2.0;
return sqrt(dHalfL*(dHalfL-dAB)*(dHalfL-dBC)*(dHalfL-dCA));
}
bool bIsInside(TPoint tA,TPoint tB,TPoint tC,TPoint tQ){
double dABC,dABQ,dBCQ,dCAQ;
dABC=dArea(tA,tB,tC);
dABQ=dArea(tA,tB,tQ);
dBCQ=dArea(tB,tC,tQ);
dCAQ=dArea(tC,tA,tQ);
if(fabs(dABC-(dABQ+dBCQ+dCAQ))<EPS){
return true;
}
else{
return false;
}
}
int main(){
double x1,y1,x2,y2,x3,y3,x4,y4;
TPoint tA,tB,tC,tQ;
while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4){
tA.x=x1;tA.y=y1;
tB.x=x2;tB.y=y2;
tC.x=x3;tC.y=y3;
tQ.x=x4;tQ.y=y4;
if(bIsInside(tA,tB,tC,tQ)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}