要求每次取得的颜色对比要尽量地大,并且能无限次重复调用。
我现在用的是下面的方法,不过效果不很好,对比度不高,而且重复周期太短,数组中只有26种颜色,而且是静态的。
希望有一种动态生成算法。public class ColorGenerator{
  private static int no = 0;
  private static Color[] colors = {
      new Color(0, 0, 0),
      new Color(0, 0, 127),
      new Color(0, 0, 255),
      new Color(0, 127, 0),
      new Color(0, 127, 127),
      new Color(0, 127, 255),
      new Color(0, 255, 0),
      new Color(0, 255, 127),
      new Color(0, 255, 255),      new Color(127, 0, 0),
      new Color(127, 0, 127),
      new Color(127, 0, 255),
      new Color(127, 127, 0),
      new Color(127, 127, 127),
      new Color(127, 127, 255),
      new Color(127, 255, 0),
      new Color(127, 255, 127),
      new Color(127, 255, 255),      new Color(255, 0, 0),
      new Color(255, 0, 127),
      new Color(255, 0, 255),
      new Color(255, 127, 0),
      new Color(255, 127, 127),
      new Color(255, 127, 255),
      new Color(255, 255, 0),
      new Color(255, 255, 127)
  };  public static Color getColor(){
    if(no == colors.length){
      no = 0;
    }
    return colors[no ++];
  }
}

解决方案 »

  1.   

    你这种方法的确不是很明智!
    你可以用随机数来生成颜色啊,将随机数传入color的构造函数!
      

  2.   

    你可以直接在需要时用随机数生成RGB三色的值,然后组合成Color对象。
      

  3.   

    或者把Color数组替换为r,g,b数组,然后用r,g,b三个数组中的元素组合成Color
      

  4.   

    我再来明确一下问题,我的应用要求相邻的两次调用返回的颜色不但不能相同,而且对人眼来说应该是对比色,比如红色和蓝色,这样人眼比较容易区分。所以用纯粹随机的方法不妥。这个问题有点难,因为还需要有颜色这方面的知识,不是简单地R、G、B组合起来就可以的。等待你们的好主意!
      

  5.   

    也不是很难,明确一下, 楼主是要不停的调用,又要绝对对比色的话...第一次产生a Color, a 的对比色是 b那么 b 的对比色又会是 a,
    如果可以在对比色的周围取的话就可以解决.
      

  6.   

    to  knight6892():
    当然不是绝对的对比色,我的意思只是要让两种颜色对人眼来说是容易区别的。
      

  7.   

    取颜色容易,楼主的意思好象是要取对比度相对较大的颜色吧?既然是要取对比度大的颜色,当然就必须要个可以相对比的颜色啊。
    有了参考的颜色,取与这个颜色对比度大的应该不难了吧。
    比如用颜色new Color(0,0,0)做参数,生成一个Color(127~255,127~255,127~255)的颜色。
    这样应该可以吧。对颜色没有什么研究,希望可以做个参考
      

  8.   

    楼主先说一下如何定义对比色,特别是两组(r,g,b)中的比例达到什么标准才叫对比度高
      

  9.   

    //try this, 细节部分可自己调整看import java.awt.Color;
    import java.util.Random;public class ColorGenerator{  private Random random=new Random();
      private int    adjustNumber=40;   //对比度调整数值
      private Color  lastColor=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
      private Color  newColor;  public Color getColor(){
    int red=(255-lastColor.getRed()+random.nextInt(adjustNumber))%255;
    int green=(255-lastColor.getGreen()+random.nextInt(adjustNumber))%255;
    int blue=(255-lastColor.getBlue()+random.nextInt(adjustNumber))%255; newColor=new Color(red,green,blue);
    lastColor=newColor;
    return newColor;
      }  public static void main(String[] args)
    {
      ColorGenerator cg=new ColorGenerator();
      for(int i=0;i<10;i++)
    {
      System.out.println(cg.getColor());
    }
    }
    }
      

  10.   

    to knight6892(),谢谢你的努力。还有问题,两次生成的代码基本上是用 255 做减法得到的,所以如果调用多次的话,会发现这些颜色可以分成两组,总在两个端点之间摆动。我需要多次调用得到的颜色是两两之间都可以区分开来。我自己也试了很多方法,但效果都不理想。欢迎大家继续发言。
      

  11.   

    看有没有基于HSL色彩空间的java函数
      

  12.   

    可以告诉你
    s=b=100的时候
    h的相邻两个值只要间隔在40(h的取值0-359)以上,对比度应该可以
      

  13.   

    to  cfsego(陈传文):很有见地,谢谢。不过这种方法最多只能生成10种颜色吧。绕了一大圈,还是用我最初的苯办法了。谢谢大伙帮忙,都有分。谁还有什么好点子,欢迎email讨论:[email protected]