



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

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


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
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

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

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




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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8