|  |  |  | @ -1,6 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include "svg.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include <string> | 
			
		
	
		
			
				
					|  |  |  |  | #include <cstddef> | 
			
		
	
		
			
				
					|  |  |  |  | #include <iostream> | 
			
		
	
		
			
				
					|  |  |  |  | #include <vector> | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | using namespace std; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void svg_begin(double width, double height) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -20,10 +21,8 @@ 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 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) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -34,22 +33,28 @@ void show_histogram_svg(const vector<size_t>& bins) { | 
			
		
	
		
			
				
					|  |  |  |  |     const auto TEXT_WIDTH = 50; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto BIN_HEIGHT = 30; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto BLOCK_WIDTH = 10; | 
			
		
	
		
			
				
					|  |  |  |  |     const auto MAX_BIN_WIDTH = IMAGE_WIDTH - 2.3 * TEXT_WIDTH; | 
			
		
	
		
			
				
					|  |  |  |  |     auto max_bins = bins[0]; | 
			
		
	
		
			
				
					|  |  |  |  |     size_t sum_bins = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     svg_begin(400, 300); | 
			
		
	
		
			
				
					|  |  |  |  |     double top = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin : bins) sum_bins += bin; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin : bins) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (bin > max_bins) max_bins = bin; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     auto koef = MAX_BIN_WIDTH / BLOCK_WIDTH / max_bins; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); | 
			
		
	
		
			
				
					|  |  |  |  |     double top = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin : bins) { | 
			
		
	
		
			
				
					|  |  |  |  |         const double bin_width = BLOCK_WIDTH * bin; | 
			
		
	
		
			
				
					|  |  |  |  |         if(bin_width> IMAGE_WIDTH) { | 
			
		
	
		
			
				
					|  |  |  |  |             const double bin_width= IMAGE_WIDTH - TEXT_WIDTH; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         const double bin_width = BLOCK_WIDTH * bin * koef; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         size_t percent = bin * 100 / sum_bins; | 
			
		
	
		
			
				
					|  |  |  |  |         svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); | 
			
		
	
		
			
				
					|  |  |  |  |         svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "blue", "green"); | 
			
		
	
		
			
				
					|  |  |  |  |         svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); | 
			
		
	
		
			
				
					|  |  |  |  |         svg_text((IMAGE_WIDTH - TEXT_WIDTH), top + TEXT_BASELINE, to_string(percent)); | 
			
		
	
		
			
				
					|  |  |  |  |         top += BIN_HEIGHT; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     //svg_text(20, 20, to_string(bins[0]));
 | 
			
		
	
		
			
				
					|  |  |  |  |     //svg_rect(50, 0, bins[0] * 10, 30);
 | 
			
		
	
		
			
				
					|  |  |  |  |     svg_end(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |