From 245c046f7ccf98ea09d20e7fab42d3ac9c1694cf Mon Sep 17 00:00:00 2001 From: KlimecnhenkoIA Date: Mon, 26 May 2025 15:09:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0=203=20?= =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 36 ++++++++++++++++++------------------ svg.cpp | 29 ++++++++++++++++++++++++++++- svg.h | 4 ++-- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/main.cpp b/main.cpp index 0b21543..4886934 100644 --- a/main.cpp +++ b/main.cpp @@ -3,41 +3,41 @@ #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..281304b 100644 --- a/svg.cpp +++ b/svg.cpp @@ -27,7 +27,32 @@ void svg_rect(double x, double y, double width, double height, string stroke = " << "' stroke='" << stroke << "' fill='" << fill << "' />\n"; } -void show_histogram_svg(const vector& bins) { +void draw_scale(double width, double height, double max_width, size_t step, double min, double max) { + const double BLOCK_WIDTH = 10; + const double SCALE_HEIGHT = 30; + const double TEXT_OFFSET = 20; + + double scale_width = max_width; + double scale_x = width - max_width; + double scale_y = height - SCALE_HEIGHT; + + svg_rect(scale_x, scale_y, scale_width, 2, "black", "black"); + + double step_size = scale_width / step; + for (size_t i = 0; i <= step; i++) { + double mark_x = scale_x + i * step_size; + svg_rect(mark_x, scale_y, 2, 10, "black", "black"); + + double value = min + (max - min) * i / step; + string label = to_string(value); + if (label.size() > 4) { + label = label.substr(0, 4); + } + svg_text(mark_x - 10, scale_y + TEXT_OFFSET, label); + } +} + +void show_histogram_svg(const vector& bins, size_t scale_step) { if (bins.empty()) { cerr << "Error: Empty bins vector\n"; return; @@ -58,5 +83,7 @@ void show_histogram_svg(const vector& bins) { top += BIN_HEIGHT; } + draw_scale(IMAGE_WIDTH, IMAGE_HEIGHT, MAX_WIDTH, scale_step, 0, max_count); + svg_end(); } 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