Как поворачивать Label или Picture Box

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика

Как поворачивать Label или Picture Box

Сообщение Rostik Ultra (2) » 10.05.2005 (Вт) 6:00

Как поворачивать Label или Picture Box на определённый угол ?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.05.2005 (Вт) 6:30

Как это не прискорбно, но никак. по крайней мере я такого способа не знаю. надо брать другой контрол
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.05.2005 (Вт) 9:32

А, солидный дядька вернулся? :lol: :lol:
Rostik, где незасвеченный айпишник надыбал? ;-)
Изображение

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 10.05.2005 (Вт) 17:52

tyomitch

Хех.. Мало ли проксей!
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика

Сообщение Rostik Ultra (2) » 11.05.2005 (Ср) 1:57

!Viper! писал(а):Как это не прискорбно, но никак. по крайней мере я такого способа не знаю. надо брать другой контрол


У меня есть пример , только получается медленно ( юзай прикреплённый файл )

У кого какие соображения по теме ??
Вложения
RotatePicture.zip
Крутилка картиеок
(47.66 Кб) Скачиваний: 68

Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика

Сообщение Rostik Ultra (2) » 11.05.2005 (Ср) 2:01

tyomitch писал(а):А, солидный дядька вернулся? :lol: :lol:
Rostik, где незасвеченный айпишник надыбал? ;-)


Здарова !!

Вот ссылка на форум , там есть большой список проксей

http://hardwarezone.fastbb.ru/re.pl?2-00000012-000-0-0-0-1104417786-0

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.05.2005 (Сб) 14:30

Дык есть разница между поворотом КОНТРОЛА и поворотом его содержимого. Код посморю, подумаю
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.05.2005 (Чт) 17:58

Первый вариант должен работать очень быстро, но есть проблема с функцией SetWorldTransform. У меня она почему то выдет ошибку
Код: Выделить всё

Private Sub Rotate3()
    picTwo.Cls
    picOne.ScaleMode = vbPixels
    picTwo.ScaleMode = vbPixels
    'угол поворота в радианах
    Dim da As Double: da = HScroll1.Value * pi / 180
    'матрица преобразования
    Dim XF As XFORM
    XF.eM11 = Cos(da)
    XF.eM12 = Sin(da)
    XF.eM21 = -Sin(da)
    XF.eM22 = Cos(da)
    'устанавливаем расширенный графический режим
    SetGraphicsMode picTwo.hdc, GM_ADVANCED
    'поворачиваем мир на нужный угол
    Dim r As Long: r = SetWorldTransform(picTwo.hdc, XF) 'возвращает 0, что указывает на ошибку
    'копируем изображение
    BitBlt picTwo.hdc, (picTwo.ScaleWidth - picOne.ScaleWidth) / 2, (picTwo.ScaleHeight - picOne.ScaleHeight) / 2, picOne.ScaleWidth, picOne.ScaleHeight, picOne.hdc, 0, 0, vbSrcCopy
End Sub

Кстати вопрос, что я не так делаю с SetWorldTransform?

Второй вариант работает довольно шустро, но все таки не столь быстро как хотелось бы
Код: Выделить всё

Private Sub Rotate4()
    picOne.ScaleMode = vbPixels
    picTwo.ScaleMode = vbPixels
    Dim da As Double: da = HScroll1.Value * pi / 180
    'создаем контекст устройства памяти
    Dim memDC As Long: memDC = CreateCompatibleDC(picTwo.hdc)
    Dim memBmp As Long: memBmp = CreateCompatibleBitmap(picTwo.hdc, picTwo.ScaleWidth, picTwo.ScaleHeight)
    Dim oldBmp As Long: oldBmp = SelectObject(memDC, memBmp)
    Dim nX As Integer, nY As Integer
    Dim nX1 As Integer, nY1 As Integer
    Dim dX2 As Double, dY2 As Double
    Dim dX3 As Double, dY3 As Double
    For nX = 0 To picTwo.ScaleWidth
        nX1 = nX - picTwo.ScaleWidth \ 2
        For nY = 0 To picTwo.ScaleHeight
            nY1 = nY - picTwo.ScaleHeight \ 2
            'поворачиваем картинку на угол da
            dX2 = nX1 * Cos(-da) + nY1 * Sin(-da)
            dY2 = nY1 * Cos(-da) - nX1 * Sin(-da)
            'получаем центр нашего исходного picture box
            dX3 = dX2 + picOne.ScaleWidth \ 2
            dY3 = dY2 + picOne.ScaleHeight \ 2
            'If data point is in picOne, set its color in picTwo
            If dX3 > 0 And dX3 < picOne.ScaleWidth - 1 _
                And dY3 > 0 And dY3 < picOne.ScaleHeight - 1 Then
                'устанавливаем пиксели в памяти
                SetPixelV memDC, nX, nY, GetPixel(picOne.hdc, CLng(dX3), CLng(dY3))
            End If
        Next nY
    Next nX
    'копируем картинку в PictureBox
    BitBlt picTwo.hdc, 0, 0, picTwo.ScaleWidth, picTwo.ScaleHeight, memDC, 0, 0, vbSrcCopy
    'удаляем созданные объекты
    SelectObject memDC, oldBmp
    DeleteObject memBmp
    DeleteDC memDC
End Sub


полная версия на прицепленом файле
Вложения
RotatePicture.zip
(48.34 Кб) Скачиваний: 52
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.05.2005 (Чт) 20:56

XFORM криво объявлена - все её члены должны быть As Single. Тогда работает, я проверил.
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 19.05.2005 (Чт) 21:44


Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.05.2005 (Пт) 17:23

После изменения XFORM и более точного вызова SetWorldTransform все работает очень шустро.
Код: Выделить всё

Private Sub Rotate3()
    picTwo.Cls
    picOne.ScaleMode = vbPixels
    picTwo.ScaleMode = vbPixels
    'угол поворота в радианах
    Dim da As Double: da = HScroll1.Value * pi / 180
    'матрица преобразования
    Dim XF As XFORM
    XF.eDx = picTwo.ScaleWidth / 2
    XF.eDy = picTwo.ScaleHeight / 2
    XF.eM11 = Cos(-da)
    XF.eM12 = Sin(-da)
    XF.eM21 = -Sin(-da)
    XF.eM22 = Cos(-da)
    'устанавливаем расширенный графический режим
    SetGraphicsMode picTwo.hdc, GM_ADVANCED
    'смещаем и поворачиваем мир на нужную величину
    SetWorldTransform picTwo.hdc, XF
    'копируем изображение
    BitBlt picTwo.hdc, -picOne.ScaleWidth \ 2, -picOne.ScaleHeight \ 2, picOne.ScaleWidth, picOne.ScaleHeight, picOne.hdc, 0, 0, vbSrcCopy
End Sub


полная версия прицеплена.

Версию A.A.Z. еще не смотрел.
Вложения
RotatePicture.zip
(48 Кб) Скачиваний: 65
Весь мир матрица, а мы в нем потоки байтов!

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 20.05.2005 (Пт) 17:28

А не скажете формулу для вращения точки на угол A :?:
Удачи!
С уважением, Алексадр.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.05.2005 (Пт) 17:58

Sasha_karasov писал(а):А не скажете формулу для вращения точки на угол A :?:

см. в коде Viper, она там есть.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 21.05.2005 (Сб) 8:34

Обещанный анализ версии от A.A.G.

В ней три варианта реализации поворота картинки, причем они работают как с применением сглаживания пикселей так и без оного.

Первый вариант по сути аналогичен методу от Rostic_Utra(2), но с некоторой оптимизацией, крутит картинку за 206 мс со сглаживанием и за 89 мс без сглаживания.

Второй вариант делает тоже самое, но использует при этом функции API GetPixel и SetPixel вместо свойств PictureBox. Соответственно 172 мс и 65 мс. Думаю, если вместо SetPixel использовать SetPixelV будет работать быстрее.

Третий метод записывает в память Bitmap, критит его там и рисует полученную картинку на PictureBox. Работает за 28 мс и за 23 мс. Собственно это аналогично моему способу с повортом картинки в конексте устройства памяти. Только у меня реализация попроще через BitBlt.

Метод с SetWorldTransform поворачивает картинку за 6 мс.

Исходный вариант (Rostic_Utra(2)) за 350 мс.

Все крутилось в готовом exe-файле на Pentium III с часотой процессора 866 МГц и памятью 512 МБ.

З.Ы. Скорость вращаения зависит и от размера картинки - картинка A.A.G меньше чем у Rostic_Utra(2)

Делайте выводы.
Последний раз редактировалось Viper 21.05.2005 (Сб) 11:22, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.05.2005 (Сб) 11:04

SetWorldTransform не работает на Win95/98/Me.
Делайте выводы.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 21.05.2005 (Сб) 11:11

GSerg писал(а):SetWorldTransform не работает на Win95/98/Me.
Делайте выводы.


Эт точно, с 95 года к машинам с Win95/98/ME не подходил - про не работу на них многих API функций даже и не вспоминаю. :)

Если без SetWorldTransform то стоить крутит через контекст памяти
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.05.2005 (Сб) 15:34

!Viper! писал(а):Обещанный анализ версии от A.A.G.
...
З.Ы. Скорость вращаения зависит и от размера картинки - картинка A.A.G меньше чем у Rostic_Utra(2)

А это кто такой?
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 86

    TopList