Это программа определяет выпуклый ли многоугольник двумя способами, а также его площадь.
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)