From 9bcf3ae8153dbd422956d331bf36a78676c7f9e5 Mon Sep 17 00:00:00 2001
From: MamakinYR <MamakinYR@mpei.ru>
Date: Mon, 22 Apr 2024 01:13:42 +0300
Subject: [PATCH] =?UTF-8?q?code:=20=D0=93=D0=B8=D1=81=D1=82=D0=BE=D0=B3?=
 =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BC=D0=B0=20=D0=B2=20=D1=84=D0=BE=D1=80?=
 =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B5=20svg?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 histogram.cpp |  2 +-
 lab03.vcxproj |  3 +++
 lab1.cpp      |  3 ++-
 svg.cpp       | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 svg.h         |  4 ++++
 text.cpp      |  2 +-
 text.h        |  3 ++-
 7 files changed, 62 insertions(+), 4 deletions(-)
 create mode 100644 svg.cpp
 create mode 100644 svg.h

diff --git a/histogram.cpp b/histogram.cpp
index eb2de5e..41832b0 100644
--- a/histogram.cpp
+++ b/histogram.cpp
@@ -5,7 +5,7 @@
 using namespace std;
 
 void find_minmax(const vector<double>& numbers, double& min, double& max) {
-    if (numbers.size() == 2)
+    if (numbers.size() != 0)
     {
         min = numbers[0];
         max = numbers[0];
diff --git a/lab03.vcxproj b/lab03.vcxproj
index 097c62d..09294d5 100644
--- a/lab03.vcxproj
+++ b/lab03.vcxproj
@@ -21,12 +21,15 @@
   <ItemGroup>
     <ClCompile Include="histogram.cpp" />
     <ClCompile Include="lab1.cpp" />
+    <ClCompile Include="svg.cpp" />
     <ClCompile Include="text.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="histogram.h">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
     </ClInclude>
+    <ClInclude Include="histogram_internal.h" />
+    <ClInclude Include="svg.h" />
     <ClInclude Include="text.h" />
   </ItemGroup>
   <PropertyGroup Label="Globals">
diff --git a/lab1.cpp b/lab1.cpp
index 8db375e..0924133 100644
--- a/lab1.cpp
+++ b/lab1.cpp
@@ -3,6 +3,7 @@
 #include <vector>
 #include "histogram.h"
 #include "text.h"
+#include "svg.h"
 using namespace std;
 struct Input {
     vector<double> numbers;
@@ -27,6 +28,6 @@ int main()
     const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
     auto in = input_data();
     auto bins = make_histogram(in.numbers, in.bin_count);
-    show_histogram_text(bins, MAX_ASTERISK);
+    show_histogram_svg(bins);
     return 0;
 }
diff --git a/svg.cpp b/svg.cpp
new file mode 100644
index 0000000..26d379d
--- /dev/null
+++ b/svg.cpp
@@ -0,0 +1,49 @@
+#include <iostream>
+#include <conio.h>
+#include <vector>
+#include <string>
+#include "svg.h"
+#include "text.h"
+using namespace std;
+
+void svg_begin(double width, double height) {
+    cout << "<?xml version='1.0' encoding='UTF-8'?>\n";
+    cout << "<svg ";
+    cout << "width='" << width << "' ";
+    cout << "height='" << height << "' ";
+    cout << "viewBox='0 0 " << width << " " << height << "' ";
+    cout << "xmlns='http://www.w3.org/2000/svg'>\n";
+}
+
+void svg_end() {
+    cout << "</svg>\n";
+}
+
+void svg_text(double left, double baseline, string text) {
+    cout << "<text x='" << left << "' y='" << baseline << "'>" << text << "</text>";
+}
+
+void svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") {
+    cout << "<rect x = '" << x << "' y = '" << y << "' width = '" << width << "' height = '" << height << "' stroke = '" << stroke << "' fill = '" << fill << "' />";
+}
+
+void show_histogram_svg(const vector<size_t>& bins) {
+    const auto IMAGE_WIDTH = 400;
+    const auto IMAGE_HEIGHT = 300;
+    const auto TEXT_LEFT = 20;
+    const auto TEXT_BASELINE = 20;
+    const auto TEXT_WIDTH = 50;
+    const auto BIN_HEIGHT = 30;
+    const auto BLOCK_WIDTH = 10;
+    svg_begin(400, 300);
+    double top = 0;
+    size_t max_bin_capacity{};
+    find_max_capacity(bins, max_bin_capacity);
+    for (size_t bin : bins) {
+        const double bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * (static_cast<double>(bin) / max_bin_capacity);
+        svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin));
+        svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "purple", "#ffcc00");
+        top += BIN_HEIGHT;
+    }
+    svg_end();
+}
\ No newline at end of file
diff --git a/svg.h b/svg.h
new file mode 100644
index 0000000..f40efe2
--- /dev/null
+++ b/svg.h
@@ -0,0 +1,4 @@
+#pragma once
+#include<vector>
+
+void show_histogram_svg(const std::vector<size_t>& bins);
\ No newline at end of file
diff --git a/text.cpp b/text.cpp
index b14d021..af82aa6 100644
--- a/text.cpp
+++ b/text.cpp
@@ -4,7 +4,7 @@
 #include "text.h"
 using namespace std;
 
-static void find_max_capacity(const vector<size_t>& bins, size_t& max_bin_capacity)
+void find_max_capacity(const vector<size_t>& bins, size_t& max_bin_capacity)
 {
     max_bin_capacity = bins[0];
     for (size_t x : bins)
diff --git a/text.h b/text.h
index e5ab877..8335660 100644
--- a/text.h
+++ b/text.h
@@ -1,4 +1,5 @@
 #pragma once
 #include <vector>
 
-void show_histogram_text(const std::vector<size_t>& bins, std::size_t max_asterisk);
\ No newline at end of file
+void show_histogram_text(const std::vector<size_t>& bins, std::size_t max_asterisk);
+void find_max_capacity(const std::vector<size_t>& bins, std::size_t& max_bin_capacity);
\ No newline at end of file