Поиск:

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


Шустрый
*


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

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



Всем привет!! Задача такая: 

user posted image

Есть какой то многоугольник с n-ым количеством вершин(на рисунке это четырехугольник и он красный) все координыты вершин известны. Многоугольник может быть любой формы.
Есть рамка для него(она зеленая) но её координаты не известны.
Нужно найти координаты вершин рамки.
Имено координаты!  Мне не нужно рисовать вокруг многоугольника рамку!


Нашел в инете что многокгольник можно промасштабировать путем умножения его координат на число... Но к сожалению такой мметод смещает многоугольник.
Тоесть выходи от что
user posted image

Поскажите пожалуста каким образом можно многоуольник масштабировать не смещая его.

PS: Если есть у кого есть идеи как можно решить задачу без масштабирования готов внимательно выслушать smile 
PM MAIL   Вверх
Akina
Дата 29.7.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Смести центр начала координат внутрь многоугольника (скажем, в его центр тяжести), смасштабируй (умножением координат на число) и верни начало координат обратно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bitter
Дата 29.7.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Я могу предложить такой алгоритм, но он подходит только для выпуклого многоугольника:

1. Находим центр многоугольника путем средне арифметического всех вершин (Center:TPoint).
2. Для каждой вершины (цикл)
 2.1. Находим вектор:  V.x := Center.x - P[i].x;
                                      V.y := Center.y - P[i].y;
 2.2. Далее вектор нужно нормализовать. V := Normal(V) // Ниже напишу как это сделать
 2.3. Координата вершины контура равна: Contur.P[i].x := P[i].x + V.x * k;
                                                                       Contur.P[i].y := P[i].y + V.y * k;    // Тут k это расстояние в пикселях, на котором нужно получить контур

Код

type
  T2DVector=record        
   x,y:single;
  end;

...

function VectorMagnitude(v: T2DVector) : Single;
begin
 result := sqrt((v.x*v.x) + (v.y*v.y));
end;

function VectorNormalize(v: T2DVector): T2DVector;
var len:single;
begin
 Result:=Vector2D(0,0);
 len:=VectorMagnitude(v);
 if len<>0 then
 begin
  result.x := v.x/len;
  result.y := v.y/len;
 end;
end;


А если Многоугольник невыпуклый, то могу предложить другой алгоритм, но он немного сложнее. Каждую вершину нужно умножать на матрицу
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 29.7.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



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

если нужна одинаковость расстояний, можно пододвинуть каждую сторону рамки в нужном направлении, при этом они перестанут касаться друг друга концами - их нужно будет соединить

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


--------------------
qqq
PM WWW   Вверх
namervasek
Дата 30.7.2009, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Забыл уточнить многоугольник может быть невыпуклым 

Bitter, 
Цитата

А если Многоугольник невыпуклый, то могу предложить другой алгоритм, но он немного сложнее. Каждую вершину нужно умножать на матрицу

Я весь превратился в уши smile 
maxim1000, 
Цитата

можно пододвинуть каждую сторону рамки в нужном направлении

Эм.. а как их подвинуть?? Есть конечно предположение что это можно сделать с помощью перпендикулярного вектора, но на этом моя мысля заканчивается...  smile 


На всякий случай дополню требования....

user posted image

a b c d e -исходные
a1 b1 c1 d1 e1-искомые
Все отрезки aa1 bb1(на рисунке выделены зеленым) и тд должны быть одинаковой длины причем углы при них должны быть одинаковыми. Например у отрезка аа1 угол a1ab должен быть равен углу a1ac 
Рисунок делал в пэинте поэтому он не точен..

Это сообщение отредактировал(а) namervasek - 30.7.2009, 01:59
PM MAIL   Вверх
Bitter
Дата 30.7.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Блин, как правильно сказал maxim1000, умножение на матрицу не даст желаемого результата. Так как рамка не будет на одинаковом расстоянии. Но думаю что-то придумать можно. Только меня смутило вот что: 

Цитата

Все отрезки aa1 bb1(на рисунке выделены зеленым) и тд должны быть одинаковой длины


Дело в том, что в случае невыпуклого многоугольника это невозможно. Вот смотри

user posted image

Если соблюдать одинаковое расстояние от вершин, то рамка не будет повторять контур фигуры. А если повторять контур фигуры, то расстояние от вершин будет разным. Так что реши что нужно.
PM MAIL ICQ Skype   Вверх
namervasek
Дата 30.7.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Если соблюдать одинаковое расстояние от вершин, то рамка не будет повторять контур фигуры. А если повторять контур фигуры, то расстояние от вершин будет разным. Так что реши что нужно. 


 smile  че то я об этом не подумал....  
Нужно повторять контур фигуры smile 
PM MAIL   Вверх
kamre
Дата 30.7.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxim1000 @ 29.7.2009,  22:15)
чтобы сохранить одинаковость расстояния, соединять нужно дугами окружностей, чтобы сохранить "многоугольность", наверное, стоит просто продлевать их до пересечения (в случае невыпуклого многоугольника, возможно, придётся укорачивать...

А когда начинаются самопересечения для невыпуклого многоугольника, как например вот здесь:
user posted image
что делать?
PM MAIL   Вверх
maxim1000
Дата 30.7.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



Цитата(kamre @  30.7.2009,  16:02 Найти цитируемый пост)
А когда начинаются самопересечения для невыпуклого многоугольника

тогда начинаются проблемы smile

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

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

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

вообще, по идее, на тему логических (булевских) операций должно быть немало документов а Интернете...


--------------------
qqq
PM WWW   Вверх
kamre
Дата 30.7.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxim1000 @ 30.7.2009,  20:29)
при "расширении" некоторых невыпуклых многоугольников могут получаться фигуры с дырками (пример - буква "С" с близкими концами)

Да, для дуги тоже есть проблема:
user posted image
Как можно искать внешнюю границу для такого случая?

Цитата(maxim1000 @ 30.7.2009,  20:29)
в других случаях нужно будет найти внешнюю границу многоугольника
для этого можно избавиться от пересекающихся отрезков (просто разбить их на части в точках пересечения), а потом выкинуть те, которые невнешние

На словах вроде понятно. А вот ссылки на конкретные алгоритмы были бы весьма полезны...
PM MAIL   Вверх
maxim1000
Дата 30.7.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



что-то не так много документации, как я ожидал...
можно попробовать поискать алгоритмы объединения/пересечения полигонов - там, по сути, тот же функционал используется, только разные отрезки остаются в результате...


--------------------
qqq
PM WWW   Вверх
Bitter
Дата 31.7.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Вот что у меня получилось: 
user posted image

Тока код на делфи. Закоменчу и выложу. Надо еще добавить проверку на самопересечение
PM MAIL ICQ Skype   Вверх
Bitter
Дата 31.7.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Вот исходники и exe

Тока проверку я не добавил, так как на работе времени мало

Присоединённый файл ( Кол-во скачиваний: 84 )
Присоединённый файл  Border.rar 172,16 Kb
PM MAIL ICQ Skype   Вверх
namervasek
Дата 31.7.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спс задачу решил
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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