当前位置:  开发笔记 > 编程语言 > 正文

在两种颜色之间进行插值的最有效方法是什么?(预期伪代码和按位运算)

如何解决《在两种颜色之间进行插值的最有效方法是什么?(预期伪代码和按位运算)》经验,为你挑选了2个好方法。

制作Blackberry应用程序,需要一个Gradient类.插入两种颜色的最有效方式(如速度和电池寿命)是什么?请具体说明.

// Java, of course
int c1 = 0xFFAA0055   // color 1, ARGB
int c2 = 0xFF00CCFF   // color 2, ARGB
float st = 0          // the current step in the interpolation, between 0 and 1

从这里开始帮助.我应该将每种颜色的每个通道分开,将它们转换为十进制和插值吗?有更简单的方法吗?

interpolatedChannel = red1+((red2-red1)*st)
interpolatedChannel = interpolatedChannel.toString(16)

这是正确的做法吗?如果速度和有效性在移动应用程序中很重要,我应该使用按位操作吗?

帮我!



1> Raymond Mart..:

你必须分开频道,但没有必要将它们转换为十进制.

例如,如果允许256个可能的渐变:

red = red1 + ((red2 - red1) * stage / 256)

编辑:既然你说你不太了解位管理,这里有一个快速分割渠道的方法:

red = color & 0x000000ff;
green = color & 0x0000ff00;
blue = color & 0x00ff0000;
alpha = color >> 24;

并将它们组合起来:

color = (alpha << 24) | blue | green | red;

从这里开始,细节通常应由编译器优化处理.如果有的话,你正在寻找最好的算法.



2> Quasimondo..:
private function interpolateColorsCompact( a:int, b:int, lerp:Number ):int
{ 
   var MASK1:int = 0xff00ff; 
   var MASK2:int = 0x00ff00; 

   var f2:int = 256 * lerp;
   var f1:int = 256 - f2;

   return   ((((( a & MASK1 ) * f1 ) + ( ( b & MASK1 ) * f2 )) >> 8 ) & MASK1 ) 
          | ((((( a & MASK2 ) * f1 ) + ( ( b & MASK2 ) * f2 )) >> 8 ) & MASK2 );

} 

不确定这是否是最紧凑的方式,但它使用较少的局部变量和较少的运算符,而不是首先将它们分成3个通道的经典方法.

哦 - 抱歉这是Actionscript,但应该清楚如何将其转换为Java.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有