| 87 | } |
| 88 | |
| 89 | std::string histogram::data_string() { |
| 90 | make_sure_data_is_preprocessed(); |
| 91 | std::stringstream ss; |
| 92 | ss.precision(10); |
| 93 | ss << std::fixed; |
| 94 | if (!is_polar()) { |
| 95 | for (size_t i = 0; i < values_.size(); ++i) { |
| 96 | // <box center> <box height> <box width> |
| 97 | ss << " " << (bin_edges_[i] + bin_edges_[i + 1]) * 0.5 << " " |
| 98 | << values_[i] << " " |
| 99 | << (bin_edges_[i + 1] - bin_edges_[i]) * bar_width_ << "\n"; |
| 100 | } |
| 101 | ss << "e\n"; |
| 102 | |
| 103 | } else { |
| 104 | // resolutions of the petals |
| 105 | constexpr double points_per_circle = 360; |
| 106 | const double n_histogram_bins = bin_edges_.size() - 1.; |
| 107 | // ensure at least one line segment (2 points) per petal. |
| 108 | const size_t points_per_bin = static_cast<size_t>(max(2.0, points_per_circle / n_histogram_bins)); |
| 109 | if (!stairs_only_) { |
| 110 | for (size_t i = 0; i < values_.size(); ++i) { |
| 111 | // make a petal for each value |
| 112 | // theta = edge_begin rho = 0 |
| 113 | // theta = edge_begin rho = bin_value |
| 114 | // theta = edge_end rho = bin_value |
| 115 | // theta = edge_end rho = 0 |
| 116 | ss << " " << bin_edges_[i] << " " << 0 << "\n"; |
| 117 | auto arc_between_edges = |
| 118 | linspace(bin_edges_[i], bin_edges_[i + 1], points_per_bin); |
| 119 | for (size_t j = 0; j < arc_between_edges.size(); ++j) { |
| 120 | ss << " " << arc_between_edges[j] << " " |
| 121 | << values_[i] << "\n"; |
| 122 | } |
| 123 | ss << " " << bin_edges_[i + 1] << " " << 0 << "\n"; |
| 124 | } |
| 125 | } else { |
| 126 | for (size_t i = 0; i < values_.size(); ++i) { |
| 127 | // stair petals don't start at rho 0 |
| 128 | // theta = edge_begin rho = bin_value |
| 129 | // theta = edge_end rho = bin_value |
| 130 | // theta = edge_end rho = next bin value |
| 131 | auto arc_between_edges = |
| 132 | linspace(bin_edges_[i], bin_edges_[i + 1], points_per_bin); |
| 133 | for (size_t j = 0; j < arc_between_edges.size(); ++j) { |
| 134 | ss << " " << arc_between_edges[j] << " " |
| 135 | << values_[i] << "\n"; |
| 136 | } |
| 137 | ss << " " << bin_edges_[i + 1] << " " |
| 138 | << values_[(i + 1) % values_.size()] << "\n"; |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | ss << "e\n"; |
| 143 | } |
| 144 | return ss.str(); |
| 145 | } |
| 146 | |