Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Поворот картинки Добавлено: 30.04.05 18:12  

Автор вопроса:  Yeputons | ICQ: 278444762 
Как повернуть картинку на заданное кол-во градусов?
Контролы и библеотеки меня не интересуют! Только исходники!

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #1
Добавлено: 30.04.05 18:41
picTwo.Cls
Dim intX As Integer
    Dim intY As Integer
    Dim intX1 As Integer
    Dim intY1 As Integer
    Dim dblX2 As Double
    Dim dblY2 As Double
    Dim dblX3 As Double
    Dim dblY3 As Double
    Dim dblThetaDeg As Double
    Dim dblThetaRad As Double
    'Initialize rotation angle
    dblThetaDeg = a
    'Compute angle in radians
    dblThetaRad = dblThetaDeg * PI / 180
    'Set scale modes to pixels
    picOne.ScaleMode = vbPixels
    picTwo.ScaleMode = vbPixels
    For intX = 0 To picTwo.ScaleWidth
        intX1 = intX - picTwo.ScaleWidth \ 2
        For intY = 0 To picTwo.ScaleHeight
            intY1 = intY - picTwo.ScaleHeight \ 2
            'Rotate picture by dblThetaRad
            dblX2 = intX1 * Cos(-dblThetaRad) + _
                intY1 * Sin(-dblThetaRad)
            dblY2 = intY1 * Cos(-dblThetaRad) - _
                intX1 * Sin(-dblThetaRad)
            'Translate to center of picture box
            dblX3 = dblX2 + picOne.ScaleWidth \ 2
            dblY3 = dblY2 + picOne.ScaleHeight \ 2
            'If data point is in picOne, set its color in picTwo
            If dblX3 > 0 And dblX3 < picOne.ScaleWidth - 1 _
                And dblY3 > 0 And dblY3 < picOne.ScaleHeight - 1 Then
                picTwo.PSet (intX, intY), picOne.Point(dblX3, dblY3)
            End If
        Next intY
    Next intX

Ответить

Номер ответа: 2
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #2 Добавлено: 30.04.05 19:42
Кто ж так поворачивает? Лучше уж через массив, методом scanline и без вычисления тригонометрии каждый пиксел. Будет как минимум в тысячу раз быстрее.

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 30.04.05 20:07
Под NT есть ОЧЕНЬ быстрый способ повернуть картинку. Это если к функции PlgBlt подмешать немного кода из синусов и косинусов, то будет вообще быстро. Достаточно просто вращать по кругу три точки изображения (четвёртая расчитывается сама). Я делал, работает. крутится прямо по таймеру. Выигрыш огромен. теперб думаю как под 9х запустить

Ответить

Номер ответа: 4
Автор ответа:
 Yeputons



ICQ: 278444762 

Вопросов: 71
Ответов: 179
 Профиль | | #4 Добавлено: 30.04.05 21:55
и без вычисления тригонометрии каждый пиксел

Дык мне это и надо было. Спасибо Barsik!

Ответить

Номер ответа: 5
Автор ответа:
 Yeputons



ICQ: 278444762 

Вопросов: 71
Ответов: 179
 Профиль | | #5 Добавлено: 30.04.05 22:51
Ой. Извините. Мне нужны исходники не поворота картинки, а поворота точки. Например у точки координаты 0, 10 и нужно узнать её координаты, если её повернуть например на 21 градус вокруг точки 0,0.

Ответить

Номер ответа: 6
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #6
Добавлено: 30.04.05 23:10
ок, пусть R = расстояние между O(0,0) и P(0,10), помнишь формулу для нахожения расстояния? в твоём то случае это вообще просто, кажись R = 10, так вроде?
Тогда Angle = 21 градус. Только по-моему надо в радианы перевести, а то неправильно ролучится.
Теперь координаты точки P(x,y) после поворота отностельно O(0,0) станут такими:

x = cos(angle) * R
y = sin(angle) * R


Потом просто прибавляешь координаты центра, то есть ничего не прибавляешь если центр 0,0

Ответить

Номер ответа: 7
Автор ответа:
 Yeputons



ICQ: 278444762 

Вопросов: 71
Ответов: 179
 Профиль | | #7 Добавлено: 01.05.05 11:02
не хочет. Я сказал её пусть повернёт точку (0, 10) на 90 градусов вокруг точки (0,0) и вот что она выдала: (-6,32244591553242E-03, 9,99999800133368). Вот код:

Public Sub RotatePoint(ByVal X As Double, ByVal Y As Double, ByVal Angle As Double, _
ByRef RX As Double, ByRef RY As Double)
Dim Dist As Double

Dist = Sqr((X ^ 2) + (Y ^ 2))
Angle = Angle * 3.1416 / 180
RX = Cos(Angle) * Dist
RY = Sin(Angle) * Dist
End Sub

X было равно 0, Y - 10,Angle - 90. RX, RY - это координаты получившейся точки.

Ответить

Номер ответа: 8
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 01.05.05 12:18
Сначала надо вычислить начальный угол, которому соответствует (0,10), затем к нему добавить твои 90 градусов и для полученного значения вычислять координаты.
Расчёты веди в радианах и не забывай, что круг - это 360 а не 180 градусов.

Ответить

Номер ответа: 9
Автор ответа:
 Yeputons



ICQ: 278444762 

Вопросов: 71
Ответов: 179
 Профиль | | #9 Добавлено: 01.05.05 13:03
Hooligan, а можно попонятнее?

Ответить

Номер ответа: 10
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #10 Добавлено: 01.05.05 14:06
Рисуем на бумаге координатную плоскость с центром, вокруг которого нужно вращать - точка O(0,0) и двумя осями - Ох и Оy.
Есть окружность с центром в точке О и радиусом Sqr(x^2 + y^2). На этой окружности лежит точка A(0,10). Эта точка уже повернута на некоторый угол Ang относительно оси Ох. Тебе нужно ещё повернуть эту точку на 90 градусов относительно её текущего положения, в котором её координаты (0,10). Т.е. сделать Ang+90.

Рассчитываешь Ang исходя из координат точки А, прибавляешь 90 градусов (pi/4) и для получившегося угла вычисляешь синус и косинус. Они и будут соответственно координатами х и у.

Ответить

Номер ответа: 11
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #11 Добавлено: 01.05.05 15:27
Для поворота точки я использую эти функции:


Function Angle(ByVal X1!, ByVal Y1!, ByVal X2!, ByVal Y2!) As Single
Dim X!, Y!
X = X2 - X1
Y = Y2 - Y1
If X = 0 Then
    If Y >= 0 Then Angle = pi Else Angle = 0
Else
    If X > 0 Then
        Angle = Atn(Y / X) + pi * 0.5
    ElseIf Y >= 0 Then
        Angle = Atn(Y / X) + pi * 1.5
    Else
        Angle = Atn(Y / X) - pi * 0.5
    End If
End If
End Function
Function Dist(ByVal X1!, ByVal Y1!, ByVal X2!, ByVal Y2!) As Single
Dist = Sqr((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2))
End Function


Но вообще можно как-то по-другому. Вот что об этом написано в пособии "Основные алгоритмы компьютерной графики":

Преобразование поворота относительно начала координат имеет вид:

Xn = X ·cos f- Y ·sin f, Yn = X ·sin f+ Y ·cos f,
 ;(0.1.5)

или в матричной форме:
Pn = P ·R,
 ;(0.1.6)

где f - угол поворота, а R = [ cos f sin f
 
-sin f
 cos f
 
] - матрица поворота.

Столбцы и строки матрицы поворота представляют собой взаимно ортогональные единичные векторы. В самом деле квадраты длин векторов-строк равны единице:

cos f·cos f+sin f·sin f = 1 и
(-sin f) ·(-sin f)+cos f·cos f = 1,

а скалярное произведение векторов-строк есть
cos f·(-sin f) + sin f·cos f = 0.
 

Ответить

Номер ответа: 12
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #12
Добавлено: 01.05.05 16:42
2Страшный Сон

По моему сложновато для несложной операции... аа чё это за восклицательные знаки после переменных?

Ответить

Номер ответа: 13
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #13 Добавлено: 01.05.05 21:51
чё это за восклицательные знаки после переменных?

Сокращенное обозначение типа Single.

Ответить

Номер ответа: 14
Автор ответа:
 Yeputons



ICQ: 278444762 

Вопросов: 71
Ответов: 179
 Профиль | | #14 Добавлено: 02.05.05 09:53
Уф. Совсем вы меня запутали! Может кто-нибудь дать просто код для поворота точки? П-р-о-с-т-о к-о-д!

Ответить

Номер ответа: 15
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #15 Добавлено: 02.05.05 14:40
Попробуй это:

X' = X * Cos(F) - Y * Sin(F)
Y' = X * Sin(F) + Y * Cos(F)

Угол F вводится в радианах.
Но если тебе нужно повернуть картинку, эта формула тебе не поможет.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам