Создают ли точки плоскости выпуклый многоугольник - Pascal ABC
Формулировка задачи:
Решение задачи: «Создают ли точки плоскости выпуклый многоугольник»
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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д