Color в ChatColor

serega6531

Старожил
Девелопер
Пользователь
Баллы
173
У меня есть Color (Простой, а не из баккита). Как его сконвертировать в CharColor, чтобы хоть немного было похоже?
 
У меня есть Color (Простой, а не из баккита). Как его сконвертировать в CharColor, чтобы хоть немного было похоже?
Что значит "сконвертировать" - есть определённый набор цвето с которыми придётся жить и мириться, обычных методов для вставки других цветов я не наблюдаю, поэтому просто на глазок сам определяй - к чему этот цвет больше подходит.
 
Код:
    Color[] colors = {
            new Color(0, 0, 0),
            new Color(0, 0, 170),
            new Color(0, 170, 0),
            new Color(0, 170, 170),
            new Color(170, 0, 0),
            new Color(170, 0, 170),
            new Color(255, 170, 0),
            new Color(170, 170, 170),
            new Color(85, 85, 85),
            new Color(85, 85, 255),
            new Color(85, 255, 85),
            new Color(85, 255, 255),
            new Color(255, 85, 85),
            new Color(255, 85, 255),
            new Color(255, 255, 85),
            new Color(255, 255, 255)
        };
 
    private ChatColor colorToChatColor(Color color){
        if(color.getAlpha() < 128) return ChatColor.WHITE;
       
        int best = -1;
        int index = 0;
       
        for(int i = 0; i < 16; i++) {
             
            double distance = getDistance(color, colors[i]);
           
            if (distance < best || best == -1) {
                best = (int) distance;
                index = i;
            }
        }
        return ChatColor.values()[index];
    }
Вот такое будет работать?
 
Последнее редактирование:
Код:
    Color[] colors = {
            new Color(0, 0, 0),
            new Color(0, 0, 170),
            new Color(0, 170, 0),
            new Color(0, 170, 170),
            new Color(170, 0, 0),
            new Color(170, 0, 170),
            new Color(255, 170, 0),
            new Color(170, 170, 170),
            new Color(85, 85, 85),
            new Color(85, 85, 255),
            new Color(85, 255, 85),
            new Color(85, 255, 255),
            new Color(255, 85, 85),
            new Color(255, 85, 255),
            new Color(255, 255, 85),
            new Color(255, 255, 255)
        };

    private ChatColor colorToChatColor(Color color){
        if(color.getAlpha() < 128) return ChatColor.WHITE;
      
        int best = -1;
        int index = 0;
      
        for(int i = 0; i < 16; i++) {
            
            double distance = getDistance(color, colors[i]);
          
            if (distance < best || best == -1) {
                best = (int) distance;
                index = i;
            }
        }
        return ChatColor.values()[index];
    }
Вот такое будет работать?
http://algolist.manual.ru/graphics/find_col.php
 
Я использую это:
Код:
    private double getDistance(Color c1, Color c2) {
        double rmean = (c1.getRed() + c2.getRed()) / 2.0;
        double r = c1.getRed() - c2.getRed();
        double g = c1.getGreen() - c2.getGreen();
        int b = c1.getBlue() - c2.getBlue();

        double weightR = 2 + rmean / 256.0;
        double weightG = 4.0;
        double weightB = 2 + (255 - rmean) / 256.0;

        return weightR * r * r + weightG * g * g + weightB * b * b;
    }
Так будет работать?
 
Я использую это:
Код:
    private double getDistance(Color c1, Color c2) {
        double rmean = (c1.getRed() + c2.getRed()) / 2.0;
        double r = c1.getRed() - c2.getRed();
        double g = c1.getGreen() - c2.getGreen();
        int b = c1.getBlue() - c2.getBlue();

        double weightR = 2 + rmean / 256.0;
        double weightG = 4.0;
        double weightB = 2 + (255 - rmean) / 256.0;

        return weightR * r * r + weightG * g * g + weightB * b * b;
    }
Так будет работать?
Я тебе дал алгоритм, я не взять и протестировать насколко он правилен и функционален.
 
Я тебе дал алгоритм, я не взять и протестировать насколко он правилен и функционален.
Хорошо, спасибо.
Получается:
Код:
    private double getDistance(Color c1, Color c2){
        int r, g, b;
      
        r = c2.getRed() - c1.getRed();
        g = c2.getGreen() - c1.getGreen();
        b = c2.getBlue() - c1.getBlue();
      
        return 60 * r + 118 * g +  22 * b;
    }
Так?
 
Хорошо, спасибо.
Получается:
Код:
    private double getDistance(Color c1, Color c2){
        int r, g, b;
     
        r = c2.getRed() - c1.getRed();
        g = c2.getGreen() - c1.getGreen();
        b = c2.getBlue() - c1.getBlue();
     
        return 60 * r + 118 * g +  22 * b;
    }
Так?
Возьми и протестриуй, напиши несколько юнит тестов, сделай какую-нить графическую утилитку и смотри.
 
Назад
Верх