Это программа определяет выпуклый ли многоугольник двумя способами, а также его площадь.
var x,y:array[0..1000]of real;i,n:longint;zl,zr,kp,q,s1,s2:real;p1,p2:boolean;
function pl1(x1,y1,x2,y2,x3,y3:real):real;
begin
pl1:=abs((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))/2;
end;
function pl2(x1,y1,x2,y2,x3,y3:real):real;
var a,b,c,p:real;
begin
a:=sqrt(sqr(x1-x3)+sqr(y1-y3));
b:=sqrt(sqr(x2-x3)+sqr(y2-y3));
c:=sqrt(sqr(x2-x1)+sqr(y2-y1));
p:=(a+b+c)/2;
pl2:=sqrt(p*(p-a)*(p-b)*(p-c));
end;
begin
readln(n);
for i:=1 to n do read(x[i],y[i]);
x[n+1]:=x[1];y[n+1]:=y[1];
x[n+2]:=x[2];y[n+2]:=y[2];
x[0]:=x[n];y[0]:=y[n];
p1:=true;p2:=true;
for i:=1 to n do
begin
zl:=(x[i-1]-x[i])*(y[i+1]-y[i])-(y[i-1]-y[i])*(x[i+1]-x[i]);
zr:=(x[i+2]-x[i])*(y[i+1]-y[i])-(y[i+2]-y[i])*(x[i+1]-x[i]);
if zl*zr<0 then begin p1:=false;break; end;
end;
kp:=(x[1]-x[n])*(y[2]-y[1])-(y[1]-y[n])*(x[2]-x[1]);
for i:=1 to n do
begin
q:=(x[i]-x[i-1])*(y[i+1]-y[i])-(y[i]-y[i-1])*(x[i+1]-x[i]);
if q*kp<0 then begin p2:=false;break; end;
end;
s1:=0;s2:=0;
if p1 then writeln('Yes') else writeln('No');
if p2 then writeln('Yes') else writeln('No');
if not(p1)or not(p2) then halt;
for i:=2 to n-1 do
begin
s1:=s1+pl1(x[1],y[1],x[i],y[i],x[i+1],y[i+1]);
s2:=s2+pl2(x[1],y[1],x[i],y[i],x[i+1],y[i+1]);
end;
writeln(s1:0:15);
writeln(s2:0:15);
end.Отредактировано Санчоус (2011-06-21 13:35:00)