#include "GlobalInfo.h" /* OscData使用的眼图矩阵 */ EyeDataMatrix g_eyeDataMatrix; /* OscWidget使用的眼图矩阵 */ EyeMapMatrix g_eyeMapMatrix; void EyeDataMatrix::initEyeData() { mutexEyeData.lock(); for(int i = 0; i < 1000; i++) { for(int j = 0; j < 256; j++) { dataMatrix[i][j].fCnt = 0.0; dataMatrix[i][j].data = 0; dataMatrix[i][j].Cnt = 0; } } mutexEyeData.unlock(); } /* 给一个采样点添加个数,为啥使用浮点数,添加0.99,不直接添加正数呢 */ void EyeDataMatrix::addData(int x, int y) { if(dataMatrix[x][y].fCnt < 79999.0) { dataMatrix[x][y].fCnt += eyenWeightCoefficient; } } /** * @brief 比重统计,点数大于79999的个数比点数大于0的个数的比重超过0.25,就开始减慢颜色变化的速度 * */ void EyeDataMatrix::eyeStatisticalWeight() { eyeIsLessenTheBurden = true; if (eyenWeightCoefficient <= eyenWeightCoefficientMIN) { return; } int num = 0; /* 点数大于0的个数 */ int num2 = 0; /* 点数大于79999的个数 */ double num3 = 0.0; int numMax = 79999; for (int i = 0; i < 1000; i++) { for (int j = 0; j < 256; j++) { if (dataMatrix[i][j].fCnt > 0.0) { num++; if (dataMatrix[i][j].fCnt >= (double)numMax) { num2++; } } } } if (num2 > 0) { num3 = (double)num2 / (double)num; } if (num3 >= 0.25) { eyeIsLessenTheBurden = false; } } /** * @brief 眼图减慢颜色变化的速度 * */ void EyeDataMatrix::eyeLessenTheBurden() { if (eyeIsLessenTheBurden) { return; } int num = 0; for (int i = 0; i < 1000; i++) { for (int j = 0; j < 256; j++) { if (dataMatrix[i][j].fCnt > 0.0) { num = (int)(dataMatrix[i][j].fCnt * 0.05); dataMatrix[i][j].fCnt -= num; } } } eyenWeightCoefficient *= eyenWeightCoefficient; } std::shared_ptr EyeDataMatrix::eyeZoomOut() { std::shared_ptr array = std::make_shared(1000, std::vector(256)); for (int i = 0; i < 1000; i++) { for (int j = 0; j < 256; j++) { EyeDataSample pEyeData2; pEyeData2.x = dataMatrix[i][j].x; pEyeData2.y = dataMatrix[i][j].y; pEyeData2.fCnt = dataMatrix[i][j].fCnt; pEyeData2.data = dataMatrix[i][j].data; if (dataMatrix[i][j].fCnt > 0.0) { pEyeData2.fCnt /= 100.0; pEyeData2.Cnt = (int)pEyeData2.fCnt; } (*array)[i][j] = pEyeData2; } } return array; } /* 初始化数据点 */ void EyeMapMatrix::initEyeMapData(int width, int height) { mutexEyeData.lock(); double saH = height / 256.0; double saW = width / 1000.0; for(int i = 0; i < 1000; i++) { for(int j = 0; j < 256; j++) { dataMatrix[i][j].x = (int)(i * saW); dataMatrix[i][j].y = (int)(j * saH); dataMatrix[i][j].rect = QRect(dataMatrix[i][j].x, dataMatrix[i][j].y, (int)saW, (int)saH); dataMatrix[i][j].brush = QBrush(QColor(255, 255, 255)); } } mutexEyeData.unlock(); } /* 拷贝数据到数组中 */ void EyeMapMatrix::copyDataMatrix(Vec2D& data) { for (int i = 0; i < 1000; i++) { for (int j = 0; j < 256; j++) { if (dataMatrix[i][j].Count != data[i][j].fCnt) { if (data[i][j].fCnt > 799.0) { dataMatrix[i][j].Count = 799; } else { dataMatrix[i][j].Count = data[i][j].fCnt; } dataMatrix[i][j].isDraw = true; } } } } /* 将Count数值与颜色对应 */ void EyeMapMatrix::addColorBySample() { int r = 0; int g = 0; int b = 0; double dec = 255 / 100.0; for(int i = 0; i < 1000; i++) { for(int j = 0; j < 256; j++) { if(dataMatrix[i][j].isDraw == false) { continue; } if(dataMatrix[i][j].Count <= 0) { dataMatrix[i][j].Count = 0; continue; } if(dataMatrix[i][j].Count > 799) { dataMatrix[i][j].Count = 799; } /* 1~100,RGB开始减G,往紫色方向走,为显示清楚,G直接从200开始减 */ if(dataMatrix[i][j].Count >= 1 && dataMatrix[i][j].Count <= 100) { r = 255; g = 200 - dataMatrix[i][j].Count * 2; b = 255; } /* 101~200,R0B开始减R,往蓝色方向走,这里开始100分成255份 */ else if(dataMatrix[i][j].Count >= 101 && dataMatrix[i][j].Count <= 200) { r = 255 - (dataMatrix[i][j].Count - 100) * dec; g = 0; b = 255; } /* 201~300,00B开始增加G,往青色方向走 */ else if (dataMatrix[i][j].Count >= 201 && dataMatrix[i][j].Count <= 300) { r = 0; g = (dataMatrix[i][j].Count - 200) * dec; b = 255; } /* 301~400,0GB开始减B,往绿色方向走 */ else if (dataMatrix[i][j].Count >= 301 && dataMatrix[i][j].Count <= 400) { r = 0; g = 255; b = 255 - (dataMatrix[i][j].Count - 300) * dec; } /* 401~500,0G0开始增加R,往黄色方向走 */ else if (dataMatrix[i][j].Count >= 401 && dataMatrix[i][j].Count <= 500) { r = (dataMatrix[i][j].Count - 400) * dec; g = 255; b = 0; } /* 501~600,RG0开始减G,往红色方向走 */ else if (dataMatrix[i][j].Count >= 501 && dataMatrix[i][j].Count <= 600) { r = 255; g = 255 - (dataMatrix[i][j].Count - 500) * dec; b = 0; } /* 601~700,R00开始减R,往黑色方向走 */ else if (dataMatrix[i][j].Count >= 601 && dataMatrix[i][j].Count <= 700) { r = 255 - (dataMatrix[i][j].Count - 600) * dec; g = 0; b = 0; } /* 大于700,直接显示黑色 */ else { r = 0; g = 0; b = 0; } // dataMatrix[i][j].color = QColor(r, g, b); dataMatrix[i][j].brush = QBrush(QColor(r, g, b)); } } }