Graph symbols to 5x5 2D vector

This commit is contained in:
aristocratos 2021-06-01 22:36:36 +02:00
parent d5aa08be7b
commit 9bf7da049b
4 changed files with 58 additions and 73 deletions

View File

@ -245,7 +245,7 @@ int main(int argc, char **argv){
} }
//? Read config file if present //? Read config file if present
Config::load("____"); Config::load();
// Config::setB("truecolor", false); // Config::setB("truecolor", false);
auto thts = time_ms(); auto thts = time_ms();
@ -343,7 +343,7 @@ int main(int argc, char **argv){
for (long long i = 100; i >= 0; i--) mydata.push_back(i); for (long long i = 100; i >= 0; i--) mydata.push_back(i);
// mydata.push_back(0); // mydata.push_back(0);
// mydata.push_back(0); // mydata.push_back(0);
// mydata.push_back(100); // mydata.push_back(50);
// for (long long i = 0; i <= 100; i++) mydata.push_back(i); // for (long long i = 0; i <= 100; i++) mydata.push_back(i);
@ -367,7 +367,7 @@ int main(int argc, char **argv){
// exit(0); // exit(0);
// cout << Mv::save << kgraph(mydata) << "\n" << kmeter(mydata.back()) << "\n\nInit took " << time_micros() - kts << " μs. " << endl; // cout << Mv::save << kgraph(mydata) << "\n" << kmeter(mydata.back()) << "\n\nInit took " << time_micros() - kts << " μs. " << endl;
cout << Mv::save << kgraph(mydata) << "\n" << kgraph2(mydata) << "\n" << kgraph3(mydata) << "\n" << kmeter(mydata.back()) << "\n\nInit took " << time_micros() - kts << " μs. " << endl; cout << Mv::save << kgraph(mydata, true) << "\n" << kgraph2(mydata, true) << "\n" << kgraph3(mydata, true) << "\n" << kmeter(mydata.back()) << "\n\nInit took " << time_micros() - kts << " μs. " << endl;
// sleep_ms(1000); // sleep_ms(1000);
// mydata.push_back(50); // mydata.push_back(50);
// cout << Mv::restore << kgraph(mydata) << "\n" << kgraph2(mydata) << "\n\nInit took " << time_micros() - kts << " μs. " << endl; // cout << Mv::restore << kgraph(mydata) << "\n" << kgraph2(mydata) << "\n\nInit took " << time_micros() - kts << " μs. " << endl;

View File

@ -129,9 +129,8 @@ namespace Config {
changed = true; changed = true;
} }
bool load(string source){ void load(){
(void)source; if (conf_file.empty()) return;
return true;
} }
} }

View File

@ -52,36 +52,20 @@ namespace Symbols {
const array<string, 10> superscript = { "", "¹", "²", "³", "", "", "", "", "", "" }; const array<string, 10> superscript = { "", "¹", "²", "³", "", "", "", "", "", "" };
const unordered_flat_map<float, string> graph_up = { const vector<string> graph_up = {
{0.0, ""}, {0.1, ""}, {0.2, ""}, {0.3, ""}, {0.4, ""}, "", "", "", "", "",
{1.0, ""}, {1.1, ""}, {1.2, ""}, {1.3, ""}, {1.4, ""}, "", "", "", "", "",
{2.0, ""}, {2.1, ""}, {2.2, ""}, {2.3, ""}, {2.4, ""}, "", "", "", "", "",
{3.0, ""}, {3.1, ""}, {3.2, ""}, {3.3, ""}, {3.4, ""}, "", "", "", "", "",
{4.0, ""}, {4.1, ""}, {4.2, ""}, {4.3, ""}, {4.4, ""} "", "", "", "", ""
}; };
const unordered_flat_map<float, string> graph_down = { const vector<string> graph_down = {
{0.0, ""}, {0.1, ""}, {0.2, ""}, {0.3, ""}, {0.4, ""}, "", "", "", "", "",
{1.0, ""}, {1.1, ""}, {1.2, ""}, {1.3, ""}, {1.4, ""}, "", "", "", "", "",
{2.0, ""}, {2.1, ""}, {2.2, ""}, {2.3, ""}, {2.4, ""}, "", "", "", "", "",
{3.0, ""}, {3.1, ""}, {3.2, ""}, {3.3, ""}, {3.4, ""}, "", "", "", "", "",
{4.0, ""}, {4.1, ""}, {4.2, ""}, {4.3, ""}, {4.4, ""} "", "", "", "", ""
};
const unordered_flat_map<float, string> graph_up_small = {
{0.0, Mv::r(1)}, {0.1, ""}, {0.2, ""}, {0.3, ""}, {0.4, ""},
{1.0, ""}, {1.1, ""}, {1.2, ""}, {1.3, ""}, {1.4, ""},
{2.0, ""}, {2.1, ""}, {2.2, ""}, {2.3, ""}, {2.4, ""},
{3.0, ""}, {3.1, ""}, {3.2, ""}, {3.3, ""}, {3.4, ""},
{4.0, ""}, {4.1, ""}, {4.2, ""}, {4.3, ""}, {4.4, ""}
};
const unordered_flat_map<float, string> graph_down_small = {
{0.0, Mv::r(1)}, {0.1, ""}, {0.2, ""}, {0.3, ""}, {0.4, ""},
{1.0, ""}, {1.1, ""}, {1.2, ""}, {1.3, ""}, {1.4, ""},
{2.0, ""}, {2.1, ""}, {2.2, ""}, {2.3, ""}, {2.4, ""},
{3.0, ""}, {3.1, ""}, {3.2, ""}, {3.3, ""}, {3.4, ""},
{4.0, ""}, {4.1, ""}, {4.2, ""}, {4.3, ""}, {4.4, ""}
}; };
} }
@ -182,43 +166,50 @@ namespace Draw {
string out, color_gradient; string out, color_gradient;
int width = 0, height = 0, lowest = 0; int width = 0, height = 0, lowest = 0;
long long last = 0, max_value = 0, offset = 0; long long last = 0, max_value = 0, offset = 0;
bool current = true, no_zero = false, invert = false, data_same = true; bool current = true, no_zero = false, invert = false;
unordered_flat_map<bool, vector<string>> graphs = { {true, {}}, {false, {}}}; unordered_flat_map<bool, vector<string>> graphs = { {true, {}}, {false, {}}};
unordered_flat_map<float, string> graph_symbol; vector<string> graph_symbol;
//* Create two representations of the graph to switch between to represent two values for each braille character //* Create two representations of the graph to switch between to represent two values for each braille character
void _create(const vector<long long>& data, int data_offset) { void _create(const vector<long long>& data, int data_offset) {
const bool mult = (data.size() - data_offset > 1); const bool mult = (data.size() - data_offset > 1);
if (mult && (data.size() - data_offset) % 2 != 0) data_offset--; if (mult && (data.size() - data_offset) % 2 != 0) data_offset--;
vector<int> result; array<int, 2> result;
const float mod = (height == 1) ? 0.3 : 0.1; const float mod = (height == 1) ? 0.3 : 0.1;
long long data_value = 0; long long data_value = 0;
if (mult && data_offset > 0) { if (mult && data_offset > 0) {
last = data[data_offset - 1]; last = data[data_offset - 1];
if (max_value > 0) last = clamp((last + offset) * 100 / max_value, 0ll, 100ll); if (max_value > 0) last = clamp((last + offset) * 100 / max_value, 0ll, 100ll);
} }
for (int horizon : iota(0, height)){
long long cur_high = (height > 1) ? round(100.0 * (height - horizon) / height) : 100; //? Horizontal iteration over values in <data>
long long cur_low = (height > 1) ? round(100.0 * (height - (horizon + 1)) / height) : 0; for (int i = data_offset; i < (int)data.size(); i++) {
for (int i = data_offset; i < (int)data.size(); i++) { if (i == -1) { data_value = 0; last = 0; }
if (mult) current = !current; else data_value = data[i];
if (i == -1) { data_value = 0; last = 0; } if (mult) current = !current;
else data_value = data[i]; if (max_value > 0) data_value = clamp((data_value + offset) * 100 / max_value, 0ll, 100ll);
if (max_value > 0) data_value = clamp((data_value + offset) * 100 / max_value, 0ll, 100ll); //? Vertical iteration over height of graph
result.clear(); for (int horizon : iota(0, height)){
int cur_high = (height > 1) ? round(100.0 * (height - horizon) / height) : 100;
int cur_low = (height > 1) ? round(100.0 * (height - (horizon + 1)) / height) : 0;
//? Calculate previous + current value to fit two values in 1 braille character
int ai = 0;
for (auto value : {last, data_value}) { for (auto value : {last, data_value}) {
if (value >= cur_high) if (value >= cur_high)
result.push_back(4); result[ai] = 4;
else if (value < cur_low) else if (value < cur_low)
result.push_back(0); result[ai] = 0;
else { else {
result.push_back(round((float)(value - cur_low) * 4 / (cur_high - cur_low) + mod)); result[ai] = round((float)(value - cur_low) * 4 / (cur_high - cur_low) + mod);
if (no_zero && horizon == height - 1 && i != -1 && result.back() == 0) result.back() = 1; if (no_zero && horizon == height - 1 && i != -1 && result[ai] == 0) result[ai] = 1;
} }
ai++;
} }
if (mult && i > data_offset) last = data_value; //? Generate braille symbol from 5x5 2D vector
graphs[current][horizon] += graph_symbol[(float)result.at(0) + (float)result.at(1) / 10]; graphs[current][horizon] += (height == 1 && result[0] + result[1] == 0) ? Mv::r(1) : graph_symbol[result[0] * 5 + result[1]];
} }
if (mult && i > data_offset) last = data_value;
} }
last = data_value; last = data_value;
if (height == 1) if (height == 1)
@ -236,17 +227,16 @@ namespace Draw {
public: public:
//* Set graph options and initialize with data //* Set graph options and initialize with data
void operator()(int width, int height, string color_gradient, const vector<long long>& data, bool invert = false, bool no_zero = false, long long max_value = 0, long long offset = 0, bool data_same = true) { void operator()(int width, int height, string color_gradient, const vector<long long>& data, bool invert = false, bool no_zero = false, long long max_value = 0, long long offset = 0) {
graphs[true].clear(); graphs[false].clear(); graphs[true].clear(); graphs[false].clear();
this->width = width; this->height = height; this->width = width; this->height = height;
this->invert = invert; this->offset = offset; this->invert = invert; this->offset = offset;
this->no_zero = no_zero; this->max_value = max_value; this->no_zero = no_zero; this->max_value = max_value;
this->color_gradient = color_gradient; this->color_gradient = color_gradient;
this->data_same = data_same; // if (height == 1) graph_symbol = (invert) ? Symbols::graph_down_small : Symbols::graph_up_small;
if (height == 1) graph_symbol = (invert) ? Symbols::graph_down_small : Symbols::graph_up_small; graph_symbol = (invert) ? Symbols::graph_down : Symbols::graph_up;
else graph_symbol = (invert) ? Symbols::graph_down : Symbols::graph_up;
if (no_zero) lowest = 1; if (no_zero) lowest = 1;
current = true; // current = true;
int value_width = ceil((float)data.size() / 2); int value_width = ceil((float)data.size() / 2);
int data_offset = 0; int data_offset = 0;
if (value_width > width) data_offset = data.size() - width * 2; if (value_width > width) data_offset = data.size() - width * 2;
@ -261,26 +251,22 @@ namespace Draw {
this->_create(data, data_offset); this->_create(data, data_offset);
} }
//* Add <num> number of values from back of <data> and return string representation of graph //* Add last value from back of <data> and return string representation of graph
string operator()(const vector<long long>& data, const int num = 1) { string operator()(const vector<long long>& data, bool data_same = false) {
if (data_same) {data_same = false; return out;} if (data_same) return out;
current = !current; current = !current;
//? Make room for new character(s) on graph //? Make room for new characters on graph
for (int i : iota(0, height)) { for (int i : iota(0, height)) {
int y = 0; if (graphs[current][i].starts_with(Fx::e)) graphs[current][i].erase(0, 4);
while (y++ < num) { else graphs[current][i].erase(0, 3);
if (graphs[current][i].starts_with(Fx::e)) graphs[current][i].erase(0, 4);
else graphs[current][i].erase(0, 3);
}
} }
this->_create(data, (int)data.size() - num); this->_create(data, (int)data.size() - 1);
return out; return out;
} }
//* Return string representation of graph //* Return string representation of graph
string operator()() { string operator()() {
data_same = false;
return out; return out;
} }
}; };

View File

@ -192,7 +192,7 @@ namespace Theme {
}; };
} }
} }
return array<int, 3>{-1 ,-1 ,-1}; return {-1 ,-1 ,-1};
} }
//* Generate colors and rgb decimal vectors for the theme //* Generate colors and rgb decimal vectors for the theme
@ -234,7 +234,6 @@ namespace Theme {
bool t_to_256 = !Config::getB("truecolor"); bool t_to_256 = !Config::getB("truecolor");
array<array<int, 3>, 3> rgb_arr; array<array<int, 3>, 3> rgb_arr;
array<array<int, 3>, 101> dec_arr; array<array<int, 3>, 101> dec_arr;
int arr1, arr2, rng, offset, y;
for (auto& [name, source_arr] : rgbs) { for (auto& [name, source_arr] : rgbs) {
if (!name.ends_with("_start")) continue; if (!name.ends_with("_start")) continue;
dec_arr[0][0] = -1; dec_arr[0][0] = -1;
@ -245,9 +244,10 @@ namespace Theme {
if (rgb_arr[2][0] >= 0) { if (rgb_arr[2][0] >= 0) {
//? Split iteration in two passes of 50 + 51 instead of 101 if gradient has _start, _mid and _end values defined //? Split iteration in two passes of 50 + 51 instead of 101 if gradient has _start, _mid and _end values defined
rng = (rgb_arr[1][0] >= 0) ? 50 : 100; int rng = (rgb_arr[1][0] >= 0) ? 50 : 100;
for (int rgb : iota(0, 3)){ for (int rgb : iota(0, 3)){
arr1 = 0; arr2 = (rng == 50) ? 1 : 2; offset = 0; int arr1 = 0, offset = 0;
int arr2 = (rng == 50) ? 1 : 2;
for (int i : iota(0, 101)) { for (int i : iota(0, 101)) {
dec_arr[i][rgb] = rgb_arr[arr1][rgb] + (i - offset) * (rgb_arr[arr2][rgb] - rgb_arr[arr1][rgb]) / rng; dec_arr[i][rgb] = rgb_arr[arr1][rgb] + (i - offset) * (rgb_arr[arr2][rgb] - rgb_arr[arr1][rgb]) / rng;
@ -256,8 +256,8 @@ namespace Theme {
} }
} }
} }
y = 0;
if (dec_arr[0][0] != -1) { if (dec_arr[0][0] != -1) {
int y = 0;
for (auto& arr : dec_arr) c_gradient[y++] = dec_to_color(arr[0], arr[1], arr[2], t_to_256); for (auto& arr : dec_arr) c_gradient[y++] = dec_to_color(arr[0], arr[1], arr[2], t_to_256);
} }
else { else {