大意:给出三角形的三个顶点,求点X在其的内外还是边界上。
入门题,看程序吧。
program p1523;
type
point=record
x,y:double;
end;
vector=point;
Var
a,b,c,x:point;
ans:longint;
procedure readpoint(var p:point);
var
s:string;
code:longint;
begin
readln(s);
val(copy(s,2,pos(',',s)-2),p.x,code);
val(copy(s,pos(',',s)+1,length(s)-pos(',',s)-1),p.y,code);
//writeln('(',p.x,',',p.y,')');
end;
function minus(a,b:point):vector;begin with minus do begin x:=a.x-b.x;y:=a.y-b.y; end; end;
function max(a,b:double):double;begin if a>b then exit(a);exit(b); end;
function min(a,b:double):double;begin if a<b then exit(a);exit(b); end;
procedure getans(P:longint);begin if ans=0 then ans:=p; end;
function cross(a,b:vector):double;begin exit(a.x*b.y-a.y*b.x); end;
function pinline(p,a,b:point):boolean;begin exit((p.x>=min(a.x,b.x)) and (p.x<=max(a.x,b.x))); end;
function equal(a,b:vector):boolean;begin exit((a.x=b.x) and (a.y=b.y)); end;
begin
readpoint(a);
readpoint(b);
readpoint(c);
readpoint(x);
ans:=0;
if equal(x,a) or equal(x,b) or equal(x,c) then getans(4);
if cross(minus(b,a),minus(x,a))=0 then
if Pinline(x,a,b) then getans(3) else getans(2);
if cross(minus(c,a),minus(x,a))=0 then
if Pinline(x,a,c) then getans(3) else getans(2);
if cross(minus(c,b),minus(x,b))=0 then
if Pinline(x,b,c) then getans(3) else getans(2);
if (cross(minus(b,a),minus(x,a))*cross(minus(b,a),minus(c,a))>0) and (cross(minus(c,a),minus(x,a))*cross(minus(c,a),minus(b,a))>0) and (cross(minus(c,b),minus(x,b))*cross(minus(c,b),minus(a,b))>0) then getans(1) else getans(2);
writeln(ans);
end.