Проверка выпуклости многоугольника. Даны координаты 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 := 0elseif (signedDoubledArea > 0) then
orientation := 1else
orientation := -1;
end;
(*
* Проверяем условие локальной выпуклости.
*)function isLocalConvex(var p: arrayof point): boolean;
var o, i: integer;
begin
o := orientation(p[0], p[1], p[2]);
if (o = 0) then
isLocalConvex := false
elsebegin
isLocalConvex := true;
for i := 1to high(p) doif (o <> orientation(p[i],
p[(i + 1) mod (high(p) + 1)],
p[(i + 2) mod (high(p) + 1)])) thenbegin
isLocalConvex := false;
break;
end;
end;
end;
(*
* Проверяем условие глобальной выпуклости.
*)function isGlobalConvex(var p: arrayof point): boolean;
var counter, i: integer;
begin(*
* Это счетчик количества перемен направления движения с "вверх" на "вниз".
*)
counter := 0;
isGlobalConvex := true;
for i := 0to high(p) doif ((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)) thenbegin
inc(counter);
if (counter = 2) thenbegin
isGlobalConvex := false;
break;
end;
end;
end;
(*
* Проверка того, что данная ломаная -- выпуклый многоугольник,
* состоит в последовательной проверке условий локальной и глобальной
* выпуклости.
*)function isConvex(var p: arrayof point): boolean;
begin
isConvex := isLocalConvex(p) and isGlobalConvex(p);
end;
Может это поможет кому-нибудь решить 2-ю ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.