日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

随机颜色的生成

發(fā)布時(shí)間:2024/10/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机颜色的生成 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://blog.csdn.net/hjh2005/article/details/8821052

有些時(shí)候我們需要為一些對(duì)象附上隨機(jī)的顏色,比如我們有這么一個(gè)需求,在一個(gè)chart里添加顯示曲線(xiàn),剛開(kāi)始曲線(xiàn)的顏色默認(rèn)都是黑色的很不好看,后來(lái)為了顯示的美觀(guān)我們想給添加的曲線(xiàn)隨機(jī)的附上顏色,但是有一個(gè)要求,曲線(xiàn)的顏色不能太淡,比如不能是白色。因?yàn)槲覀兊腸hart的背景顏色是白色的,如果曲線(xiàn)也是白色那曲線(xiàn)就會(huì)看不到了。

????????我們首先想到的方法是如下:

Color c(rand()%256,rand()%256,rand()%256);

??????? 這樣可以實(shí)現(xiàn)我們對(duì)隨機(jī)顏色的要求,但是不滿(mǎn)足我們不能為白色的要求,為了避免白色,我們?cè)趯?duì)這個(gè)顏色進(jìn)行檢查,如果r、g、b分量的值都超過(guò)230,表示顏色太淡重新隨機(jī),但是這樣的方法總讓人感覺(jué)不那么舒服。


????????后來(lái)想到了在HSL顏色空間里做文章是否會(huì)更舒服呢?

????????于是通過(guò)Wiki復(fù)習(xí)HSL顏色空間的知識(shí)。發(fā)現(xiàn)在HSL空間里如果L分量大于200,顏色看起來(lái)就比較淡了,所以我們可以隨機(jī)生成小于200的數(shù)值作為L(zhǎng)分量,再借助強(qiáng)大的Qt于是我們可以這樣實(shí)現(xiàn)我們的需求:

????????首先借助Qt的QColor生成一個(gè)顏色對(duì)象:

QColor qc=QColor::fromHsl(rand()%360,rand()%256,rand()%200);

????????這里要注意的是H分量的值域是0到359的。

????????最后得到的顏色為:

Color c(qc.red(),qc.green(),qc.blue());

????????如果不用Qt的話(huà),網(wǎng)上有很多HSL顏色空間轉(zhuǎn)RGB顏色空間的代碼和公式也可是替代上面用到的Qt。這樣我們就省略了第一種方法里的循環(huán),實(shí)現(xiàn)的方法看起來(lái)更加舒服了。


有些時(shí)候我們可能會(huì)有這樣的需求,比如我們想給一張地圖上色,相鄰的國(guó)家的顏色視覺(jué)區(qū)別要盡可能大,于是我們給的一種或幾種顏色,要找到與這些顏色差別最大的顏色,這要怎么實(shí)現(xiàn)呢?下面是別人寫(xiě)的代碼。我覺(jué)得還是有改進(jìn)的空間的:

[cpp]?view plaincopy
  • static?ColorType?getUniqueColor(const?std::vector<ColorType>&?excludedColors)??
  • ????{??
  • ????????unsigned?int?i,j,k;??
  • ????????ColorType?uniqueColor(0,0,0);??
  • ????????//如果當(dāng)前沒(méi)有顏色??
  • ????????if?(excludedColors.size()==0)??
  • ????????{??
  • ????????????return?uniqueColor;?//因?yàn)闆](méi)有顏色所以隨便返回一個(gè)顏色??
  • ????????}??
  • ????????//如果當(dāng)前只有一個(gè)顏色??
  • ????????if?(excludedColors.size()==1)??
  • ????????{??
  • ????????????int?maxDist=-1;??
  • ????????????int?red=excludedColors[0].mRed;??
  • ????????????int?green=excludedColors[0].mGreen;??
  • ????????????int?blue=excludedColors[0].mBlue;??
  • ??????????????
  • ????????????for?(i=0;i<256;i+=255)??
  • ????????????{??
  • ????????????????for?(j=0;j<256;j+=255)??
  • ????????????????{??
  • ????????????????????for?(k=0;k<256;k+=255)??
  • ????????????????????{??
  • ????????????????????????int?dist=(i-red)*(i-red)+(j-green)*(j-green)+(k-blue)*(k-blue);??
  • ????????????????????????if?(dist>maxDist)??
  • ????????????????????????{??
  • ????????????????????????????maxDist=dist;??
  • ????????????????????????????uniqueColor.mRed=i;??
  • ????????????????????????????uniqueColor.mGreen=j;??
  • ????????????????????????????uniqueColor.mBlue=k;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ?????????????return?uniqueColor;??
  • ????????}??
  • ??
  • ????????std::vector<unsigned?int>?badColors;??
  • ????????badColors.reserve(excludedColors.size());??//預(yù)留空間??
  • ??
  • ????????std::vector<ColorType>::const_iterator?iter;??
  • ????????for?(iter=excludedColors.begin();iter!=excludedColors.end();iter++)??
  • ????????{??
  • ????????????badColors.push_back((iter->mBlue<<16)+(iter->mGreen<<8)+iter->mRed);??
  • ????????}??
  • ??
  • ????????std::sort(badColors.begin(),badColors.end());??
  • ??
  • ????????unsigned?int?duplicates=0;??
  • ????????unsigned?int?next;??
  • ??
  • ????????for?(i=0,next=1;i<badColors.size()-duplicates;i++)??
  • ????????{??
  • ????????????for?(j?=?next;?j?<?badColors.size();?j++)??
  • ????????????{??
  • ????????????????if?(badColors[i]?!=?badColors[j])??
  • ????????????????{??
  • ????????????????????badColors[i?+?1]?=?badColors[j];??
  • ????????????????????next?=?j?+?1;??
  • ????????????????????break;??
  • ????????????????}??
  • ????????????????else??
  • ????????????????{??
  • ????????????????????duplicates++;??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????badColors.erase(badColors.begin()?+?(badColors.size()?-?duplicates),?badColors.end());??
  • ??
  • ????????std::vector<unsigned?int>::iterator?ulit?=?badColors.begin();??
  • ????????unsigned?int?testColor;??
  • ????????for?(testColor?=?0;?testColor?<?0xffffff;?testColor++)??
  • ????????{??
  • ????????????if?(testColor?==?*ulit)??
  • ????????????{??
  • ????????????????ulit++;??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????if?(testColor?==?0x01000000)??//?如果搜遍了16.7百萬(wàn)的顏色都沒(méi)找到的話(huà),則返回?zé)o效的顏色??
  • ????????{??
  • ????????????uniqueColor?=?ColorType();??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????uniqueColor.mBlue?=?(testColor&0xff0000)>>16;??
  • ????????????uniqueColor.mGreen?=?(testColor&0xff00)>>8;??
  • ????????????uniqueColor.mRed?=?testColor&0xff;??
  • ????????}??
  • ??
  • ????????return?uniqueColor;??
  • ????}??

  • ColorType是顏色類(lèi)型,里面包含了三個(gè)分量。


    如果我們要同時(shí)獲取多個(gè)不同的顏色呢?可以參考下面的代碼:

    [cpp]?view plaincopy
  • /**?
  • ?????*?產(chǎn)生一個(gè)或多個(gè)唯一的顏色?
  • ?????*?@param?count?要產(chǎn)生的顏色的個(gè)數(shù)?
  • ?????*?@param?colors?用于保存生成顏色的向量?
  • ?????*?@param?excludeColors?要排除的顏色?
  • ?????*?@return?產(chǎn)生的顏色的個(gè)數(shù)?
  • ?????*/??
  • ???static?unsigned?int?getUniqueColors(unsigned?int?count,?std::vector<ColorType>&?colors,??
  • ????????const?std::vector<ColorType>&?excludeColors)??
  • ????{??
  • ????????unsigned?int?i,?j,?k,?l;??
  • ????????unsigned?int?numUnique?=?0;??
  • ????????double?slValues[]?=?{0.0,?1.0,?0.5,?0.8,?0.3,?0.6,?0.9,?0.2,?0.7,?0.4,?0.1};??
  • ????????ColorType?baseColors[]?=??
  • ????????{??
  • ????????????ColorType(0,0,255),??
  • ????????????ColorType(0,255,0),??
  • ????????????ColorType(255,0,0),??
  • ????????????ColorType(0,255,255),??
  • ????????????ColorType(255,255,0),??
  • ????????????ColorType(255,0,255),??
  • ????????????ColorType(255,255,255)??
  • ????????};??
  • ??
  • ????????for?(i?=?0;?i?<?sizeof(slValues)?/?sizeof(slValues[0]);?i++)??
  • ????????{??
  • ????????????for?(j?=?0;?j?<?sizeof(slValues)?/?sizeof(slValues[0]);?j++)??
  • ????????????{??
  • ????????????????for?(k?=?0;?k?<?sizeof(baseColors)?/?sizeof(baseColors[0]);?k++)??
  • ????????????????{??
  • ????????????????????int?newColor[3];??
  • ????????????????????int?maxValue;??
  • ??
  • ????????????????????newColor[0]?=?(int)?(baseColors[k].mRed?*?slValues[j]?+?0.5);??
  • ????????????????????newColor[1]?=?(int)?(baseColors[k].mGreen?*?slValues[j]?+?0.5);??
  • ????????????????????newColor[2]?=?(int)?(baseColors[k].mBlue?*?slValues[j]?+?0.5);??
  • ??
  • ????????????????????maxValue?=?0;??
  • ????????????????????for?(l?=?0;?l?<?3;?l++)??
  • ????????????????????{??
  • ????????????????????????if?(newColor[l]?>?maxValue)??
  • ????????????????????????{??
  • ????????????????????????????maxValue?=?newColor[l];??
  • ????????????????????????}??
  • ????????????????????}??
  • ??
  • ????????????????????maxValue?=?(int)?(maxValue?*?slValues[i]?+?0.5);??
  • ????????????????????for?(l?=?0;?l?<?3;?l++)??
  • ????????????????????{??
  • ????????????????????????if?(newColor[l]?<?maxValue)??
  • ????????????????????????{??
  • ????????????????????????????newColor[l]?=?maxValue;??
  • ????????????????????????}??
  • ????????????????????}??
  • ??
  • ????????????????????ColorType?colorToInsert;??
  • ????????????????????colorToInsert.mRed?=?newColor[0];??
  • ????????????????????colorToInsert.mGreen?=?newColor[1];??
  • ????????????????????colorToInsert.mBlue?=?newColor[2];??
  • ??
  • ????????????????????for?(l=0;?l<excludeColors.size();?l++)??
  • ????????????????????{??
  • ????????????????????????if?(excludeColors[l].mRed?==?colorToInsert.mRed?&&??
  • ????????????????????????????excludeColors[l].mGreen?==?colorToInsert.mGreen?&&??
  • ????????????????????????????excludeColors[l].mBlue?==?colorToInsert.mBlue)??
  • ????????????????????????{??
  • ????????????????????????????break;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????????if?(l?==?excludeColors.size())??
  • ????????????????????{??
  • ????????????????????????for?(l?=?0;?l?<?colors.size();?l++)??
  • ????????????????????????{??
  • ????????????????????????????if?(colors[l].mRed?==?colorToInsert.mRed?&&??
  • ????????????????????????????????colors[l].mGreen?==?colorToInsert.mGreen?&&??
  • ????????????????????????????????colors[l].mBlue?==?colorToInsert.mBlue)??
  • ????????????????????????????{??
  • ????????????????????????????????break;??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????????if?(l?==?colors.size())??
  • ????????????????????????{??
  • ????????????????????????????colors.push_back?(colorToInsert);??
  • ????????????????????????????++numUnique;??
  • ????????????????????????????if?(colors.size()?==?count)??
  • ????????????????????????????{??
  • ????????????????????????????????return?numUnique;??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????return?numUnique;??
  • ????} ?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/lgh1992314/p/5834797.html

    總結(jié)

    以上是生活随笔為你收集整理的随机颜色的生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。