|
Поворот фигуры
|
|||
---|---|---|---|
#18+
Здравствуйте. Если кто работал в графических редакторах, например, Corel Draw, то обратил внимание что при повороте фигуры меняются его габариты, т.е изменаются габаритная ширина и длина. Если кто не работал, то поясню. Возьмем например обычный прямоугольник. Если его повернуть на определенный угол, то габаритная рамка вокруг этого прямоугольника меняет свои длину и ширину. Я сделал небольшой макрос для Corel Draw который вращает фигуру в диапазоне от 0 до 360 градусов и ищет наименьшую ширину габаритной рамки. Если фигура сложная то тратится некоторое время на перерисовку фигуры. Можно ли вычислить угол, на который нужно повернуть фигуру , чтобы габаритная рамка имела наименьшую ширину? Вопрос конечно больше математический, но может кто сталкивался ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 12:33 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
Damir_85, это действительно вопрос математический, что-то из раздела дискретной математики и аналитической геометрии. За оптимальность не поручусь, но, по ощущениям, можно сделать так: - представляем фигуру в виде конечного множества точек (вершин); - строим выпуклую оболочку ( convex hull ), например, методом Quickhull, и далее работаем с ней, а не с исходной фигурой; - выбираем стартовую вершину и направление обхода (т. е. порядок перебора граней); - берём стартовое значение минимума ширины габаритной рамки как заведомо большое число. Далее цикл: - осуществляем поворот и параллельный перенос выпуклой оболочки таким образом, чтобы текущая вершина попадала в начало координат (или хотя бы на ось ординат), следующая вершина лежала на оси ординат (т. е. текущая грань лежала на оси ординат); - вычисляем максимальное удаление остальных вершин выпуклой оболочки от оси ординат (максимум X по модулю). Это будет ширина габаритной рамки для текущей грани. Если эта ширина меньше текущего минимума ширины габаритной рамки, запоминаем её как минимум, запоминаем угол поворота; - переходим к следующей вершине (и грани) в выбранном направлении обхода. Короче, лабораторная работа для студента 3-го курса специальности "Прикладная математика". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 14:49 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
13-й квартал, Я в принципе так сделал (здесь код для VBA в Corel Draw и это пока набросок кода но он рабочий) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
В принципе код работает быстро, только когда сложные изображения бывает доходит до 10 сек и выше, поэтому я подумал нельзя ли сразу вычислить). Еще что можно добавить в код, чтобы меньше тратить время на повороты и сравнения значений, это запоминать в переменной типа множество симметричные углы. Например при повороте на 45 градусов и на 135 градусов получается одна и та же ширина. Я думаю Ваш алгоритм будет полезен когда все функции поворота надо прописывать вручную. В Corel Draw просто уже автоматически встроены функции поворота и соотвественно сразу можно узнать через св-ва размеры габаритной рамки ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 16:08 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
Damir_85при повороте на 45 градусов и на 135 градусов получается одна и та же ширинаТогда вам достаточно проанализировать только половину окружности (до 179). Предположу также, что на осесимметричных фигурах - досточно анализировать только первую четверть (до 89). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 17:14 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
AndreTM, да, кстати, я пробовал этот вариант использовать только половину круга. Я эксперементировал с различными сложными фигурами и с некоторыми фигурами получилось вот что: если, например, используя диапазон (0..180) вращать против часовой стрелки , то находим определенное минимальное значение. Обозначим его A (ширина рамки). Если же вращать по часовой стрелки, то находим минимальное значение B, которое меньше A. Для других сложных фигур все может быть наоборот, так что приходится использовать от 1 до 360 градусов. А насчет симметрии я имею ввиду отсекать те симметричные углы которые не дали меньшего значения габарита чем текущий. А что касается осевой симметрии, то это надо получается как то определять что фигура имеет осевую сииметрию, т.к фигуры могуть быть какой угодно формы) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2013, 18:35 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
авторна перерисовку фигуры. для ускорения расчёта, надеюсь, отключаете перерисовку экрана ? ps просто мысль - если считать самому, то в полярной системе координат решить будет проще. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2013, 09:02 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
_Дмит_, я вот незнаю есть ли в Corel Draw возможность отключения перерисовки, там просто все функции уже встроены и например при вызове метода Объект.Rotate [Градус] автоматически происходит перерисовка фигуры и ее поворот да кстати насчет полярной не думал можно в принципе попробовать все сначала без фактического поворота просчитать каждый угол и размер , при этом не будет тратится время на перерисовку ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2013, 07:46 |
|
Поворот фигуры
|
|||
---|---|---|---|
#18+
Ни когда не работал с Corel Draw, попробуйте как в Excel'e Application.ScreenUpdating = False ... Ваш цикл по повороту и расчёту ... Application.ScreenUpdating = True и справка Вам в помощь. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2013, 11:56 |
|
|
start [/forum/topic.php?fid=60&fpage=56&tid=2156878]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 140ms |
0 / 0 |