Страница: 1 | 2 |
Вопрос: Поворот картинки
Добавлено: 30.04.05 18:12
Автор вопроса: Yeputons | ICQ: 278444762
Как повернуть картинку на заданное кол-во градусов?
Контролы и библеотеки меня не интересуют! Только исходники!
Ответы
Всего ответов: 25
Номер ответа: 1
Автор ответа:
Barsik
Разработчик Offline Client
ICQ: 343368641
Вопросов: 17
Ответов: 686
Web-сайт:
Профиль | | #1
Добавлено: 30.04.05 18:41
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-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 30.04.05 23:10
ок, пусть R = расстояние между O(0,0) и P(0,10), помнишь формулу для нахожения расстояния? в твоём то случае это вообще просто, кажись R = 10, так вроде?
Тогда Angle = 21 градус. Только по-моему надо в радианы перевести, а то неправильно ролучится.
Теперь координаты точки P(x,y) после поворота отностельно O(0,0) станут такими:
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-сайт:
Профиль | | #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 вводится в радианах.
Но если тебе нужно повернуть картинку, эта формула тебе не поможет.