Java не принимает неподписанные байты, и я пытаюсь отобразить их - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно отобразить 2 байта, так что если начальная позиция (или цвет rgb, который закодирован в байтах) начинается с 255 (или что-нибудь выше 127), и она должна заканчиваться на 0, в строкенапример 30 сегментов.Математика довольно проста: вы просто делаете ((0-255 * сегмент) / 30) (255-0), и для каждого сегмента у вас будет немного меньше байта.В любом случае, это просто математика для линейного смешивания, в других языках есть функция map, которая делает именно это. Пример Map в 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));
    }


}

1 Ответ

0 голосов
/ 25 ноября 2018

Хотя языковая поддержка для неподписанных байтов была бы хорошей, возможно, лучшим выбором, чем подписанные байты, вы можете легко конвертировать один в другой.

byte b = // some signed value
int unsigned = b & 0xFF;

Короче, все вычисления выполняйте как int значения и приводятся только к байту для хранения или совместимости.

Поскольку вы смешиваете, возможно, большое количество пикселей, вы можете даже использовать float или double для своих вычислений и привести кбайт при необходимости.

...