-
Notifications
You must be signed in to change notification settings - Fork 1
/
colourObject.cpp
138 lines (122 loc) · 4.1 KB
/
colourObject.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "colourObject.h"
#include <stdlib.h>
#include <math.h>
colourObject::colourObject()
{
}
colourObject::colourObject(char maxValue)
{
_colourBlockCount = 6;
_primaryColours = new char*[_colourBlockCount];
for(_cnt=0; _cnt<_colourBlockCount; _cnt++)
{
_primaryColours[_cnt] = new char[3];
}
for(_cnt=0; _cnt<3; _cnt++)
{
_colourTable[_cnt][0] = 0;
_colourTable[_cnt][1] = 0;
_colourTable[_cnt][2] = 0;
}
for(_cnt=0; _cnt<2; _cnt++)
{
_modifierTable[_cnt][0] = 0;
_modifierTable[_cnt][1] = 0;
_modifierTable[_cnt][2] = 0;
}
_coloursPerBlock = maxValue;
_bandWidth = _coloursPerBlock*_colourBlockCount;
//Fill out default primary colours
//[[255,0,0],[255,255,0],[0,255,0],[0,255,255],[0,0,255],[255,0,255]]
_primaryColours[0][0] = maxValue;
_primaryColours[0][1] = 0;
_primaryColours[0][2] = 0;
_primaryColours[1][0] = maxValue;
_primaryColours[1][1] = maxValue;
_primaryColours[1][2] = 0;
_primaryColours[2][0] = 0;
_primaryColours[2][1] = maxValue;
_primaryColours[2][2] = 0;
_primaryColours[3][0] = 0;
_primaryColours[3][1] = maxValue;
_primaryColours[3][2] = maxValue;
_primaryColours[4][0] = 0;
_primaryColours[4][1] = 0;
_primaryColours[4][2] = maxValue;
_primaryColours[5][0] = maxValue;
_primaryColours[5][1] = 0;
_primaryColours[5][2] = maxValue;
}
colourObject::colourObject(char maxValue, char colourBlockCount, char *rgbColourArray)
{
_colourBlockCount = colourBlockCount;
_primaryColours = new char*[_colourBlockCount];
for(_cnt=0; _cnt<_colourBlockCount; _cnt++)
{
_primaryColours[_cnt] = new char[3];
}
//Init the Colour Table
for(_cnt=0; _cnt<3; _cnt++)
{
_colourTable[_cnt][0] = 0;
_colourTable[_cnt][1] = 0;
_colourTable[_cnt][2] = 0;
}
//Init the Modofier Table
for(_cnt=0; _cnt<2; _cnt++)
{
_modifierTable[_cnt][0] = 0;
_modifierTable[_cnt][1] = 0;
_modifierTable[_cnt][2] = 0;
}
//number of colours between 1 block and its neighbour
_coloursPerBlock = maxValue;
//Total number of colours in this spectrum
_bandWidth = _coloursPerBlock*_colourBlockCount;
//Fill out primary colours based on array passed
for(_cnt=0; _cnt<colourBlockCount; _cnt++)
{
_primaryColours[_cnt][0] = rgbColourArray[_cnt*3];
_primaryColours[_cnt][1] = rgbColourArray[(_cnt*3)+1];
_primaryColours[_cnt][2] = rgbColourArray[(_cnt*3)+2];
}
}
void colourObject::getColour(short int colourIndex, byte *colourBlock)
{
_primColIndex = colourIndex/_coloursPerBlock ;
_colourTable[0][0] = _primaryColours[_primColIndex][0];
_colourTable[0][1] = _primaryColours[_primColIndex][1];
_colourTable[0][2] = _primaryColours[_primColIndex][2];
_colourTable[1][0] = _primaryColours[(_primColIndex+1)%_colourBlockCount][0];
_colourTable[1][1] = _primaryColours[(_primColIndex+1)%_colourBlockCount][1];
_colourTable[1][2] = _primaryColours[(_primColIndex+1)%_colourBlockCount][2];
gradientGenerator(colourIndex%_coloursPerBlock, _coloursPerBlock);
colourBlock[0] = _colourTable[2][0];
colourBlock[1] = _colourTable[2][1];
colourBlock[2] = _colourTable[2][2];
}
void colourObject::gradientGenerator(unsigned short int colourIndex, unsigned short int bandWidth)
{
for(_cnt=0; _cnt<3; _cnt++)
{
//fill modifier
if(_colourTable[1][_cnt]>_colourTable[0][_cnt]) { _modifierTable[0][_cnt]=1; }
else if(_colourTable[1][_cnt]<_colourTable[0][_cnt]) { _modifierTable[0][_cnt]=-1; }
else if(_colourTable[1][_cnt]==_colourTable[0][_cnt]) { _modifierTable[0][_cnt]=0; }
//fill step value
if(_modifierTable[0][_cnt]==1)
{
_modifierTable[1][_cnt] = _colourTable[1][_cnt] - _colourTable[0][_cnt];
}
else if(_modifierTable[0][_cnt]==-1)
{
_modifierTable[1][_cnt] = _colourTable[0][_cnt] - _colourTable[1][_cnt];
}
else if(_modifierTable[0][_cnt]==0)
{
_modifierTable[1][_cnt] = 0;
}
//calculate current gradient between 2 based on the percentile index
_colourTable[2][_cnt] = _colourTable[0][_cnt] + (((float)_modifierTable[1][_cnt]*((float)colourIndex/(float)bandWidth))*_modifierTable[0][_cnt]);
}
}