Author |
Topic |
|
TuzhibaevTA
Russia
85 Posts |
Posted - 01/18/2005 : 07:46:27
|
Есть много, например, прямоугольников, которые находятся рядом друг с другом по оси Х. Я пытаюсь програмно реализовать следующий сценарий: Я помещаю кривую линию, овал или какую то другую сложную фигуру на эти прямоугольники и их нижние части прилипают к верхней части фигуры или просто к линии, вытягиваясь или стягиваясь, одним словом подстраиваясь под фигуру. Можно такое сделать?
Тужибаев Тимур |
|
immortal
Russia
391 Posts |
Posted - 01/19/2005 : 08:49:31
|
по идее все что можно сделать в ручную, можно сделать и автоматически, алгоритм: вычисляем X прямоугольника, далее вычисляем Y кривой при Х кривой = Х прямоугольника (как сделать последнее незнаю), потом делаем Y прямоугольника = Y кривой, вот и все
остался невыясненным вопрос: как вычислить координату кривой Y при фиксированном Х, т.е вычисление координат в середине кривой
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
|
|
TuzhibaevTA
Russia
85 Posts |
Posted - 01/19/2005 : 08:55:01
|
Я тоже так рассуждал и тоже пришел к этому тупику. :) Я вот думаю, у Visio есть свойство прилипания, можно его какнибудь использовать при решении этой задачи?
Тужибаев Тимур |
|
|
immortal
Russia
391 Posts |
Posted - 01/19/2005 : 15:29:08
|
с коннекторами не выйдет
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 01/19/2005 : 20:58:17
|
В тупиках мысли завихряются, иногда весьма причудливо :) Демонстрирую такой выверт: Считаем, что прямоугольники и кривая фигура известны, то есть их можно селектировать. Имеем право выполнить такую операцию Set sel = ActiveWindow.Selection sel.Trim При этом все селектированное разлетится на мелкие компоненты, непересекающиеся, но соприкасающиеся. Правда это произойдет только в том случаае, когда все прямоугольники достаточно высокие, но это вроде в наших руках... Чтобы их не приходилось собирать по всему документу, хорошо бы предварительно создать специальный слой и непосредственно перед этой операцией назначить его активным. Тогда на этом слое появятся только результаты этой операции и ничего больше. Так как координаты нижних частей прямоугольников нам известны, то среди новых шейпов мы можем вычислить их нижние остатки. Верх определяется либо по секции геометрии, либо непосредственно по высоте шейпа-стакана. Зная верхнюю точку стакана можно даже вычислить прилегающие отрезки режущей кривой. Хоть все три. Если захотим, то можно и склеить средний отрезок со стаканом - получим замкнутый стакан с кривой крышей, но этого вроде не надо... Таким образом мы можем вычислить и сохранить все нужные координаты. Теперь выполняем Visio.Application.Undo и рисунок возвращается в исходное состояние. Причем довольно быстро. После этого берем наш массив с координатами и начинаем менять высоты восстановившихся прямоугольников :)
Конечно, у задачи обязательно должно быть и нормальное решение, но и это интересно :) |
|
|
TuzhibaevTA
Russia
85 Posts |
Posted - 01/20/2005 : 07:13:10
|
quote: Originally posted by Tumanov
В тупиках мысли завихряются, иногда весьма причудливо :) Демонстрирую такой выверт: Считаем, что прямоугольники и кривая фигура известны, то есть их можно селектировать. Имеем право выполнить такую операцию Set sel = ActiveWindow.Selection sel.Trim При этом все селектированное разлетится на мелкие компоненты, непересекающиеся, но соприкасающиеся. Правда это произойдет только в том случаае, когда все прямоугольники достаточно высокие, но это вроде в наших руках... Чтобы их не приходилось собирать по всему документу, хорошо бы предварительно создать специальный слой и непосредственно перед этой операцией назначить его активным. Тогда на этом слое появятся только результаты этой операции и ничего больше. Так как координаты нижних частей прямоугольников нам известны, то среди новых шейпов мы можем вычислить их нижние остатки. Верх определяется либо по секции геометрии, либо непосредственно по высоте шейпа-стакана. Зная верхнюю точку стакана можно даже вычислить прилегающие отрезки режущей кривой. Хоть все три. Если захотим, то можно и склеить средний отрезок со стаканом - получим замкнутый стакан с кривой крышей, но этого вроде не надо... Таким образом мы можем вычислить и сохранить все нужные координаты. Теперь выполняем Visio.Application.Undo и рисунок возвращается в исходное состояние. Причем довольно быстро. После этого берем наш массив с координатами и начинаем менять высоты восстановившихся прямоугольников :)
Конечно, у задачи обязательно должно быть и нормальное решение, но и это интересно :)
Браво :)
Тужибаев Тимур |
|
|
immortal
Russia
391 Posts |
Posted - 01/20/2005 : 11:44:51
|
делаем следующее: прямоугольники делаем в слое 1, линия в слое 2 вычисляем координаты всех прямоугольников нижний правый угол (например) далее чертим прямые, с коорд Х1прямой = Х2прямой = Хпрямоугольника Y1прямой = начало листа Y2прямой = конец листа, делаем прямые в слое 3
теперь мы имеем что все прямые пересекают нашу кривую выделяем все элементы слоя 2 и 3 (т.е. кривую и прямые) далее даем команду Trim потом удаляем все элементы слоя 3 (все наши созданные прямые) в итоге получается что кривая разбита на кривые где Xконца кривой = Хниза прямоугольника задаем циклы если Хниза прямоугольника = Xконца кривой то Yниза прямоугольника = Yконца кривой
вот и все
надеюсь понятно
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
Edited by - immortal on 01/20/2005 11:46:43 |
|
|
|
Topic |
|
|
|