 |
|

19.01.2019, 13:39
|
|
Участник форума
Регистрация: 16.03.2017
Сообщений: 105
С нами:
4821087
Репутация:
133
|
|
Сообщение от Losyash1337
А потом жалуются люди, что у них не работает ничего 
У float всегда погрешность будет в этом случае (и почти во всех остальных), если не можете осознать этот факт, то прошу уйти читать IEEE 754 ( перевод). Кстати, реализация не самая длинная, как может показаться, вот, например, другая, более универсальная (и прожорливая):
C++:
Код:
#include
#include
#include
// ...
struct
ColorState
{
uint8_t
r
,
g
,
b
;
double
duration
;
ColorState
(
)
{
}
ColorState
(
uint8_t
r
,
uint8_t
g
,
uint8_t
b
,
double
duration
)
:
r
(
r
)
,
g
(
g
)
,
b
(
b
)
,
duration
(
duration
)
{
assert
(
duration
>
0.0
)
;
}
}
;
class
ColorController
{
public
:
ColorController
(
const
std
::
vector
&
data
)
:
m_data
(
data
)
,
m_state
(
0U
)
,
m_time
(
0.0
)
,
m_cycle
(
0.0
)
{
for
(
const
auto
&
x
:
m_data
)
m_cycle
+=
x
.
duration
;
}
void
update
(
double
delta
)
{
m_time
+=
delta
;
#define _CC_NEXT_STATE(x) (((x)+1U)%m_data.size())
while
(
m_time
>=
m_data
[
m_state
]
.
duration
)
{
m_time
-=
m_data
[
m_state
]
.
duration
;
m_state
=
_CC_NEXT_STATE
(
m_state
)
;
}
const
auto
&
cur
=
m_data
[
m_state
]
;
const
auto
&
nxt
=
m_data
[
_CC_NEXT_STATE
(
m_state
)
]
;
const
double
t1
=
m_time
,
t2
=
cur
.
duration
-
m_time
;
#undef _CC_NEXT_STATE
m_r
=
static_cast
(
(
t2
*
cur
.
r
+
t1
*
nxt
.
r
)
/
cur
.
duration
)
;
m_g
=
static_cast
(
(
t2
*
cur
.
g
+
t1
*
nxt
.
g
)
/
cur
.
duration
)
;
m_b
=
static_cast
(
(
t2
*
cur
.
b
+
t1
*
nxt
.
b
)
/
cur
.
duration
)
;
}
uint8_t
get_r
(
)
const
{
return
m_r
;
}
uint8_t
get_g
(
)
const
{
return
m_g
;
}
uint8_t
get_b
(
)
const
{
return
m_b
;
}
COLORREF
get_color
(
)
const
{
return
RGB
(
m_r
,
m_g
,
m_b
)
;
}
private
:
size_t m_state
;
double
m_time
,
m_cycle
;
uint8_t
m_r
,
m_g
,
m_b
;
std
::
vector
m_data
;
}
;
использование:
C++:
Код:
// инициализация в отдельной функции (чтобы не засорять код в месте использования)
ColorController
create_my_cc
(
)
{
std
::
vector
data
(
6
)
;
data
[
0
]
=
ColorState
(
255
,
0
,
0
,
0.5
)
;
data
[
1
]
=
ColorState
(
0
,
0
,
0
,
0.3
)
;
data
[
2
]
=
ColorState
(
0
,
255
,
0
,
0.5
)
;
data
[
3
]
=
ColorState
(
0
,
0
,
0
,
0.3
)
;
data
[
4
]
=
ColorState
(
0
,
0
,
255
,
0.5
)
;
data
[
5
]
=
ColorState
(
0
,
0
,
0
,
0.3
)
;
return
ColorController
(
data
)
;
}
// инициализация на месте (производится один раз!)
auto
my_cc
=
create_my_cc
(
)
;
// использование
my_cc
.
update
(
dt
)
;
COLORREF color
=
my_cc
.
get_color
(
)
Дружочек, вопрос к тебе такой: почему ничего не работает? Где ты в моем коде нашел неработоспособный код? Прежде чем такие предъявы кидать, ты придерись к чему-нибудь, а не кидайся чем попало.
|
|
|

19.01.2019, 14:45
|
|
Познавший АНТИЧАТ
Регистрация: 16.03.2017
Сообщений: 1,626
С нами:
4821087
Репутация:
133
|
|
Сообщение от dеropleat
Дружочек, вопрос к тебе такой: почему ничего не работает? Где ты в моем коде нашел неработоспособный код? Прежде чем такие предъявы кидать, ты придерись к чему-нибудь, а не кидайся чем попало.
Кстати да, он прав, у тебя ничего не работает
|
|
|

19.01.2019, 14:54
|
|
Участник форума
Регистрация: 16.03.2017
Сообщений: 105
С нами:
4821087
Репутация:
133
|
|
Сообщение от rraggerr
Кстати да, он прав, у тебя ничего не работает
Возможно потому что вы кидаете эти строчки все в 1 функцию? Подразумевалось то, что bool mState - вне функции переменная. Естественно, если вы засунули в одну функцию, то у вас всегда будет выполняться mColor -= fSpeed.
|
|
|

27.01.2019, 10:12
|
|
Новичок
Регистрация: 03.01.2017
Сообщений: 16
С нами:
4925302
Репутация:
0
|
|
Сообщение от dеropleat
Дружочек, вопрос к тебе такой: почему ничего не работает? Где ты в моем коде нашел неработоспособный код? Прежде чем такие предъявы кидать, ты придерись к чему-нибудь, а не кидайся чем попало.
Хорошо, теперь я вижу, что кое-кто не знает, что такое мат. часть. Объясняю, еще раз точные сравнения double, float, да хоть __float128 противопоказаны, т.к. при работе, с числами, которые нельзя представить точно в виде двоичной дроби (например 0.7, 2.19, 1e-5, M_PI и т.п.) ты сталкиваешься с такой вещью, как погрешность, которая мешает тебе сказать, что 0.3+0.6==0.9 (можешь проверить, результат неожиданный, правда?). Вывод такой: слушай оппонента, и не ссылайся на глупость окружающих, неординарный ты мой. А код можно было сделать примерно таким:
C++:
[CODE]
static
bool
mState
=
false
;
mState
?
(
mColor
+=
fSpeed
)
:
(
mColor
-=
fSpeed
)
;
if
(
mColor
>=
cMax
)
mState
=
false
,
mColor
=
cMax
;
if
(
mColor
P.S.: именно это и написал автор топика.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|