Advertisement
Guest User

is poligon task

a guest
Sep 10th, 2021
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.15 KB | None | 0 0
  1. // Тип точка-вектор
  2. type Point = record
  3.   x,y: real;
  4.   class function operator-(p1, p2: Point): Point;
  5.   begin
  6.     Result.x := p1.x - p2.x;
  7.     Result.y := p1.y - p2.y;
  8.   end;
  9. end;
  10.  
  11. // Создание точки
  12. function Pnt(x, y: real): Point;
  13. begin
  14.   Result.x := x;
  15.   Result.y := y
  16. end;
  17.  
  18. // Косое произведение векторов (cross-product)
  19. function cP(p1, p2: Point): real;
  20. begin
  21.   Result := p1.x * p2.y - p1.y * p2.x;
  22. end;
  23.  
  24. begin
  25.   var (x1, y1) := ReadInteger2('Координаты точки A:');
  26.   var a := pnt(x1, y1);
  27.  
  28.   var (x2, y2) := ReadInteger2('Координаты точки B:');
  29.   var b := pnt(x2, y2);
  30.  
  31.   var (x3, y3) := ReadInteger2('Координаты точки C:');
  32.   var c := pnt(x3, y3);
  33.  
  34.   var (x4, y4) := ReadInteger2('Координаты точки D:');
  35.   var d := pnt(x4, y4);
  36.  
  37.   //Найдем координаты векторов AB, BC, CD, AD, а также BD и AC
  38.  
  39.   var ab := b - a;
  40.   var bc := c - b;
  41.   var cd := d - c;
  42.   var ad := d - a;
  43.   var ac := c - a;
  44.   var bd := d - b;
  45.  
  46.   // Вычислим косое произведение для AB и AC, AD
  47.   // Если эти произведения одного знака, то точки лежат по одну сторону от AB
  48.   // Если это будет справедливо для других сторон, то ABCD - выпуклый 4-угольник
  49.  
  50.   if not sign(cP(ab, ac)) = sign(cP(ab, ad)) then
  51.   begin
  52.     println('Невыпуклый');
  53.     exit;
  54.   end;
  55.  
  56.   if not sign(cP(bc, bd)) = sign(cP(bc, Pnt(0,0)-ab)) then
  57.   begin
  58.     println('Невыпуклый');
  59.      exit;
  60.   end;
  61.  
  62.   if not sign(cP(bc, bd)) = sign(cP(bc, Pnt(0,0)-ab)) then
  63.   begin
  64.     println('Невыпуклый');
  65.      exit;
  66.   end;
  67.  
  68.   if not sign(cP(cd, Pnt(0,0)-bc)) = sign(cP(cd, Pnt(0,0)-ac)) then
  69.   begin
  70.     println('Невыпуклый');
  71.      exit;
  72.   end;
  73.  
  74.   if not sign(cP(Pnt(0,0)-ad, Pnt(0,0)-bd)) = sign(cP(cd, Pnt(0,0)-cd)) then
  75.   begin
  76.     println('Невыпуклый');
  77.      exit;
  78.   end;
  79.  
  80.   println('Выпуклый 4-угольник');
  81. end.
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement