Блоковый вывод графики

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
PSV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 29.01.2002 (Вт) 12:30
Откуда: Россия

Блоковый вывод графики

Сообщение PSV » 08.12.2004 (Ср) 15:08

Хаюшки!

В мою программу (на VB :shock:) на достаточно высокой скорости (USB 1.1) поступают картинки построчно в виде пикселей (градации серого), нужно их выводить на экран (форму). Как это сделать побыстрее и покрасивее? Попиксельно рисовать не есть хорошо. Вроде есть API-функции постраничного вывода графики - строится картинка в памяти, потом выводится. Не подскажете данные функции и мож пример использования.

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

Сообщение GSerg » 08.12.2004 (Ср) 15:14

Подскажем...
GetDIBits сотоварищи...

Ща получишь the most cool example, погодь...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 08.12.2004 (Ср) 15:14

CreateDC, CreateDIBSection, SelectObject, заполняешь, BitBlt, DeleteObject, DeleteDC.
Изображение

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

Сообщение GSerg » 08.12.2004 (Ср) 15:15

Что?!?

Кто снёс старый VBStreets?!?
Там офигенный фрактальный пример был!

:evil: :mad: :cry:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 08.12.2004 (Ср) 15:18

GSerg писал(а):Подскажем...
GetDIBits сотоварищи...

:shock: а он-то здесь при чём? Скорее уж, наоборот, SetDIBitsToDevice. Даже, пожалуй, лучше, чем моя последовательность...
Изображение

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

Сообщение tyomitch » 08.12.2004 (Ср) 15:20

Мандельброт есть в поставке QB... Кинуть сюда, или у тебя есть свой? :-)
Изображение

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

Сообщение GSerg » 08.12.2004 (Ср) 15:23

Неее, тот, кто не видел тамошнего, не проникнется его крутизной :)

Оригинальный алгоритм рисовал фрактал прямо на форме примерно за 140 секунд.
Потом пришёл Aquarius, и алгоритм стал рисовать прямо на форме примерно за 0.8 секунды.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 08.12.2004 (Ср) 15:32

ICIM, вот Мандельброт из QB, рисующий прямо по форме (у меня - за пару секунд).
Код: Выделить всё
DefInt A-Z         ' Default variable type is integer

Sub Mandelbrot()

' Set maximum number of iterations per point:
Const MAXLOOP = 30, MAXSIZE = 1000000

' Loop through each pixel in viewport and calculate
' whether or not it is in the Mandelbrot Set:
For Y = 0 To ScaleHeight   ' Loop through every line in
                           ' the viewport.
   PSet (0, LogicY)        ' Plot leftmost pixel in the line.
   OldColor = 0            ' Start with background color.

   For X = 0 To ScaleWidth ' Loop through every pixel in
                           ' the line.
      MandelX& = X
      MandelY& = Y

      ' Do the calculations to see if this point is in
      ' the Mandelbrot Set:
      For I = 1 To MAXLOOP
         RealNum& = MandelX& * MandelX&
         ImagNum& = MandelY& * MandelY&
         If (RealNum& + ImagNum&) >= MAXSIZE Then Exit For
         MandelY& = (MandelX& * MandelY&) \ 250 + Y
         MandelX& = (RealNum& - ImagNum&) \ 500 + X
      Next I

      ' Assign a color to the point:
      PColor = I Mod 16

      ' If color has changed, draw a line from the
      ' last point referenced to the new point,
      ' using the old color:
      If PColor <> OldColor Then
         Line -(X, Y), QBColor(OldColor)
         OldColor = PColor
      End If

   Next X

   ' Draw the last line segment to the right edge of
   ' the viewport:
   Line -(X, Y), QBColor(OldColor)
Next Y
End Sub

Private Sub Form_Load()
    ScaleMode = vbPixels
    AutoRedraw = True
    WindowState = vbMaximized
    Show
    Mandelbrot
End Sub


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

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.12.2004 (Ср) 20:33

Подозреваю, что вот этот:
http://bbs.vbstreets.ru/profile.php?mod ... ile&u=1802

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

Сообщение tyomitch » 08.12.2004 (Ср) 21:54

А, это? http://bbs.vbstreets.ru/viewtopic.php?p=12480#12480
Да уж, хотелось бы взглянуть... Ни у кого на винте не сохранилось?
Изображение


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

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

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

    TopList  
cron