Вращение PictureBox/Image относитльно центра.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Negativ
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 2
Зарегистрирован: 10.11.2006 (Пт) 3:09
Откуда: Минск, РБ

Вращение PictureBox/Image относитльно центра.

Сообщение Negativ » 10.11.2006 (Пт) 3:52

Нашел програмку, которая вращает растровую картинку (на форме 2 PictureBox(picture1,picture2) и 1 Hscroll(slider1)). С промощью скролла меняется угол поворота.

Код: Выделить всё
Option Explicit
Private Type POINTAPI
    x As Long
    y As Long
End Type
Dim Pt(0 To 2) As POINTAPI
Dim Angle As Double
Private Const PI As Double = 3.14159265358979
Private Declare Function PlgBlt Lib "gdi32" (ByVal hdcDest As Long, lpPoint As POINTAPI, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hbmMask As Long, ByVal xMask As Long, ByVal yMask As Long) As Long
Private Sub Slider1_Click()
    Angle = Slider1 / 100
    Rotate Picture2, Picture1, Angle
End Sub
Private Sub Slider1_Scroll()
    Angle = Slider1 / 100
    Rotate Picture2, Picture1, Angle
End Sub
Private Sub Rotate(picDest As PictureBox, picsrc As PictureBox, Angle As Double)
    Dim a As Integer
    Pt(0).x = 0
    Pt(0).y = 0
    Pt(1).x = picsrc.Width
    Pt(1).y = 0
    Pt(2).x = 0
    Pt(2).y = picsrc.Height
    For a = 0 To 2
        Pt(a) = RotateP(picsrc.Width / 2, picsrc.Height / 2, Pt(a), Angle)
    Next
    PlgBlt picDest.hDC, Pt(0), picsrc.hDC, 0, 0, picsrc.Width, picsrc.Height, ByVal 0&, ByVal 0&, ByVal 0&
    picDest.Refresh
End Sub
Private Function RotateP(ByRef x As Long, ByRef y As Long, ByRef Point As POINTAPI, Angle As Double) As POINTAPI
    Dim Tmp1 As Double
    Dim Tmp2 As Double
    Tmp1 = Point.x - x
    Tmp2 = Point.y - y
    Point.x = Tmp1 * Cos(Angle) - Tmp2 * Sin(Angle)
    Point.y = Tmp1 * Sin(Angle) + Tmp2 * Cos(Angle)
    Point.x = Point.x + x
    Point.y = Point.y + y
    RotateP = Point
End Function


Пытаюсь написать простенькую плоскую игру: на звездном фоне летает кораблик (желательно бы Image), с помощью клавиш лево-право - поворот коробля, вверх - разгон.
Код этой программы - громоздкий, есть ли альтернативные способы вращение растровой картинки? (Желательно Image)

И еще один вопрос. Как сделать фон имеджевой картинки прозрачным для *.jpg или *.bmp? (у Gif слишком мало цветов)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.11.2006 (Пт) 4:34

Примеры вращения изображений в поиске.
И причем тут Image? Рисунок следует рисовать через BitBlt/TransparentBlt. А ещё лучше - SetDIBits.

Кстати, оцени этот проект.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение tyomitch » 10.11.2006 (Пт) 10:41

BV, если кораблик один, то с Image ничуть не хуже чем с BitBlt, а работать гораздо проще. Особенно начинающему.

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


Negativ: чтобы фон изображения в PictureBox был "прозрачным", нужно в отдельном PictureBox (можно невидимом) хранить монохромную маску, вращать её вместе с основной картинкой, и после вращения в области, открытые маской, переливать фон.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.11.2006 (Пт) 12:00

tyomitch писал(а):Пример вращения изображений Negativ уже нашёл, и даже привёл. В поиск его посылать совершенно незачем.

Negativ писал(а):есть ли альтернативные способы вращение растровой картинки?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение tyomitch » 10.11.2006 (Пт) 12:26

BV писал(а):
tyomitch писал(а):Пример вращения изображений Negativ уже нашёл, и даже привёл. В поиск его посылать совершенно незачем.

Negativ писал(а):есть ли альтернативные способы вращение растровой картинки?


Опять фигурная резка по цитатам? :-?

Negativ писал(а):Код этой программы - громоздкий, есть ли альтернативные способы вращение растровой картинки? (Желательно Image)


Ты знаешь более компактный код для поворота картинки? Работающий с Image? :?:

Левые библиотеки не в счёт, а то я опять про GDI+ начну.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.11.2006 (Пт) 12:44

А цитаты, которую сам же привел, ты, видимо, не читал :)

Автор спросил не про компактный, а про альтернативный способ, это раз.
Он написал желательно Image, да ещё и в скобках, это два.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Negativ
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 2
Зарегистрирован: 10.11.2006 (Пт) 3:09
Откуда: Минск, РБ

Сообщение Negativ » 10.11.2006 (Пт) 14:11

BV
Проект супер. Красиво сделано. Глаза раскрыло на возможности VB :shock:
Я недавно изучаю VB. ПРичем по древней литературе. Информации по Lib нету. Так сказать, учусь на чужих проектах. (раньше сидел на спектрумском Basic и затем на Qbasic). Может подкинете ссылочек с интересными примерами и обязательно описанием, литературу какую (эелектронный варинт)?

В том проекте есть возможность вращать объект?

tyomitch: "чтобы фон изображения в PictureBox был "прозрачным", нужно в отдельном PictureBox (можно невидимом) хранить монохромную маску, вращать её вместе с основной картинкой, и после вращения в области, открытые маской, переливать фон."
Я не знаю как это сделать. Не знаю, как переливать фон. :oops:

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

Сообщение tyomitch » 10.11.2006 (Пт) 16:58

Negativ писал(а):tyomitch: "чтобы фон изображения в PictureBox был "прозрачным", нужно в отдельном PictureBox (можно невидимом) хранить монохромную маску, вращать её вместе с основной картинкой, и после вращения в области, открытые маской, переливать фон."
Я не знаю как это сделать. Не знаю, как переливать фон. :oops:

Держи пример.
Вложения
4negativ.rar
(435.12 Кб) Скачиваний: 208
Изображение

Winitar
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 06.07.2006 (Чт) 20:45
Откуда: Астана

Сообщение Winitar » 21.01.2007 (Вс) 18:54

tyomitch, я видимо совсем новичёк! Я мало понял твой код в 4negativ.rar ты не мог бы написать статеёку, т.е разъяснить что ли? (подробно) Или добавить в этот проект побольше комментариев.....
:(


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

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

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

    TopList