1 //---------------------------------------------------------------------------
\r
6 #include "QDrawHSVGraph.h"
\r
8 //---------------------------------------------------------------------------
\r
9 #pragma package(smart_init)
\r
10 //---------------------------------------------------------------------------
\r
14 QDrawHSVGraph::QDrawHSVGraph(TCanvas *_canvas) {
\r
20 //---------------------------------------------------------------------------
\r
21 void QDrawHSVGraph::SetSize(int BoxSize) {
\r
23 BoxDepth = int(0.4 * BoxWidth);
\r
24 BoxMaxHeight = 2 * BoxWidth;
\r
25 BoxOffset = (0.2 * BoxWidth);
\r
27 TopMargin = BoxMaxHeight + 10;
\r
30 //---------------------------------------------------------------------------
\r
34 void QDrawHSVGraph::DrawBox(int _x, int _y, int height, double theta) {
\r
35 TColor c1 = GetColor(theta, 1.0);
\r
36 TColor c2 = GetColor(theta, 0.8);
\r
37 TColor c3 = GetColor(theta, 0.6);
\r
39 SetPenColor(clDkGray);
\r
40 //Draw rightside surface
\r
41 Canvas->MoveTo(_x + BoxWidth , _y);
\r
42 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y + BoxDepth);
\r
43 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y + BoxDepth - height);
\r
44 Canvas->LineTo(_x + BoxWidth , _y - height);
\r
45 Canvas->LineTo(_x + BoxWidth , _y);
\r
47 Canvas->FloodFill(_x + BoxWidth - 1, _y - 1, clDkGray, fsBorder);
\r
48 SetPenColor(clBlack);
\r
49 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y + BoxDepth);
\r
50 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y + BoxDepth - height);
\r
51 Canvas->LineTo(_x + BoxWidth , _y - height);
\r
52 Canvas->LineTo(_x + BoxWidth , _y);
\r
54 //Draw front surface
\r
56 TRect rc(_x - BoxOffset, _y + BoxDepth - height,
\r
57 _x - BoxOffset + BoxWidth + 1, _y + BoxDepth + 1);
\r
58 Canvas->FillRect(rc);
\r
59 SetBrushColor(clBlack);
\r
60 Canvas->FrameRect(rc);
\r
63 SetPenColor(clDkGray);
\r
64 Canvas->MoveTo(_x , _y - height);
\r
65 Canvas->LineTo(_x + BoxWidth , _y - height);
\r
66 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y - height + BoxDepth);
\r
67 Canvas->LineTo(_x - BoxOffset, _y - height + BoxDepth);
\r
68 Canvas->LineTo(_x , _y - height);
\r
70 Canvas->FloodFill(_x + 1, _y - height + 1, clDkGray, fsBorder);
\r
71 SetPenColor(clBlack);
\r
72 Canvas->LineTo(_x + BoxWidth , _y - height);
\r
73 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y - height + BoxDepth);
\r
74 Canvas->LineTo(_x - BoxOffset, _y - height + BoxDepth);
\r
75 Canvas->LineTo(_x , _y - height);
\r
78 //---------------------------------------------------------------------------
\r
79 void QDrawHSVGraph::DrawBoxBase(int _x, int _y) {
\r
80 TColor cl = clLtGray;
\r
82 SetPenColor(clBlack);
\r
83 Canvas->MoveTo(_x , _y);
\r
84 Canvas->LineTo(_x + BoxWidth , _y);
\r
85 Canvas->LineTo(_x + BoxWidth - BoxOffset, _y + BoxDepth);
\r
86 Canvas->LineTo(_x - BoxOffset, _y + BoxDepth);
\r
87 Canvas->LineTo(_x, _y);
\r
89 Canvas->FloodFill(_x + 1, _y + 1, clBlack, fsBorder);
\r
92 //---------------------------------------------------------------------------
\r
93 TColor QDrawHSVGraph::GetColor(double theta, double abVal) {
\r
94 double value = theta*56;
\r
112 float p1 = v * (1 - s);
\r
113 float p2 = v * (1 - s*f);
\r
114 float p3 = v * (1 - s*(1 - f));
\r
115 if (i == 0) { r = v; g = p3; b = p1; }
\r
116 if (i == 1) { r = p2;g = v; b = p1; }
\r
117 if (i == 2) { r = p1;g = v; b = p3; }
\r
118 if (i == 3) { r = p1;g = p2; b = v; }
\r
119 if (i == 4) { r = p3;g = p1; b = v; }
\r
120 if (i == 5) { r = v; g = p1; b = p2; }
\r
122 int R = (int)(r*255);
\r
123 int G = (int)(g*255);
\r
124 int B = (int)(b*255);
\r
126 TColor Color = TColor(0x10000*R+0x100*G+B);
\r
129 //------------------------------------------------------------------------
\r
130 void QDrawHSVGraph::DrawTest(void) {
\r
131 //DrawBox(100, 100, 50, 0);
\r
132 DrawBoxBase(100, 100);
\r
134 //------------------------------------------------------------------------
\r
135 void QDrawHSVGraph::DrawAll(QBits * qBits) {
\r
137 SetBrushColor(clWhite);
\r
138 Canvas->FloodFill(1, 1, clDkGray, fsBorder);
\r
140 const int N = qBits->GetNumberOfStates();
\r
141 const double eps = 1.0e-20;
\r
143 for (int i = 0; i < N; i++) {
\r
144 double im = qBits->NthStateI(i);
\r
145 double re = qBits->NthStateR(i);
\r
146 double R = sqrt(im * im + re * re);
\r
147 double theta = 3.1416 + atan2(im, re + eps);
\r
149 int ix = i % ColumnNumber;
\r
150 int iy = (i - ix) / ColumnNumber;
\r
151 int x = LeftMargin + ix * BoxWidth - iy * BoxOffset;
\r
152 int y = TopMargin + iy * BoxDepth;
\r
157 DrawBox(x, y, int(R * BoxMaxHeight), theta);
\r
162 for (int i = 0; i < 208; i++) {
\r
163 SetPenColor(GetColor(0.03 * i, 1.0));
\r
164 Canvas->MoveTo(10, TopMargin + i);
\r
165 Canvas->LineTo(10 + BoxDepth, TopMargin + i);
\r
168 //-----------------------------------------------------------------------
\r
169 void QDrawHSVGraph::DrawAll2D(QBits * qBits) {
\r
171 SetBrushColor(clWhite);
\r
172 Canvas->FloodFill(1, 1, clDkGray, fsBorder);
\r
174 const int N = qBits->GetNumberOfStates();
\r
175 const double eps = 1.0e-20;
\r
177 for (int i = 0; i < N; i++) {
\r
178 double im = qBits->NthStateI(i);
\r
179 double re = qBits->NthStateR(i);
\r
180 double R = sqrt(im * im + re * re);
\r
181 double theta = 3.1416 + atan2(im, re + eps);
\r
183 int ix = i % ColumnNumber;
\r
184 int iy = (i - ix) / ColumnNumber;
\r
185 int x = 50 + ix * BoxWidth;
\r
186 int y = 20 + iy * BoxWidth;
\r
188 TRect rc(x, y, x + BoxWidth + 1, y + BoxWidth + 1);
\r
189 SetBrushColor(GetColor(theta, R));
\r
190 Canvas->FillRect(rc);
\r
191 SetBrushColor(clBlack);
\r
192 Canvas->FrameRect(rc);
\r
196 for (int i = 0; i < 208; i++) {
\r
197 SetPenColor(GetColor(0.03 * i, 1.0));
\r
198 Canvas->MoveTo(10, TopMargin + i);
\r
199 Canvas->LineTo(10 + BoxDepth, TopMargin + i);
\r