You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
2.9 KiB
C

5 days ago
#pragma once
#include <sstream>
#include <fstream>
#include <vector>
#include <map>
#define RGB_WHITE RGB(255, 255, 255) // <20><><EFBFBD><EFBFBD> WHITE <20><>ɫ
// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
#define RGB_RED RGB(255, 0, 0)
#define RGB_ORANGE RGB(255, 165, 0)
#define RGB_YELLOW RGB(255, 255, 0)
#define RGB_GREEN RGB(0, 255, 0)
#define RGB_CYAN RGB(0, 255, 255)
#define RGB_BLUE RGB(0, 0, 255)
#define RGB_PURPLE RGB(128, 0, 128)
#define RGB_GREY RGB(169, 169, 169)
#define RGB_PINK RGB(255, 192, 203)
#define RGB_BLACK RGB(0, 0, 0)
#define RGB_WHITE RGB(255, 255, 255)
#define RGB_BROWN RGB(165, 42, 42)
using namespace std;
extern std::map<const int, int> m_proportionEnergy;
// <20><>ɫ<EFBFBD><C9AB>Χ<EFBFBD><EFBFBD><E1B9B9>
struct ColorRange
{
float minEnergy=0;
float maxEnergy=0;
COLORREF color;
const int proportionEnergy=0;
ColorRange(float minE, float maxE, COLORREF col, const int proportionE)
: minEnergy(minE), maxEnergy(maxE), color(col), proportionEnergy(proportionE) {}
int Cnt = 0;
static int AllCnt ;
float dPercent = 0;
};
// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class ColorScheme {
public:
std::string name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<ColorRange> ranges; // <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>Ͷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ɫ
// Ĭ<>Ϲ<EFBFBD><CFB9><EFBFBD><ECBAAF>
ColorScheme() : name("") {}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECBAAF>
ColorScheme(std::string schemeName) : name(schemeName) {}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
void addRange(float minEnergy, float maxEnergy, COLORREF color, const int proportionEnergy)
{
ranges.emplace_back( minEnergy, maxEnergy, color ,proportionEnergy);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ɫ
COLORREF getColor(float energy)
{
for (auto& range : ranges) {
if (energy >= range.minEnergy && energy <= range.maxEnergy)
{
m_proportionEnergy[range.proportionEnergy]++;
range.Cnt++;
ColorRange::AllCnt++;
return range.color;
}
}
ColorRange::AllCnt++;
return RGB_WHITE; // Ĭ<>Ϸ<EFBFBD><CFB7>ذ<EFBFBD>ɫ
}
void ResetRangeCnt()//<2F><><EFBFBD>ø<EFBFBD>Range<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
ColorRange::AllCnt = 0;
for (auto& range : ranges)
{
range.Cnt = 0;
}
}
void CalRangesPercent()//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Range<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>
{
for (auto& range : ranges)
{
range.dPercent = double(range.Cnt*100) / ColorRange::AllCnt;
}
}
};
// <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class ColorSchemeManager
{
public:
std::map<std::string, ColorScheme> schemes;
ColorScheme* currentScheme;
ColorSchemeManager() : currentScheme(nullptr) {}
void addScheme(const std::string& name)
{
schemes[name] = ColorScheme(name);
}
void setCurrentScheme(const std::string& name)
{
currentScheme = &schemes[name];
}
};
class CCsvToImg
{
public:
CCsvToImg();
virtual ~CCsvToImg();
bool ReadCsv2Img(CString CsvPath);
bool ShowLastImg(CWnd * pSHowWnd);
bool SaveLastImg(const CString& savePath);
private:
float * GetCsvData(const char * path, int & Rows, int & Cols);
bool CreateImgFromData(float * pDataOrg, int Rows, int Cols, CImage & OutImg);
CCriticalSection m_Section;
public:
ColorSchemeManager m_colorSchemeManager;
CImage m_Img;
};
extern CCsvToImg * gCsvToImg;