Advertisement
Guest User

isPolygon ver.3

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