Детёныши ВП

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Детёныши ВП » Геометрия » Выпуклость многоугольника


Выпуклость многоугольника

Сообщений 1 страница 2 из 2

1

Это программа определяет выпуклый ли многоугольник двумя способами, а также его площадь.

Код:
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)

0

2

var x,y:array [0..10000] of real;
i,n:longint;
p1,p2:boolean;
kp,zl,zr,q,s1,s2,a,b,c,p:real;
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;
    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+abs( (x[i]-x[1])*(y[i+1]-y[1])-(y[i]-y[1])*(x[i+1]-x[1]) )/2;

 
  a:=sqrt(sqr(x[1]-x[i+1])+sqr(y[1]-y[i+1]));
  b:=sqrt(sqr(x[i]-x[i+1])+sqr(y[i]-y[i+1]));
  c:=sqrt(sqr(x[i]-x[1])+sqr(y[i]-y[1]));
  p:=(a+b+c)/2;
 
    s2:=s2+sqrt(p*(p-a)*(p-b)*(p-c));
  end;
  writeln(s1:0:15);
  writeln(s2:0:15);
end.

0


Вы здесь » Детёныши ВП » Геометрия » Выпуклость многоугольника