优雅地上下数

Posted

技术标签:

【中文标题】优雅地上下数【英文标题】:Count up and down elegantly 【发布时间】:2010-11-29 22:38:42 【问题描述】:

我正在尝试制作一个闪烁的对象,即将它的 alpha 值从 0 增加到 255(逐渐),然后返回到 0,然后重复。

有没有办法在不使用布尔值的情况下做到这一点?让它增加很容易:

alpha = time.elapsed()%256;

但是在那之后让它再次倒计时的好方法是什么?

【问题讨论】:

为什么需要这个?请不要说“性能”。如果您想制作一个闪烁的对象,这意味着每秒最多更新 60 次,这意味着无论您如何执行此操作,它在性能方面的差异为零。那么让你的代码更难阅读的原因是什么? @jalf:实际上我们的目标是让它更易于阅读。使用几个 if 语句来跟踪它当前是递增还是递减会使它复杂化。如果这可以在一条线上完成,我会说这更简单。 更短,但我不会说它更简单或更易读。如果它是如此“简单”,你为什么需要问这个问题?你自己也想不通,那么是什么让你相信在 3 个月后遇到代码时你就能弄明白? @jalf:因为有时经过数小时的编程,您的大脑无法正常工作,而您会被更简单的事情所困扰。相信我,我会在 3 个月内理解它。 【参考方案1】:

使用 sin 函数怎么样,这样褪色更令人愉悦,你会得到你想要的。

【讨论】:

alpha = static_cast<int>(sin((time.elapsed()%10)*(M_PI/10))*255);?我想? 10 可以替换为您希望的任何间隔,最好将M_PI/10 替换为常数(例如const double frac = M_PI/10; Hrm...你是对的,我认为这看起来确实稍微好一点。 1000ms 的周期相当不错。【参考方案2】:

也许你可以这样做:

alpha = abs((time.elapsed() % 510) - 254);

【讨论】:

+1 不得不盯着它看一秒钟才能把我的大脑包裹起来 我觉得应该是511和255吧?不应该包括 256。无论如何,知道必须有这样的把戏,我只是忘记了absing。谢谢!效果很好。 这将从 abs(0 % 510 - 254) = 254 开始。这看起来很尴尬。 哦不...然后255重复两次...应该是510和255然后? @Johan:您可以在模内添加+254 使其从 0 开始。【参考方案3】:

abs(((x + 255) % 510) - 255) 将线性地从 0 到 255,x 介于 0 和 255 之间,线性地从 255 到 0,x 介于 255 和 510 之间。然后它重复(带有句点510 当然)。

【讨论】:

我想从技术上讲这是正确的答案,因为我先说增量。 sth的答案是从递减开始,但操作较少,所以我其实更喜欢它。无论哪种方式都可以;)

以上是关于优雅地上下数的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库系列:如何优雅地规划数仓体系

清华集训2016如何优雅地求和

如何在国内优雅地使用Rancher

如何在国内优雅地使用Rancher

如果优雅地关闭ExecutorService提供的java线程池

更加优雅地配置Spring Securiy(使用Java配置和注解)