Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение направления обхода, обход вершин многоугольника 
:(
    Опции темы
harper
Дата 8.10.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



Многоугольник задан своими вершинами расположенными в порядке их следования, каким образом можно определить направление обхода вершин при построении многоугольника (по часовой или против часовой стрелки)?
PM MAIL   Вверх
MBo
Дата 8.10.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



Если многоугольник выпуклый, то посчитать векторное (косое, Cross Product) произведение для пары векторов, образованных тремя последовательными точками. Знак его укажет на направление обхода
PM MAIL   Вверх
harper
Дата 8.10.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



может быть и невыпуклым
PM MAIL   Вверх
SparF
Дата 8.10.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



MBo, а можешь подробнее?


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
MBo
Дата 8.10.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



SparF 

Код

function Vec(P1, P2: TPoint): TPoint;
begin
  Result.X := P2.X - P1.X;
  Result.Y := P2.Y - P1.Y;
end;

function Cross(Vec1, Vec2: TPoint): Integer;
begin
  Result := Vec1.X * Vec2.Y - Vec1.Y * Vec2.X;
end;

procedure TForm9.Button2Click(Sender: TObject);
var
  Pts: array[0..3] of TPoint;
  i: Integer;
begin
  Pts[0] := Point(0, 0);
  Pts[1] := Point(0, 100);
  Pts[2] := Point(100, 100);
  Pts[3] := Point(100, 0);
  if Cross(Vec(Pts[0], Pts[1]), Vec(Pts[1], Pts[2])) < 0 then
    Caption := 'Anti - Clockwise in Screen coordinate system (left)'
  else
    Caption := 'Clockwise  in Screen coordinate system (left)'
end;


Добавлено @ 10:19 
harper
>может быть и невыпуклым 

От центра одного из отрезков направить влево (по его ходу) перпендикулярно отрезку луч, посчитать количество пересечений со сторонами. Четность этого количества (надо не забыть правильно учитывать возможные попадания точно в углы и совпадения луча со сторонами) будет свидетельствовать о направлении обхода (Это использование одного из алгоритмов PointInPolygon)

PM MAIL   Вверх
harper
Дата 8.10.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



MBo, а ссылки на более подробное описание есть?
PM MAIL   Вверх
SparF
Дата 8.10.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



MBo, понял) спасибо)))


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
MBo
Дата 8.10.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



О, еще один способ вспомнил ;)
Посчитать ориентированную площадь (в примере - удвоенная считается) и посмотреть ее знак

Код

function PolygonDoubledArea(const Pts: array of TPoint): Integer;
var
  i, last : Integer;
begin
  Result := 0;
  last := High(Pts);
  for i := 0 to High(Pts) do begin
    Result := Result + ((Pts[last].x * Pts[i].y) - (Pts[last].y * Pts[i].x));
    last := i;
  end;
end;


Это сообщение отредактировал(а) MBo - 8.10.2006, 11:30
PM MAIL   Вверх
harper
Дата 8.10.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



MBo, это для невыпуклого многоугольника подходит? 
PM MAIL   Вверх
SparF
Дата 8.10.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



MBo, а как подсчитать площадь для произвольного многоугольника?

я в свое время делал через статистическое моделирование:
"стрелял" с равномерным распределением  по площади прямоугольника, который описывает этот произвольный многоугольник, и считал сколько попал/не попал в произвольный.
есть ли что-нть более быстрое?

PS кому надо - могу исходник выложить

Это сообщение отредактировал(а) SparF - 8.10.2006, 12:02


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
MBo
Дата 8.10.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



harper
>
Цитата


это для невыпуклого многоугольника подходит?  

Да

Добавлено @ 12:08 
SparF
>а как подсчитать площадь для произвольного многоугольника?
Код я привел,  для получения площади нужно модуль результата пополам разделить, вычисления в вещественную арифметику при необходимости перевести. 

Работает и с невыпуклыми.

PM MAIL   Вверх
SparF
Дата 8.10.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



MBo,
а можешь картинку дать какие площади он считает на произвольном многоугольнике при помощи
Цитата(MBo @  8.10.2006,  11:30 Найти цитируемый пост)
Result := Result + ((Pts[last].x * Pts[i].y) - (Pts[last].y * Pts[i].x));

если это, конечно, можно нарисовать
или ссылочку где это выводится
буду оч благодарен - просто понять для себя хочу (запоминать просто так бесполезно)


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
MBo
Дата 8.10.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 5
Всего: 18



SparF
Математически - алгоритм следует из формулы Грина (связь между  интегралом по контуру и заключенной в нем площадью), но это, наверно, слишком сложно.
http://mathworld.wolfram.com/GreensTheorem.html

Каждая величина в скобках - удвоенная площадь треугольника, составленного из двух последовательных точек и начала координат. 
Модуль векторного произведения есть произведение длин исходных векторов на синус угла между ними 
Если взять на коорд. плоскости 3 точки A B C, то площадь треугольника ABC есть сумма ориентированных площадей треугольников OAB, OBC, OCA. Общие фрагменты вычтутся.



Это сообщение отредактировал(а) MBo - 8.10.2006, 13:52
PM MAIL   Вверх
SparF
Дата 8.10.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



MBo,
Пасибо)) просто не представляешь насколько это полезная для меня инфа =)

Это сообщение отредактировал(а) SparF - 8.10.2006, 14:25


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1016 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.