Учебно-методическое пособие. Алматы, 2017 ббк



бет99/106
Дата03.01.2022
өлшемі483.39 Kb.
#451845
түріУчебно-методическое пособие
1   ...   95   96   97   98   99   100   101   102   ...   106
УЧЕБНИКПаскаль(100217)

3.3.1 Многоугольники



Выпуклость многоуголника

Многоугольник (на плоскости), геометрическая фигура, ограниченная замкнутой ломаной линией, без самопересечений. Звенья ломаной линии называются сторонами многоугольника, а их концы — вершинами многоугольника. По числу вершин различают треугольники, четырехугольники и т. д. Многоугольник называется выпуклым, если он весь лежит по одну сторону от прямой, несущей любую из его сторон, и невыпуклым — в противном случае (Рис 3.5).


Рис 3.5
Попробуем написать программу, которая определяет выпуклый многоугольник или нет. Пусть координаты вершин треугольника заданы в порядке обхода его по часовой стрелке. Основываясь на определении выпуклости многоугольника, можно было бы предложить следующее решение:



  1. Определить уравнение прямой, проходящей через первую сторону.

  2. Определить лежат ли все остальные вершины многоугольника правее относительно прямой (см. рис 3.1).

  3. Если «ДА», то определяем уравнение прямой, проходящей через следующую сторону и преходим на пункт 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;



Достарыңызбен бөлісу:
1   ...   95   96   97   98   99   100   101   102   ...   106




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет