готовый общий вариант

master
Alex 11 месяцев назад
Родитель 4c7fec4e7f
Сommit 7e907e637c

@ -4,6 +4,8 @@
#include "text.h"
#include "svg.h"
#include <curl/curl.h>
#include <sstream>
#include <string>
using namespace std;
@ -11,7 +13,6 @@ struct Input
{
vector<double> numbers;
size_t bin_count{};
vector<string> colors;
};
Input input_data(istream& inp, bool prompt)
@ -38,17 +39,50 @@ Input input_data(istream& inp, bool prompt)
}
inp >> in.bin_count;
in.colors.resize(in.bin_count);
cerr << "Enter colors: ";
for (size_t i = 0; i < in.bin_count; i++)
return in;
}
size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx)
{
size_t data_size = item_count * item_size;
stringstream* buffer = reinterpret_cast<stringstream*>(ctx);
char* item = reinterpret_cast<char *>(items);
buffer->write(item, data_size);
return data_size;
}
Input download(const string& address)
{
stringstream buffer;
CURL* curl = curl_easy_init();
if(curl)
{
inp >> in.colors[i];
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, address.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (res != 0)
{
cerr << curl_easy_strerror(res) << endl;
exit(1);
}
}
return in;
curl_easy_cleanup(curl);
return input_data(buffer, false);
}
int main(int argc, char* argv[])
/*int main(int argc, char* argv[])
{
curl_global_init(CURL_GLOBAL_ALL);
Input input;
if (argc > 1)
{
CURL* curl = curl_easy_init();
@ -70,11 +104,22 @@ int main(int argc, char* argv[])
return 0;
}
curl_global_init(CURL_GLOBAL_ALL);
auto in = input_data(cin, true);
auto bins = make_histogram(in.numbers, in.bin_count);
show_histogram_svg(bins, in.colors);
show_histogram_svg(bins);
return 0;
} */
int main(int argc, char* argv[]) {
Input input;
if (argc > 1) {
input = download(argv[1]);
} else {
input = input_data(cin, true);
}
const auto bins = make_histogram(input.numbers, input.bin_count);
show_histogram_svg(bins);
return 0;
}

@ -22,26 +22,12 @@ void svg_text(double left, double baseline, std::string text)
std::cout << "<text x='" << left << "' y='"<< baseline <<"'>"<< text <<"</text>";
}
void svg_rect(double x, double y, double width, double height, std::string fill = "black", std::string stroke = "black")
void svg_rect(double x, double y, double width, double height, std::string fill = "purple", std::string stroke = "black")
{
std::cout << "<rect x='" << x << "' y='" << y << "' width='" << width << "' height='" << height << "' fill='" << fill << "' stroke='" << stroke << "' />\n";
}
std::string check_color(const std::string& color)
{
if (color.find(" ") == -1 || color.find('#') == 0)
{
return color;
}
else
{
return "black";
}
}
void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<std::string>& colors)
void show_histogram_svg(const std::vector<std::size_t>& bins)
{
const auto IMAGE_WIDTH = 400;
@ -68,7 +54,7 @@ void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<
for (std::size_t j=0; j < bins.size(); j++) {
const double bin_width= MAX_ASTERISK * (static_cast<double>(bins[j]) / maxbin);
svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bins[j]));
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, check_color(colors[j]), "black");
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT);
top += BIN_HEIGHT;
}
svg_end();
@ -77,9 +63,10 @@ void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<
for (std::size_t j=0; j < bins.size(); j++) {
const double bin_width= MAX_ASTERISK * (static_cast<double>(bins[j]) / maxbin);
svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bins[j]));
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, check_color(colors[j]), "black");
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT);
top += BIN_HEIGHT;
}
svg_end();
}
}

@ -1,5 +1,5 @@
#ifndef SVG_H_INCLUDED
#define SVG_H_INCLUDED
#include <vector>
void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<std::string>& colors);
void show_histogram_svg(const std::vector<std::size_t>& bins);
#endif // SVG_H_INCLUDED

Загрузка…
Отмена
Сохранить