Создают ли точки плоскости выпуклый многоугольник - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Создают ли точки плоскости, координаты которых хранятся в двух массивах, выпуклый многоугольник.
Помогите. Это срочно. Вопрос жизни и отчисления

Решение задачи: «Создают ли точки плоскости выпуклый многоугольник»

textual
Листинг программы
const m = 100; {пусть максимально будет стоугольник}
 
var x, y: array [1..m] of real; {массивы координат по x и y}
    {счётчик, количество точек, сумма знаков векторного произведения, номера трёх текущих точек (стек LIFO)}
    i, n, q, t1, t2, t3: integer;
    vprod: real; {векторное произведение}
 
begin
  repeat {ввод количества вершин}
    write('Количество вершин в интервале [4..', m, ']: ');
    readln(n)
  until n in [4..m];
  {меньше 4 не имеет смысла, больше m=100 руки отсохнут иксы и игреки вводить}
  writeln('Введите координаты вершин в порядке их обхода по линии сторон:');
  for i := 1 to n do {ввод координат точек}
    begin
      write('x', i, ' = '); {по x}
      readln(x[i]);
      write('y', i, ' = '); {по y}
      readln(y[i])
    end;
  q := 0; {сумма знаков векторных произведений, пока равна 0}
  {предварительная установка номеров точек}
  t2 := n - 1; {номер второй точки}
  t3 := n; {номер третьей точки}
  for i := 1 to n do {вычисление суммы знаков векторного произведения}
    begin
      t1 := t2; {сдвигаем вторую точку на место первой}
      t2 := t3; {сдвигаем третью точку на место второй}
      t3 := i; {номер третьей точки}
      {вычисляем координаты векторов, построенных на 2, 1 и 3, 2 точках}
      {(это то, что в скобках), и находим величину векторного произведения (все остальные действия)}
      vprod := (x[t2] - x[t1]) * (y[t3] - y[t2]) - (x[t3] - x[t2]) * (y[t2] - y[t1]);
      if vprod > 0 {если векторное произведение положительно}
        then inc(q) {то сумма знаков +1}
        else if vprod < 0 {иначе, если векторное произведение отрицательно}
          then dec(q) {то сумма знаков -1}
      {а если векторное произведение равно 0, то ничего с суммой знаков не делаем}
      {это случай, когда три точки расположены на одной прямой,}
      {тогда многоугольник выпуклым считать не следует}
    end;
  write('Многоугольник ');
  {если все векторные произведения были одного знака, то сумма знаков}
  {будет либо +n, либо -n, то есть, абсолютная величина суммы знаков}
  {должна быть равна количеству вершин, тогда выпуклый}
  if abs(q) < n then write('не '); {если модуль суммы знаков меньше количества вершин, то не выпуклый}
  write('выпуклый.');
  readln
end.

Объяснение кода листинга программы

const
m = 100; var x, y: array [1..m] of real; i, n, q, t1, t2, t3: integer; vprod: real; begin repeat write('Количество вершин в интервале [4..', m, ']: '); readln(n) until n in [4..m]; writeln('Введите координаты вершин в порядке их обхода по линии сторон:'); for i := 1 to n do begin write('x', i, ' = '); readln(x[i]); write('y', i, ' = '); readln(y[i]); end; q := 0; {сумма знаков векторных произведений, пока равна 0} t2 := n — 1; t3 := n; for i := 1 to n do begin t1 := t2; t2 := t3; t3 := i; vprod := (x[t2] — x[t1]) (y[t3] — y[t2]) — (x[t3] — x[t2]) (y[t2] — y[t1]); if vprod > 0 then inc(q) else if vprod < 0 then dec(q) else q := 0; end; write('Многоугольник '); if abs(q) < n then write('не ') write('выпуклый.'); readln; end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.5 из 5
Похожие ответы