【发布时间】:2019-04-26 23:57:41
【问题描述】:
我需要映射 2 个字节,这样如果起始位置(或以字节编码的 rgb 颜色)以 255(或 127 以上的任何值)开始,并且它需要以 0 结束,在一行例如 30 段。数学很简单:您只需制作 ((0-255*segment)/30)(255-0) ,对于每个段,您将拥有更少的字节。这只是线性混合的数学 无论如何,其他语言有一个叫做 map 的函数可以做到这一点。 Example of Map in C++ 但问题是我在java中需要这个功能。所以我决定自己做。原因是因为我需要将颜色从一侧混合到另一侧。所以我做了这个简单的应用程序,但它不起作用,因为当计算的字节数超过 127 时,java 认为它的值低于起点。 代码在这里。第一个函数是尝试淡出的java方法,第二个函数是尝试进行映射计算的函数:
public ColorRGB[] olas(ColorRGB color1, ColorRGB color2) {
ColorRGB[] colordevuelto=new ColorRGB[30];
byte longuitud=30;
//so we get two colors and fade and merge them at some point
for(byte h=0;h<longuitud;h++) {
byte rojofinal= map(color1.getRed(),color2.getRed(),(byte) 0,longuitud,h);
byte azulfinal= map(color1.getBlue(),color2.getBlue(),(byte) 0,longuitud,h);
byte verdefinal= map(color1.getGreen(),color2.getGreen(),(byte) 0,longuitud,h);
System.out.println("Led num: "+h+"Componente roja: "+ Byte.toString(rojofinal)+" componente verde: "+Byte.toString(verdefinal)+" componente azul "+Byte.toString(azulfinal));
colordevuelto[h]=new ColorRGB(rojofinal,verdefinal,azulfinal);
}
return colordevuelto; //devuelve un array de color fadeado a lo largo de 30 pixeles
}
private byte map (byte xinicio, byte xfinal,byte ymin,byte ymax, byte point) {
//this funtion is for mapping from one side to another
if(point > ymax || point <ymin) {
return 0; //Esto no deberia pasar nunca
}
if(xfinal>xinicio) {
return (byte) (((xfinal-xinicio)*point)/(ymax-ymin));
}
else {
return (byte) (((xfinal-xinicio)*point)/(ymax-ymin)+(xinicio-xfinal));
}
}
【问题讨论】:
-
什么是 ColorRGB?能贴出它的代码吗?
-
@Eugene 好的,谢谢。
-
我不太明白你的问题,但是为什么不使用 16 位的
char,或者如果你真的要使用带有掩码的int? -
要将字节
b转换为 0-255 值,您可以执行b & 0xFF现在它是一个无符号字节(实际上它是一个int,但具有无符号字节的范围) -
@PeterLawrey 可能会回答这个问题,我真的很懒惰,我会投票赞成
标签: java dictionary byte unsigned