Методики построения палитры цветов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 30.09.2005 (Пт) 1:12

аля фотошоп

Option Explicit

Private Function Grad4(P As PictureBox, X As Long, Y As Long, W As Long, H As Long, rc, gc, bc)
Dim R As Integer, G As Integer, B As Integer
Dim i As Long, j As Long

For i = 0 To W - 1
For j = 0 To H - 1
R = (((100 / H) * j) / 100) + (rc * (((100 / W) * i) / 100) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
G = (((100 / H) * j) / 100) + (gc * (((100 / W) * i) / 100) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
B = (((100 / H) * j) / 100) + (bc * (((100 / W) * i) / 100) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)

P.PSet (i, j), RGB(R, G, B)
Next
Next

End Function

Private Sub Form_Click()
Grad4 PB, 0, 0, PB.ScaleWidth, PB.ScaleHeight, 255, 0, 0
End Sub

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

Сообщение BV » 30.09.2005 (Пт) 1:37

А мне ещё хватило наглости сделать PictureBox размером 800х600 :)
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;

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 30.09.2005 (Пт) 1:57

да, со скоростью проблемы, причем офигенные

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 30.09.2005 (Пт) 3:52

BV писал(а):А мне ещё хватило наглости сделать PictureBox размером 800х600 :)
Вот нахрена я тебя послушал :)
Naked писал(а):да, со скоростью проблемы, причем офигенные
Ну ты бы попробовал суперконструкцию (((100/H)*j)/100) заменить на j/H и все, что можно (а можно очень очень очень много чего) высчитать до второго цикла в первом, а остальное во втором, но до подсчета R, G и B, то скорость увеличится примерно вдвое :)
Последний раз редактировалось vvs_adm 30.09.2005 (Пт) 6:59, всего редактировалось 1 раз.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 30.09.2005 (Пт) 6:20

А ещё можно попробовать ScaleMode поставить в 3 - Pixel :D
тогда скорость увеличивается в twip/pixel раз
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 30.09.2005 (Пт) 6:28

И ещё чуть-чуть скорости даёт использование апишной SetPixelV.
Проверено на 1280*1024 :wink:
Может, можно как-то при помощи директХ?
Ну там, сформировать в памяти карту битов (без прорисовки) и передать её директу для построения :?:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение tyomitch » 30.09.2005 (Пт) 8:14

Cryonyx, ты сначала определись что тебе надо, а потом уже будем ускорять.

То, что рисуется кодом Naked - подходит? или всё ещё не то?
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 30.09.2005 (Пт) 8:40

уменьшил на сколько смог
R = (rc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
G = (gc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
B = (bc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)

может быть еще можно, но думать щас не хочется... другим делом занят

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 30.09.2005 (Пт) 10:37

Naked писал(а):уменьшил на сколько смог
R = (rc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
G = (gc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
B = (bc * (i / W) + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)

может быть еще можно, но думать щас не хочется... другим делом занят
Ну ты только суперконструкции убрал, да и то не все :) Помимо того, что упростить можно дальше, нужно еще обратить внимание, что к примеру ты вычисляешь I/W три раза подряд + в каждом цикле по J, хотя можно в цикле по I один раз в промежуточную переменную кинуть, а потом использовать, типа :
Код: Выделить всё
Option Explicit

Private Function Grad4(P As PictureBox, X As Long, Y As Long, W As Long, H As Long, rc, gc, bc)
Dim R As Integer, G As Integer, B As Integer
Dim i As Long, j As Long

DIM TEMP AS DOUBLE

For i = 0 To W - 1
TEMP=i/W
For j = 0 To H - 1
R = (rc * TEMP + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
G = (gc * TEMP + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)
B = (bc * TEMP + 255 * ((100 - (100 / W) * i) / 100)) * ((100 - (100 / H) * j) / 100)

P.PSet (i, j), RGB(R, G, B)
Next
Next

End Function

Private Sub Form_Click()
Grad4 PB, 0, 0, PB.ScaleWidth, PB.ScaleHeight, 255, 0, 0
End Sub
Ну и так далее :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 30.09.2005 (Пт) 16:53

2 tyomitch
И это тоже ;)
Я ж говорю: мне интересны все возможные методики, а не какая-то конкретная. Мне на ум приходит как минимум 15-20 их разновидностей, вот и интересно. С теоретической, так сказать, точки зрения. :D

2 vvs_adm
Точно так же можно заранее вычислить и 100/w, (100-(100/w)*i),100/h

А вообще, спасибо за идею :wink:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Пред.

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

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

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

    TopList  
cron