С++ код на VB 6.0, если не сложно...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

С++ код на VB 6.0, если не сложно...

Сообщение d3drm » 02.04.2005 (Сб) 22:25

Сабж,

DWORD encodeVectorAsDWORDColor( D3DXVECTOR3* vVector )
{
DWORD dwRed = (DWORD)(127 * vVector->x + 128);
DWORD dwGreen = (DWORD)(127 * vVector->y + 128);
DWORD dwBlue = (DWORD)(127 * vVector->z + 128);

return (DWORD)(0xff000000 + (dwRed << 16) + (dwGreen << 8) + dwBlue);
}

буду очень признателен...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 1:13

меня в общем вот только вот этот кусок кода интересует:

(dwRed << 16) + (dwGreen << 8) + dwBlue

Я сделал так, но почему-то это выходит неправильным...

(dwRed * (2 ^ 16)) Or (dwGreen * (2 ^ 8)) Or dwBlue

В чем ошибка?

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 03.04.2005 (Вс) 3:20

Код: Выделить всё
Public Type D3DXVECTOR3
   x As Byte
   y As Byte
   z As Byte
End Type


Public Function encodeVectorAsDWORDColor(ByRef vVector As D3DXVECTOR3) As Long

  Dim dwRed&
  Dim dwGreen&
  Dim dwBlue&

  dwRed = CLng(127 * vVector.x + 128)
  dwGreen = CLng(127 * vVector.y + 128)
  dwBlue = CLng(127 * vVector.z + 128)

  encodeVectorAsDWORDColor = CLng(&HFF000000 + (dwRed * 2 ^ 16) + (dwGreen * 2 ^ 8) + dwBlue)
End Function

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

Сообщение GSerg » 03.04.2005 (Вс) 10:50

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

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 11:54

Inferno, ты уверен, что там "+" в предпоследней строке, а не Or??

GSerg, хм... посмотрел, но не понял что ты имел ввиду... что там с совестью?...

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

Сообщение GSerg » 03.04.2005 (Вс) 12:10

Ну, поскольку приведённый пример рабочий (а разве нет? :) ), то DWORD - это для очистки совести :)
В твоём случае будет DWORD(WORD(dwBlue, dwGreen), WORD(dwRed, &HFF)).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 12:25

Почему-то когда в исходном фрагменте (С++) я заменяю

return ( (dwRed << 16 ) + (dwGreen << 8 ) + dwBlue);

на

return ((dwRed * 2 ^ 16) + (dwGreen * 2 ^ 8 ) + dwBlue);

программа работает неправильно.

Причем выходит, изходя из кода Инферно, что код должен быть равносильным... Но ведь не работает почему-то...

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

Сообщение GSerg » 03.04.2005 (Вс) 12:35

Потому что в C оператор ^ означает то же, что у нас XOR :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 13:24

GSerg писал(а):Потому что в C оператор ^ означает то же, что у нас XOR :)


ны ладно, выставил ты меня дураком, тогда бы хоть объяснил как там степень обозначается =)

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

Сообщение Cryonyx » 03.04.2005 (Вс) 13:39

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 03.04.2005 (Вс) 13:41

По теме йе... (простите) :D возведения в степень ищем в Яндексе по запросу "возведение в степень c++".

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 13:43

Cryonyx писал(а):А по ходу дела, никак :D
Я ещё нигде не видел, чтобы степень реализовывалась иначе, кроме как многочисленным умножением - да так и на порядок быстрее получается.


не, мне бауманец рассказал как: http://forum.proger.ru/viewtopic.php?t= ... 87d1f51ab2

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

Сообщение Cryonyx » 03.04.2005 (Вс) 13:56

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

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 03.04.2005 (Вс) 14:08

дык мне просто проверить надо было правильно ли я код перевел, и все... а самый быстрый выриант как я в начале написал - побитовый сдвиг влево

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 06.04.2005 (Ср) 16:01

d3drm писал(а):Почему-то когда в исходном фрагменте (С++) я заменяю

return ( (dwRed << 16 ) + (dwGreen << 8 ) + dwBlue);

на

return ((dwRed * 2 ^ 16) + (dwGreen * 2 ^ 8 ) + dwBlue);

программа работает неправильно.



потому, что
1)потерял 4 байт &HFF000000
2) Возведение в степень делает функция pow(основание, степень)

сдвиг влево на один бит равнозначно умножению на 2, вправо делению на 2, поэтому в данном случае используется N<<х что равносильно бейсиковскому N*2^x
Выходным значением должно быть &HFFRRBBGG , а у тебя получается
&HRRBBGG.
где RR -dwred
BB- dwblue
GG- dwgreen


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

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

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

    TopList