题目描述
判断一个点与已知三角形的位置关系。
输入输出格式
输入格式:
前三行:每行一个坐标,表示该三角形的三个顶点
第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系
(详见样例)
所有坐标值均为整数。
输出格式:
若点在三角形内(不含边界),输出1;
若点在三角形外(不含边界),输出2;
若点在三角形边界上(不含顶点),输出3;
若点在三角形顶点上,输出4。
输入输出样例
输入样例#1:
(0,0)
(3,0)
(0,3)
(1,1)
输出样例#1:
1
说明
【数据规模与约定】
对于100%数据,0<=所有点的横、纵坐标<=100
本题的思路是用叉积(叉积(水访问量)详见:这里)来求出第4个点与前3个点的位置关系(在顺时针方向,还是逆时针方向,还是在直线中),来判断第四个点和三角形的位置关系
var
x,y:array[1..4]of longint;
i,j,k,ans:longint;
t,w,p,s:double;
z:string;
function try(a,b,c:longint):double;//叉积
begin
try:=abs((x[b]-x[a])*(y[c]-y[a])-(x[c]-x[a])*(y[b]-y[a]))/2;
end;
begin
for i:=1 to 4 do//这里不得不用字符串来做,之前直接用val(z[2],x[i]);val(z[4],y[i]);来取数忽略了个位数以上的情况
begin
readln(z);
delete(z,1,1);
k:=pos(',',z);
val(copy(z,1,k-1),x[i]);
delete(z,1,k);
k:=pos(')',z);
val(copy(z,1,k-1),y[i]);
end;
t:=try(1,2,3);
w:=try(1,2,4);
p:=try(1,3,4);
s:=try(2,3,4);
if w=0 then inc(ans);
if p=0 then inc(ans);
if s=0 then inc(ans);
if w+p+s>t then write(2)
else if ans=0 then write(1)
else if ans=1 then write(3)
else write(4);
end.