一个简单的随机色生成器

来源:互联网 发布:韩子高网络剧第二部 编辑:程序博客网 时间:2024/04/30 04:16

一个简单的随机色生成器

可以放便的生成随机色和指定范围内的随机色(随机渐变色).

main.cpp

// main.cpp : 定义控制台应用程序的入口点。// cvcore 2.4.8#include "stdafx.h"#include <cv.h>#include <cxcore.h>#include <highgui.h>#include <iostream>using namespace std;#include "cColorRandomMaker.class.h"#include <windows.h>#include <time.h>int _tmain(int argc, _TCHAR* argv[]){colorRandomMaker *rcg = new colorRandomMaker(_time64(nullptr));// 颜色A和颜色Bfloat colora[3] = { 0.1f, 0.2f, 0.5f };float colorb[3] = { 0.9f, 0.3f, 0.7f };float colorr[3] = { 0.f };IplImage *img = cvCreateImage(cvSize(800, 100), 8, 3);memset(img->imageData, 0, 500 * 100 * 3);// 从颜色A到B的渐变色for (int col = 0; col < img->width; col+=4){CvScalar color = cvScalar(((double)col / img->width * (colorb[0] - colora[0]) + colora[0]) * 255,((double)col / img->width * (colorb[1] - colora[1]) + colora[1]) * 255,((double)col / img->width * (colorb[2] - colora[2]) + colora[2]) * 255);cvLine(img, cvPoint(col, 0), cvPoint(col, 100), color, 4);}cvShowImage("渐变色", img);// 随机色(每个像素都是随机的颜色)for (int col = 0; col < img->width; col+=4){CvScalar color = cvScalar(rcg->randomInRange(0.f, 1.f) * 255.0,rcg->randomInRange(0.f, 1.f) * 255.0,rcg->randomInRange(0.f, 1.f) * 255.0);cvLine(img, cvPoint(col, 0), cvPoint(col, 100), color, 4);}cvShowImage("随机色", img);// 介于颜色A和颜色B之间的随机渐变色for (int col = 0; col < img->width; col += 4){rcg->colorInRange(colora, colorb, colorr);CvScalar color = cvScalar(colorr[0] * 255.0,colorr[1] * 255.0,colorr[2] * 255.0);cvLine(img, cvPoint(col, 0), cvPoint(col, 100), color, 4);}cvShowImage("随机渐变色", img);cvWaitKey();return 0;}



比如下面图片显示了从{<0.1f, 0.2f, 0.5f>到< 0.9f, 0.3f, 0.7f >两种颜色的逐渐变化过程.


使用 colorRandomMaker::randomInRange(...)可以为每一个通道随机指定一个颜色分量


也可以使用 colorRandomMaker::colorInRange(...) 指定随机颜色的范围后生成一个随机渐变色


cRandomMaker.class.h 文件

////////////////////////////////////////////////////////////////////////////////// 随机数////////////////////////////////////////////////////////////////////////////////#pragma once#include "stdafx.h"#include <vector>using std::vector;#define RANDOM_COEFF4164903690U#ifndef uchar#define uchar unsigned char#endif#ifndef schar #define schar char#endif#ifndef ushort#define ushort unsigned short#endif#ifndef uint32#define uint32 unsigned int#endif#ifndef uint64#define uint64 unsigned __int64 #endif/** 产生随机数*/class randomMaker{public:// 构造randomMaker() { m_state = 0xffffffff; }randomMaker(uint64 state) { m_state = ((state) ? (state) : (0xffffffff)); }public:// 返回整形随机数uint32nexti32();ushortnextus();shortnexts();// 随机boolboolnextb();// 返回8位随机数uchar nextuc();schar nextc();// 返回浮点随机数floatnextf();doublenextd();// 返回受范围限制的随机数intrandomInRange(const int &a, const int &b);floatrandomInRange(const float &a, const float &b);doublerandomInRange(const double &a, const double &b);ucharrandomInRange(const uchar &a, const uchar &b);protected:uint64 m_state;};/** 并返回下一个32位整形/短整型随机数*/inline uint32 randomMaker::nexti32(){m_state = (uint64)(m_state*RANDOM_COEFF + (m_state >> 32));return (uint32)m_state;}inline ushort randomMaker::nextus() { return (ushort)nexti32(); }inline short randomMaker::nexts() { return (short)nexti32(); }/** 随机BOOL*/inline bool randomMaker::nextb() { return (nexti32() > UINT_MAX / 2) ? (true) : (false); }/** 返回下一个8位有/无符号随机数*/inline uchar randomMaker::nextuc() { return (uchar)nexti32(); }inline charrandomMaker::nextc() { return (schar)nexti32(); }/** 返回下一个浮点/双浮点随机数*/inline float randomMaker::nextf() { return nexti32()*2.3283064365386962890625e-10f; }inline double randomMaker::nextd(){uint32 t = nexti32();return (((__int64)t << 32) | nexti32())*5.4210108624275221700372640043497e-20;}/** 产生 a-b 范围的随机数*/inline intrandomMaker::randomInRange(const int &a, const int &b) { return a == b ? a : (nexti32() % (b - a) + a); }inline float randomMaker::randomInRange(const float &a, const float &b) { return nextf()*(b - a) + a; }inline double randomMaker::randomInRange(const double &a, const double &b) { return nextd()*(b - a) + a; }inline uchar randomMaker::randomInRange(const uchar &a, const uchar &b) { return a == b ? a : (nextuc() % (b - a) + a); }


cRandomMaker.class.cpp 文件

////////////////////////////////////////////////////////////////////////////////// 随机数////////////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "cRandomMaker.class.h"


cColorRandomMaker.class.h文件

////////////////////////////////////////////////////////////// 随机色产生器////////////////////////////////////////////////////////////#pragma once#include "cRandomMaker.class.h"/** 产生随机色*/class colorRandomMaker :public randomMaker{public:colorRandomMaker() {}colorRandomMaker(uint64 state) :randomMaker(state) {}public:// 返回随机色(0.f-1.f)void nextfcolor(float* result);// 返回随机色(0-255)void nexticolor(int* result);void nextbcolor(uchar* result);// 返回受范围限制的随机色void colorInRange(float* lclamp, float* rclamp, float* result);void colorInRange(int* lclamp, int* rclamp, int* result);void colorInRange(uchar* lclamp, uchar* rclamp, uchar* result);};/** 返回随机色(0.f-1.f)*/inline void colorRandomMaker::nextfcolor(float* result){result[0] = this->randomInRange(0.f, 1.f);result[1] = this->randomInRange(0.f, 1.f);result[2] = this->randomInRange(0.f, 1.f);}/** 返回随机色(0-255)*/inline void colorRandomMaker::nexticolor(int* result){result[0] = this->randomInRange(0, 255);result[1] = this->randomInRange(0, 255);result[2] = this->randomInRange(0, 255);}/** 返回随机色(0-255)*/inline void colorRandomMaker::nextbcolor(uchar* result){result[0] = this->randomInRange((uchar)0, (uchar)255);result[1] = this->randomInRange((uchar)0, (uchar)255);result[2] = this->randomInRange((uchar)0, (uchar)255);}

cColorRandomMaker.class.cpp

////////////////////////////////////////////////////////////// 随机色产生器////////////////////////////////////////////////////////////#include "stdafx.h"#include "cColorRandomMaker.class.h"/** 返回受范围限制的随机色*/void colorRandomMaker::colorInRange(float* lclamp, float* rclamp, float* result){float factor = this->randomInRange(0.f, 1.f);result[0] = (rclamp[0] - lclamp[0]) * factor + lclamp[0];result[1] = (rclamp[1] - lclamp[1]) * factor + lclamp[1];result[2] = (rclamp[2] - lclamp[2]) * factor + lclamp[2];}/** 返回受范围限制的随机色*/void colorRandomMaker::colorInRange(int* lclamp, int* rclamp, int* result){float factor = this->randomInRange(0.f, 1.f);result[0] = (int)((rclamp[0] - lclamp[0]) * factor) + lclamp[0];result[1] = (int)((rclamp[1] - lclamp[1]) * factor) + lclamp[1];result[2] = (int)((rclamp[2] - lclamp[2]) * factor) + lclamp[2];}/** 返回受范围限制的随机色*/void colorRandomMaker::colorInRange(uchar* lclamp, uchar* rclamp, uchar* result){float factor = this->randomInRange(0.f, 1.f);result[0] = (uchar)(((int)rclamp[0] - (int)lclamp[0]) * factor) + lclamp[0];result[1] = (uchar)(((int)rclamp[1] - (int)lclamp[1]) * factor) + lclamp[1];result[2] = (uchar)(((int)rclamp[2] - (int)lclamp[2]) * factor) + lclamp[2];}



0 0
原创粉丝点击