Выпуклость многоуголника
Многоугольник (на плоскости), геометрическая фигура, ограниченная замкнутой ломаной линией, без самопересечений. Звенья ломаной линии называются сторонами многоугольника, а их концы — вершинами многоугольника. По числу вершин различают треугольники, четырехугольники и т. д. Многоугольник называется выпуклым, если он весь лежит по одну сторону от прямой, несущей любую из его сторон, и невыпуклым — в противном случае (Рис 3.5).
Рис 3.5
Попробуем написать программу, которая определяет выпуклый многоугольник или нет. Пусть координаты вершин треугольника заданы в порядке обхода его по часовой стрелке. Основываясь на определении выпуклости многоугольника, можно было бы предложить следующее решение:
Определить уравнение прямой, проходящей через первую сторону.
Определить лежат ли все остальные вершины многоугольника правее относительно прямой (см. рис 3.1).
Если «ДА», то определяем уравнение прямой, проходящей через следующую сторону и преходим на пункт 2, если «НЕТ» выходим из подпрограммы.
Выполняем пункты 2 и 3, пока не просмотрены все стороны.
Однако такой подход достаточно трудоемкий. Можно поступить проще. Оказывается, необязательно просматривать все точки. Достаточно определить положение только вершины следующей за рассматриваемой стороной.
Procedure Work;
Var
i: integer;
Begin
{вводим дополнительно две фиктивные точки, для облегчения записи цикла}
x[N+1]:=x[1];
y[N+1]:=y[1];
x[N+2]:=x[2];
y[N+2]:=y[2];
Rezalt:=’YES’;
i:=1;
{организуем цикл, пока не просмотренны все стороны или получен отрицательный результат}
While (i
Begin
{определяем коэффициенты уравнения прямой, проходящей через рассматриваемую сторону}
а:= y[i+1]- y[i];
b:= x[i]- x[i+1];
c:= -x[i]*(y[i+1]- y[i])+ y[i]*(x[i+1]- x[i]);
{определяем, не лежит ли следующая вершина левее прямой, если да то результат изменяется и происходит выход из цикла}
if (a*x[i+2]+b*y[i+2]+c)>0 then Rezalt:=’NO’;
{увеличиваем счетчик на единицу, для рассмотрения следующей стороны}
i:=i+1;
End;
End;
Достарыңызбен бөлісу: |