Skip to content

Commit 86857fd

Browse files
committed
Merge SpecMarker size to the variant shape
1 parent 8c8b56d commit 86857fd

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

src/chart/speclayout/bubblechart.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,24 @@ void BubbleChart::generate()
2727
{
2828
auto baseIndex = 0U;
2929

30+
auto firstMarkerSize = markers.empty() ? 0.0 : markers[0].size();
3031
for (auto i = 0U; i < markers.size(); ++i) {
3132
auto &marker = markers[i];
33+
auto markerSize = marker.size();
3234

3335
switch (i) {
3436
case 0:
35-
marker.emplaceCircle(Geom::Point{0, 0}, marker.size);
37+
marker.emplaceCircle(Geom::Point{0, 0}, markerSize);
3638
break;
3739

3840
case 1:
3941
marker.emplaceCircle(
40-
Geom::Point{markers[0].size + marker.size, 0},
41-
marker.size);
42+
Geom::Point{firstMarkerSize + markerSize, 0},
43+
markerSize);
4244
break;
4345

4446
default:
45-
if (marker.size == 0.0) {
47+
if (markerSize == 0.0) {
4648
marker.emplaceCircle(Geom::Point{0, 0}, 0);
4749
continue;
4850
}
@@ -109,14 +111,15 @@ std::optional<Geom::Circle> BubbleChart::getTouchingCircle(
109111
auto first = markers[firstIdx].circle();
110112
auto last = markers[lastIdx].circle();
111113

112-
first.radius += act.size;
113-
last.radius += act.size;
114+
auto &&size = act.size();
115+
first.radius += size;
116+
last.radius += size;
114117

115118
auto newCenter = last.intersection(first)[0];
116119

117120
if (!newCenter) return std::nullopt;
118121

119-
return Geom::Circle(*newCenter, act.size);
122+
return Geom::Circle(*newCenter, size);
120123
}
121124

122125
}

src/chart/speclayout/specmarker.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,35 @@ namespace Vizzu::Charts
1313
struct SpecMarker
1414
{
1515
size_t index;
16-
double size;
17-
std::variant<Geom::Rect, Geom::Circle> shape;
16+
std::variant<double, Geom::Rect, Geom::Circle> sizeOrShape;
1817

19-
SpecMarker(size_t index, double radiusOrAreaFactor) :
18+
SpecMarker(size_t index, double radiusOrAreaFactorSize) :
2019
index(index),
21-
size(radiusOrAreaFactor)
20+
sizeOrShape(radiusOrAreaFactorSize)
2221
{}
2322

2423
template <typename... T> void emplaceCircle(T &&...params)
2524
{
26-
shape.emplace<Geom::Circle>(std::forward<T>(params)...);
25+
sizeOrShape.emplace<Geom::Circle>(std::forward<T>(params)...);
2726
}
2827

2928
void emplaceRect(const Geom::Point &p0, const Geom::Point &p1)
3029
{
31-
shape.emplace<Geom::Rect>(p0, Geom::Size{p1 - p0});
30+
sizeOrShape.emplace<Geom::Rect>(p0, Geom::Size{p1 - p0});
31+
}
32+
33+
[[nodiscard]] const double &size() const
34+
{
35+
return *std::get_if<double>(&sizeOrShape);
3236
}
3337

3438
[[nodiscard]] const Geom::Rect &rect() const
3539
{
36-
return *std::get_if<Geom::Rect>(&shape);
40+
return *std::get_if<Geom::Rect>(&sizeOrShape);
3741
}
3842
[[nodiscard]] const Geom::Circle &circle() const
3943
{
40-
return *std::get_if<Geom::Circle>(&shape);
44+
return *std::get_if<Geom::Circle>(&sizeOrShape);
4145
}
4246

4347
static bool indexOrder(const SpecMarker &a, const SpecMarker &b)
@@ -47,7 +51,7 @@ struct SpecMarker
4751

4852
static bool sizeOrder(const SpecMarker &a, const SpecMarker &b)
4953
{
50-
return b.size < a.size;
54+
return b.size() < a.size();
5155
}
5256
};
5357

src/chart/speclayout/treemap.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void TreeMap::divide(It begin,
4141
}
4242

4343
auto sum = 0.0;
44-
for (auto it = begin; it != end; ++it) sum += it->size;
44+
for (auto it = begin; it != end; ++it) sum += it->size();
4545

4646
if (sum == 0) {
4747
for (auto it = begin; it != end; ++it)
@@ -52,7 +52,7 @@ void TreeMap::divide(It begin,
5252
double factor{};
5353
auto it = begin;
5454
while (it != end)
55-
if (factor += it++->size / sum; factor > 0.4) break;
55+
if (factor += it++->size() / sum; factor > 0.4) break;
5656

5757
auto &&[px, py] = Math::interpolate(p0, p1, factor);
5858

src/chart/speclayout/treemap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class TreeMap
2727

2828
std::vector<SpecMarker> markers;
2929

30-
void divide(It begin,
30+
static void divide(It begin,
3131
It end,
3232
const Geom::Point &p0,
3333
const Geom::Point &p1,

0 commit comments

Comments
 (0)