Advertisement
Laster_Alex

Z7

Feb 26th, 2022
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.76 KB | None | 0 0
  1. var a, b, ax, ay, bx, by, first_angle, angle: real;
  2. var i, j: integer;
  3. var lst: array[0..65535] of real;
  4. var second_point: array[0..1] of real;
  5. var is_equal: boolean;
  6. begin
  7.     read(a, b);
  8.  
  9.     while (a<>0) or (b<>0) do begin
  10.         lst[i] := a;
  11.         lst[i+1] := b;  // Записываем координаты точек таким образом, что каждый чётный индекс - первая координата точек, а каждая нечётная - вторая.
  12.         read(a, b);
  13.         i := i + 2;
  14.     end;    
  15.     if i > 6 then begin  // Иначе 100% фигура вписанная
  16.         second_point[0] := lst[2];
  17.         second_point[1] := lst[3];  // Берём вторую по счёту
  18.         j := 4;
  19.         while j < i do begin  // По сути цикл for с шагом в 2.
  20.             if (sqrt(sqr(lst[0]-lst[j])+sqr(lst[1]-lst[j+1])) < sqrt(sqr(lst[0]-second_point[0])+sqr(lst[1]-second_point[1]))) then begin
  21.             // Если расстояние от текущей точки до первой меньше того расстояния, которое раньше считалось наименьшим, то...
  22.                 second_point[0] := lst[j];  // ... заменить наименьшее расстояние
  23.                 second_point[1] := lst[j+1];
  24.             end;
  25.             j := j + 2;
  26.         end;
  27.        
  28.         ax := lst[0]-lst[2];  
  29.         ay := lst[1]-lst[3];  
  30.         bx := lst[2]-second_point[0];  
  31.         by := lst[3]-second_point[1];  
  32.         if (bx=0) and (by=0) then begin  // Если вдруг second_point это та же самая точка, что и точка под номером 2,
  33.         // то ниже будет деление на ноль, так что для первого угла, который мы будем сравнивать, возьмём третью точку.
  34.             ax := lst[0]-lst[4];  
  35.             ay := lst[1]-lst[5];
  36.             bx := lst[4]-second_point[0];
  37.             by := lst[5]-second_point[1];
  38.         end;
  39.         a := sqrt(sqr(ax)+sqr(ay));
  40.         b := sqrt(sqr(bx)+sqr(by));
  41.         first_angle := (ax*bx+ay*by)/(a*b);  // Сравнивать можно не углы, а сразу сами косинусы.
  42.         first_angle := round(first_angle*1000)/1000;  // Округление, так как может быть загвоздка вроде -1 != -0.9999999999999999997
  43.        
  44.         j := 2;
  45.         is_equal := True;
  46.         while j < i do begin  // Опять цикл с шагом в 2
  47.             if (lst[j] <> second_point[0]) or (lst[j+1] <> second_point[1]) then begin  // Если точка не есть вторая точка, то...
  48.                 ax := lst[0]-lst[j];  // Проекция a на ось x
  49.                 ay := lst[1]-lst[j+1];  // Проекция a на ось y
  50.                 bx := lst[j]-second_point[0];  // Проекция b на ось x
  51.                 by := lst[j+1]-second_point[1];  // Проекция b на ось y
  52.                 a := sqrt(sqr(ax)+sqr(ay));
  53.                 b := sqrt(sqr(bx)+sqr(by));
  54.                 angle := (ax*bx+ay*by)/(a*b);
  55.                 angle := round(angle*1000)/1000;
  56.                 is_equal := is_equal and (
  57.                     angle = first_angle  // Если хоть один раз это условие провалится, то is_equal будет False до конца.
  58.                 );
  59.             end;
  60.             j := j + 2;
  61.         end;
  62.         if is_equal then writeln('Лежат на одной окружности.')
  63.         else writeln('Не лежат на одной окружности.');
  64.     end
  65.     else writeln('Лежат на одной окружности.');
  66. end.
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement