diff --git a/main.cpp b/main.cpp index 0b21543..e0830f9 100644 --- a/main.cpp +++ b/main.cpp @@ -1,43 +1,45 @@ #include #include #include "histogram.h" -#include "text.h" #include "svg.h" -#include using namespace std; struct Input { vector numbers; size_t bin_count; + size_t scale_step; }; -Input input_data(istream& in, bool prompt) { - Input inp; +Input input_data() { + Input in; size_t number_count; - if (prompt){ - cerr << "Enter number count: "; - } + cerr << "Enter number count: "; cin >> number_count; - inp.numbers.resize(number_count); - if (prompt){ - cerr << "Enter numbers: "; - } + in.numbers.resize(number_count); + cerr << "Enter numbers: "; for (size_t i = 0; i < number_count; i++) { - cin >> inp.numbers[i]; + cin >> in.numbers[i]; } - if (prompt) { - cerr << "Enter bin count: "; + cerr << "Enter bin count: "; + cin >> in.bin_count; + + cerr << "Enter scale step (2-9): "; + cin >> in.scale_step; + if (in.scale_step < 2 || in.scale_step > 9) { + cerr << "ERROR: Invalid scale step\n"; } - cin >> inp.bin_count; - return inp; + + return in; } int main() { - curl_global_init(CURL_GLOBAL_ALL); - auto in = input_data(cin, true); + auto in = input_data(); auto bins = make_histogram(in.numbers, in.bin_count); - show_histogram_svg(bins); + + + show_histogram_svg(bins, in.scale_step); + return 0; } diff --git a/svg.cpp b/svg.cpp index f17f5a8..e61400d 100644 --- a/svg.cpp +++ b/svg.cpp @@ -1,38 +1,63 @@ #include #include #include +#include #include "svg.h" using namespace std; -void svg_begin(double width, double height) { - cout << "\n"; - cout << "\n"; +void svg_begin(double width, double height, ofstream& out) { + out << "\n"; + out << "\n"; } -void svg_end() { - cout << "\n"; +void svg_end(ofstream& out) { + out << "\n"; } -void svg_text(double left, double baseline, string text) { - cout << "" << text << "\n"; +void svg_text(double left, double baseline, string text, ofstream& out) { + out << "" << text << "\n"; } -void svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") { - cout << "\n"; +void svg_rect(double x, double y, double width, double height, ofstream& out, + string stroke = "black", string fill = "black") { + out << "\n"; } -void show_histogram_svg(const vector& bins) { +void draw_scale(double width, double height, double max_width, size_t step, ofstream& out) { + const double SCALE_HEIGHT = 30; + const double TEXT_OFFSET = 20; + const double MARK_HEIGHT = 10; + + double scale_y = height - SCALE_HEIGHT; + + svg_rect(0, scale_y, width, 2, out, "black", "black"); + + double step_size = width / step; + for (size_t i = 0; i <= step; i++) { + double mark_x = i * step_size; + svg_rect(mark_x, scale_y - MARK_HEIGHT, 2, MARK_HEIGHT, out, "black", "black"); + svg_text(mark_x - 5, scale_y + TEXT_OFFSET, to_string(i), out); + } +} + +void show_histogram_svg(const vector& bins, size_t scale_step) { if (bins.empty()) { cerr << "Error: Empty bins vector\n"; return; } + ofstream out("marks.svg"); + if (!out.is_open()) { + cerr << "Error: Cannot open output file\n"; + return; + } + const auto IMAGE_WIDTH = 400; const auto IMAGE_HEIGHT = 300; const auto TEXT_LEFT = 20; @@ -41,7 +66,7 @@ void show_histogram_svg(const vector& bins) { const auto BIN_HEIGHT = 30; const auto MAX_WIDTH = IMAGE_WIDTH - TEXT_WIDTH; - svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); + svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT, out); double top = 0; size_t max_count = bins[0]; @@ -53,10 +78,13 @@ void show_histogram_svg(const vector& bins) { for (size_t bin : bins) { const double bin_width = MAX_WIDTH * (static_cast(bin) / max_count); - svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", "red"); + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin), out); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, out, "black", "red"); top += BIN_HEIGHT; } - svg_end(); + draw_scale(IMAGE_WIDTH, IMAGE_HEIGHT, MAX_WIDTH, scale_step, out); + + svg_end(out); + out.close(); } diff --git a/svg.h b/svg.h index f48d806..db772a7 100644 --- a/svg.h +++ b/svg.h @@ -2,8 +2,8 @@ #define SVG_H_INCLUDED #include -#include // Äëÿ size_t +#include -void show_histogram_svg(const std::vector& bins); +void show_histogram_svg(const std::vector& bins, size_t scale_step); #endif // SVG_H_INCLUDED