Помощь - Поиск - Пользователи - Календарь
Полная версия: Ответ на 1-ю уже есть!!!Выпуклость многоугольника.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dogmatic
Проверка выпуклости многоугольника.
Даны координаты n точек (x1, y1), (x2, y2), ..., (xn, yn). Выясните, являются ли они (именно в заданном порядке) вершинами выпуклого многоугольника.

достаточно просто функции.

Решение выложу через 2(ну может 3) дня. 30.11
Dogmatic
Построение выпуклой оболочки.  
На плоскости задано несколько точек. Перечислить вершины многоугольника, являющегося их выпуклой оболочкой, в порядке следования по периметру.
Вообщем обратная задача. (по-моему по-сложнее)
Dogmatic
Хм, вот ответ на 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-ю ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.