传送门:P1355
题目描述
判断一个点与已知三角形的位置关系。
输入格式
前三行:每行一个坐标,表示该三角形的三个顶点
第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系
(详见样例)
所有坐标值均为整数。
输出格式
若点在三角形内(不含边界),输出1;
若点在三角形外(不含边界),输出2;
若点在三角形边界上(不含顶点),输出3;
若点在三角形顶点上,输出4。
输入输出样例
输入 #1
(0,0) (3,0) (0,3) (1,1)
输出 #1
1
思路
其实这题很简单啊,就是一堆判断(所以我们省掉一个判断,这里省去了1)
我们把p[1~3]看成三角形的三个顶点A、B、C,p[4]当成那个点D,这里我使用了结构体,c就是输入中的废字符。
cin>>c>>p[1].x>>c>>p[1].y>>c;
cin>>c>>p[2].x>>c>>p[2].y>>c;
cin>>c>>p[3].x>>c>>p[3].y>>c;
cin>>c>>p[4].x>>c>>p[4].y>>c;
四号情况:(不说了,太简单了)直接上代码
if((p[1].x==p[4].x&&p[1].y==p[4].y)||(p[2].x==p[4].x&&p[2].y==p[4].y)||(p[3].x==p[4].x&&p[3].y==p[4].y)){//特判点在三角形顶点上的情况
cout<<4;
return 0;
}
剩下的判断,我们需要使用到三角形面积公式(非常重要!!!)
double msr(int a,int b,int c,int d,int e,int f){//三角形面积
double x,y,z,s;
x=sqrt((a-c)*(a-c)+(b-d)*(b-d));
y=sqrt((a-e)*(a-e)+(b-f)*(b-f));
z=sqrt((c-e)*(c-e)+(d-f)*(d-f));
s=(x+y+z)/2;
return sqrt(s*(s-x)*(s-y)*(s-z));
}
我们用sum2~sum4依次表示,
,
,sum表示
(这里怕有精度问题,面积都乘100)
接着特判
二号情况:
三号情况:或者
或者
(一号情况:)
AC代码:
#include<bits/stdc++.h>
using namespace std;
char c;
struct point{
int x,y;
}p[9];
double msr(int a,int b,int c,int d,int e,int f){//三角形面积
double x,y,z,s;
x=sqrt((a-c)*(a-c)+(b-d)*(b-d));
y=sqrt((a-e)*(a-e)+(b-f)*(b-f));
z=sqrt((c-e)*(c-e)+(d-f)*(d-f));
s=(x+y+z)/2;
return sqrt(s*(s-x)*(s-y)*(s-z));
}
int main(){
cin>>c>>p[1].x>>c>>p[1].y>>c;
cin>>c>>p[2].x>>c>>p[2].y>>c;
cin>>c>>p[3].x>>c>>p[3].y>>c;
cin>>c>>p[4].x>>c>>p[4].y>>c;
//p[1]-p[2]为AB,p[2]-p[3]为BC,p[3]-p[1]为CA,p[4]为D
if((p[1].x==p[4].x&&p[1].y==p[4].y)
||(p[2].x==p[4].x&&p[2].y==p[4].y)
||(p[3].x==p[4].x&&p[3].y==p[4].y)){//特判点在三角形顶点上的情况
cout<<4;
return 0;
}
int sum=(int)msr(p[1].x,p[1].y,p[2].x,p[2].y,p[3].x,p[3].y)*100;//三角形ABC的面积
int sum2=(int)msr(p[1].x,p[1].y,p[2].x,p[2].y,p[4].x,p[4].y)*100;//三角形ABD的面积
int sum3=(int)msr(p[1].x,p[1].y,p[3].x,p[3].y,p[4].x,p[4].y)*100;//三角形ACD的面积
int sum4=(int)msr(p[2].x,p[2].y,p[3].x,p[3].y,p[4].x,p[4].y)*100;//三角形BCD的面积
if(sum2+sum3+sum4>sum){//三个三角形的面积之和>大三角形面积说明点在三角形外
cout<<2;
return 0;
}else if(sum2==0||sum3==0||sum4==0){//任何一个小三角形面积=0就代表着点在三角形边界上
cout<<3;
return 0;
}else{
cout<<1;
return 0;
}
}