Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Поворот TImage на угол

Автор: Unconnected 11.04.2010 15:49

Привет smile.gif

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

Автор: volvo 11.04.2010 16:15

http://msdn.microsoft.com/en-us/library/dd162977%28VS.85%29.aspx + http://msdn.microsoft.com/en-us/library/dd145104%28VS.85%29.aspx дают аналогичный результат. Можно попробовать установить для канвы TImage желаемую матрицу поворота, и потом перерисовать изображение, находящееся в TImage. по идее оно должно повернуться на заданный матрицей угол.

Хотя для невизуального компонента, каким является TImage - какая бы разница, крутить его самого или изображение, которое в нем находится?

Цитата
Я находил код для поворота битмапа, но сам TImage не поворачивался,
Как ты собственно определил, поворачивался ли у тебя TImage или нет?

Автор: Unconnected 11.04.2010 18:07

Цитата
Хотя для невизуального компонента, каким является TImage - какая бы разница, крутить его самого или изображение, которое в нем находится?


Может, и невизуальный, но ведь можно для него установить Width и Height? В моём понимании TImage все таки имеет форму прямоугольной рамки. Когда пробовал поворачивать битмап, получалось такое:
[attachmentid=8740]

Вот по чёрным областям я и определил.. Да и например когда с ToolPallete кидаю на форму TImage, то он прямоугольный, и повернуть нельзя.

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

Автор: volvo 11.04.2010 18:43

Говорю сразу: крутить компонент нельзя (это чтоб потом не говорил, что много времени потратил, а ничего не получается), можно крутить только содержимое этого компонента.

Цитата
Вот по чёрным областям я и определил..
Если ты нашел неправильный код вращения битмапа - это не значит, что правильного не существует.




Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Unconnected 11.04.2010 18:55

Я находил и правильный, компонент - там получалось так же, как на твоём скрине - но у меня с ним были проблемы небольшие. Но раз компонент крутить нельзя, то как можно сделать "прилипание", т.е. как для картинки узнавать границу соседней картинки, и чтобы она была параллельна границе этой картинки? Может, получать цвет точек и ориентироваться по нему?

Автор: volvo 11.04.2010 19:47

Цитата
Я находил и правильный, компонент - там получалось так же
Я не использую сторонние компоненты. Это одна-единственная процедура. Грести сотни недочетов/багов/недоделок из-за того, что какой-то компонентописатель быстро слабал свое поделие и выбросил его в сеть - мне не очень хочется. Быстрее будет обработать то, что надо, процедурой, и отрисовать заново стандартным компонентом, но потом не думать, что в самый ответственный момент что-нибудь перекосится, где-нибудь зальет не тем цветом, или вообще из-за другой версии Windows вылетит с ошибкой.

Цитата
Может, получать цвет точек и ориентироваться по нему?
Может быть. Не зная, что именно тебе надо, по тем отрывочным сведениям, которые те даешь - я ничего не могу советовать.

Автор: Unconnected 11.04.2010 20:09

Цитата
Это одна-единственная процедура

Я второй раз тоже пробовал процедурой, http://www.delphisources.ru/pages/faq/base/rotate_bitmap2.html
Цитата

Не зная, что именно тебе надо, по тем отрывочным сведениям, которые те даешь - я ничего не могу советовать.


Ну, на форме есть имаджи, их можно таскать мышкой. Нужно, чтобы можно было их поворачивать и комбинировать, например так:
[attachmentid=8742]

Углы поворота имаджей будут равны, или примерно равны..

Автор: volvo 11.04.2010 20:36

В таком случае - это совсем не простая задача. Еще и потому, что:

Прикрепленное изображение
Понимаешь, в чем дело, да? smile.gif "Пустая" часть большого изображения наедет на границу малого изображения раньше, чем эти границы совпадут... Картинка будет искажена. Тут я бы смотрел в сторону чистого WinAPI и регионов (вот регионы-то могут быть любой формы). В крайнем случае - вот это глянь:
http://www.delphisources.ru/pages/faq/base/create_controls_with_any_shape.html
, возможно оно тебя натолкнет еще на какую идею. Меня сразу вот так ни на что, кроме "повернуть изображение как надо, запаковать его в регион - в смысле, отрезать все лишние углы - и работать именно с полученным регионом" не хватило. Подумаю еще, может что и придумается. Единственная проблема - я не помню, чтоб была готовая функция проверки, пересекаются ли 2 региона. А хранить для такого региона еще и его границы в каком-либо виде (и потом проверять, а не совпадает ли какая граница одной области с границей другой) - с ума сойдешь это все обрабатывать... Также надо посмотреть в сторону GDI+, там много чего есть для работы с графикой, может и для твоей задачи чего найдется. Про OpenGL пока даже думать не хочется... Хотя...

Откуда задачка-то? Игру какую-то пишешь? Что-то типа Puzzle?

Автор: Unconnected 13.04.2010 0:35

Цитата
Понимаешь, в чем дело, да?


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

Откуда задачка-то?


Нет, не игру, хотя отдалённо похоже) Это будет заготовка для программы, моделирующей дорожный трафик..