Проверка выпуклости многоугольника. Даны координаты n точек (x1, y1), (x2, y2), ..., (xn, yn). Выясните, являются ли они (именно в заданном порядке) вершинами выпуклого многоугольника.
достаточно просто функции.
Решение выложу через 2(ну может 3) дня. 30.11
Dogmatic
1.12.2002 0:18
Построение выпуклой оболочки. На плоскости задано несколько точек. Перечислить вершины многоугольника, являющегося их выпуклой оболочкой, в порядке следования по периметру. Вообщем обратная задача. (по-моему по-сложнее)
Dogmatic
4.12.2002 21:38
Хм, вот ответ на 1-ю задачу:
type point = record x, y: integer; end;
(* * Эта функция вычисляет ориентацию треугольника. * Разные ориентации дают ответы 1 и -1, ответ 0 * означает, что треугольник вырожден. *) function orientation(A, B, C: point): integer; var signedDoubledArea: integer; begin signedDoubledArea := A.x * B.y - A.y * B.x + B.x * C.y - B.y * C.x + C.x * A.y - C.y * A.x;
if (signedDoubledArea = 0) then orientation := 0 else if (signedDoubledArea > 0) then orientation := 1 else orientation := -1; end;
(* * Проверяем условие локальной выпуклости. *) function isLocalConvex(var p: array of point): boolean; var o, i: integer; begin o := orientation(p[0], p[1], p[2]); if (o = 0) then isLocalConvex := false else begin isLocalConvex := true; for i := 1 to high(p) do if (o <> orientation(p[i], p[(i + 1) mod (high(p) + 1)], p[(i + 2) mod (high(p) + 1)])) then begin isLocalConvex := false; break; end; end; end;
(* * Проверяем условие глобальной выпуклости. *) function isGlobalConvex(var p: array of point): boolean; var counter, i: integer; begin (* * Это счетчик количества перемен направления движения с "вверх" на "вниз". *) counter := 0; isGlobalConvex := true;
for i := 0 to high(p) do if ((p[i].y <= p[(i + 1) mod (high(p) + 1)].y) and (p[(i + 1) mod (high(p) + 1)].y > p[(i + 2) mod (high(p) + 1)].y)) then begin inc(counter); if (counter = 2) then begin isGlobalConvex := false; break; end; end; end;
(* * Проверка того, что данная ломаная -- выпуклый многоугольник, * состоит в последовательной проверке условий локальной и глобальной * выпуклости. *) function isConvex(var p: array of point): boolean; begin isConvex := isLocalConvex(p) and isGlobalConvex(p); end;
Может это поможет кому-нибудь решить 2-ю ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.