题目描述
判断一个点与已知三角形的位置关系。
输入输出格式
输入格式:前三行:每行一个坐标,表示该三角形的三个顶点
第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系
(详见样例)
所有坐标值均为整数。
输出格式:
若点在三角形内(不含边界),输出1;
若点在三角形外(不含边界),输出2;
若点在三角形边界上(不含顶点),输出3;
若点在三角形顶点上,输出4。
说句题外话:看到这个名字我就笑了,神♂秘DARK三♂角。。。。。
好啦!回归正题,这道题其实我只有80分,还是很不要脸地放上去了,我真的改不下去了!!!
我的想法就是看看能不能用叉积判断某点与两边的关系,但是要找到离原点最近的一点,这样就
很棒了!因为相对于两边一点而言,显然要是两直线与点叉积+-号不同,就可以知道是在中间,
即点在三角形内,要是同号就在之外了。但是我发现题解上没有一个人和我想得一样,好伤啊……
而且一定有BUG!!!!不然早就AAAAA了!!!!
var
x,y:array[0..4]of longint;
xx,yy,i,j,l1,f1,m1,m2,maxn,t1,t2:longint;
s:string;
begin
maxn:=1;
for i:=1 to 4 do
begin
readln(s);
begin
f1:=pos(',',s);
l1:=length(s);
maxn:=1;
for j:=f1-1 downto 2 do begin
x[i]:=x[i]+maxn*(ord(s[j])-48);
maxn:=maxn*10;
end;maxn:=1;
for j:=l1-1 downto f1+1 do begin
y[i]:=y[i]+maxn*(ord(s[j])-48);
maxn:=maxn*10;
end;
end;
end;
for i:=1 to 3 do
for j:=i to 3 do
begin
if x[i]>x[j] then begin
t1:=x[j];
x[j]:=x[i];
x[i]:=t1;
t2:=y[j];
y[j]:=y[i];
y[i]:=t2;
end;
if x[i]=x[j]then if y[i]>y[j] then
begin
t1:=x[j];
x[j]:=x[i];
x[i]:=t1;
t2:=y[j];
y[j]:=y[i];
y[i]:=t2;
end;
end;
m1:=(x[2]-x[1])*(y[4]-y[1])-(x[4]-x[1])*(y[2]-y[1]);
m2:=(x[3]-x[1])*(y[4]-y[1])-(x[4]-x[1])*(y[3]-y[1]);
if ((x[4]=x[1])and(y[4]=y[1]))or((x[4]=x[2])and(y[4]=y[2]))or
((x[4]=x[3])and(y[4]=y[3]))then begin
write('4');
halt;
end;
if (m1<0)and(m2>0)then begin
write('1');
halt;
end;
if (m1=0)or(m2=0)then
begin
write('3');
halt;
end;
if ((m1<0)and(m2<0))or((m1>0)and(m2>0))then begin
write('2');
halt;
end;
{ for i:=1 to 4 do writeln(x[i],y[i]);
writeln(f1,l1); }
end.