Skip to content

Commit d4576d6

Browse files
authored
Merge pull request #580 from vizzuhq/Fix-vertical-polar-lines
Fix vertical polar lines
2 parents 8f8f34b + 30ca437 commit d4576d6

File tree

16 files changed

+262
-176
lines changed

16 files changed

+262
-176
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
- Fix again measure axis labels when the axis range and step set too.
88
- Fix drilldown regroup strategy on fake-split charts.
9+
- From now vertical line connections are curved lines.
10+
- Remove duplicated circles on line-circle transition.
11+
- Fix area-circle polar connection transition.
12+
- Fix line-rectangle polar connection linearity.
13+
- Fix all polar connection interpolation (except fading).
14+
- Remove unwanted line connections from line-circle + orientation changed anim.
915

1016
## [0.13.0] - 2024-09-13
1117

src/base/anim/interpolated.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,14 @@ template <typename Type> class Interpolated
132132
return values[has_second && static_cast<bool>(index)];
133133
}
134134

135+
[[nodiscard]] std::optional<InterpolateIndex> get_index(
136+
const Type &type) const
137+
{
138+
if (values[0].value == type) return first;
139+
if (has_second && values[1].value == type) return second;
140+
return {};
141+
}
142+
135143
template <class T>
136144
// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
137145
[[nodiscard]] auto get(T &&) const = delete;

src/chart/generator/plotbuilder.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,7 @@ PlotBuilder::sortedBuckets(const Buckets &buckets, bool main) const
184184

185185
void PlotBuilder::addSpecLayout(Buckets &buckets)
186186
{
187-
auto geometry = plot->getOptions()
188-
->geometry.get_or_first(::Anim::first)
189-
.value;
187+
auto geometry = plot->getOptions()->geometry.values[0].value;
190188
if (auto &markers = plot->markers; isConnecting(geometry)) {
191189
Charts::TableChart::setupVector(markers, true);
192190
}

src/chart/main/style.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,7 @@ struct Font
106106
[[nodiscard]] std::string calculatedFamily() const
107107
{
108108
if (fontFamily.has_value())
109-
if (auto &&ff =
110-
fontFamily->get_or_first(::Anim::first).value;
111-
!ff.empty())
109+
if (auto &&ff = fontFamily->values[0].value; !ff.empty())
112110
return ff;
113111

114112
if (fontParent) return fontParent->calculatedFamily();

src/chart/rendering/colorbuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ColorBuilder::ColorBuilder(const LightnessRange &lightnessRange,
2424
Gfx::Color ColorBuilder::render(
2525
const Anim::Interpolated<Gen::ColorBase> &colorBase) const
2626
{
27-
if (!colorBase.get_or_first(::Anim::first).value.isDiscrete()
27+
if (!colorBase.values[0].value.isDiscrete()
2828
&& !colorBase.get_or_first(::Anim::second)
2929
.value.isDiscrete()) {
3030
auto pos = colorBase.combine(

src/chart/rendering/drawaxes.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,12 +368,11 @@ void DrawAxes::drawDimensionLabel(bool horizontal,
368368
draw(text.get_or_first(index), position.weight);
369369
if (!labelStyle.position->interpolates()
370370
&& !text.interpolates())
371-
draw(text.get_or_first(::Anim::first));
371+
draw(text.values[0]);
372372
else if (labelStyle.position->interpolates())
373-
draw(text.get_or_first(::Anim::first),
374-
position.weight);
373+
draw(text.values[0], position.weight);
375374
else if (text.interpolates()) {
376-
draw(text.get_or_first(::Anim::first));
375+
draw(text.values[0]);
377376
draw(text.get_or_first(::Anim::second));
378377
}
379378
});

src/chart/rendering/drawmarkerinfo.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@ void DrawMarkerInfo::draw(Gfx::ICanvas &canvas,
195195
const Geom::Rect &boundary) const
196196
{
197197
for (const auto &info : plot->getMarkersInfo()) {
198-
auto &&[cnt1, weight1] =
199-
info.second.get_or_first(::Anim::first);
198+
auto &&[cnt1, weight1] = info.second.values[0];
200199
if (!info.second.interpolates() && cnt1) {
201200
MarkerDC dc(*this, canvas, boundary, cnt1);
202201
dc.draw(weight1);

src/chart/rendering/markerrenderer.cpp

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,31 @@ void MarkerRenderer::drawMarkers(Gfx::ICanvas &canvas,
110110

111111
draw(canvas, painter, circle, 1, false);
112112

113-
blended.marker.prevMainMarker.visit(
114-
[this, &blended, &canvas, &painter](
115-
::Anim::InterpolateIndex index,
116-
const auto &value)
117-
{
118-
draw(canvas,
119-
painter,
120-
ConnectingMarker{ctx(),
121-
blended.marker,
122-
index,
123-
Gen::ShapeType::line},
124-
value.weight,
125-
true);
126-
});
113+
auto drawMarker = [this, &blended, &canvas, &painter](
114+
::Anim::InterpolateIndex index,
115+
const auto &value)
116+
{
117+
draw(canvas,
118+
painter,
119+
ConnectingMarker{ctx(),
120+
blended.marker,
121+
index,
122+
Gen::ShapeType::line},
123+
value.weight,
124+
true);
125+
};
126+
127+
if (blended.marker.prevMainMarker.interpolates())
128+
blended.marker.prevMainMarker.visit(drawMarker);
129+
else {
130+
auto index =
131+
getOptions()
132+
.geometry.get_index(Gen::ShapeType::line)
133+
.value();
134+
drawMarker(index,
135+
blended.marker.prevMainMarker.get_or_first(
136+
index));
137+
}
127138
}
128139
else {
129140
std::optional<AbstractMarker> other;
@@ -178,9 +189,7 @@ void MarkerRenderer::drawMarkers(Gfx::ICanvas &canvas,
178189
if (containsSingle) {
179190
auto lineIndex =
180191
isConnecting(
181-
getOptions()
182-
.geometry.get_or_first(::Anim::first)
183-
.value)
192+
getOptions().geometry.values[0].value)
184193
? ::Anim::first
185194
: ::Anim::second;
186195

@@ -195,9 +204,8 @@ void MarkerRenderer::drawMarkers(Gfx::ICanvas &canvas,
195204
}
196205
else
197206
drawMarker(::Anim::first,
198-
::Anim::Weighted{blended.marker.prevMainMarker
199-
.get_or_first(::Anim::first)
200-
.value,
207+
::Anim::Weighted{
208+
blended.marker.prevMainMarker.values[0].value,
201209
sum_weight});
202210
}
203211
}
@@ -211,7 +219,7 @@ void MarkerRenderer::drawLabels(Gfx::ICanvas &canvas) const
211219
if (blended.marker.enabled == false) continue;
212220
drawLabel(canvas,
213221
blended,
214-
axis.unit.get_or_first(::Anim::first).value,
222+
axis.unit.values[0].value,
215223
keepMeasure,
216224
::Anim::first);
217225
drawLabel(canvas,
@@ -270,7 +278,11 @@ void MarkerRenderer::draw(Gfx::ICanvas &canvas,
270278
{Geom::Line(p0, p1), false}))) {
271279
painter.drawStraightLine(line,
272280
abstractMarker.lineWidth,
273-
static_cast<double>(abstractMarker.linear));
281+
getOptions().coordSystem.factor(
282+
Gen::CoordSystem::cartesian)
283+
== 1.0
284+
? 1.0
285+
: static_cast<double>(abstractMarker.linear));
274286

275287
renderedChart.emplace(
276288
Draw::Marker{abstractMarker.marker.enabled != false,

src/chart/rendering/markers/abstractmarker.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ AbstractMarker AbstractMarker::createInterpolated(
6767
{
6868
const auto &options = ctx.getOptions();
6969

70-
auto fromShapeType =
71-
options.geometry.get_or_first(::Anim::first).value;
70+
auto fromShapeType = options.geometry.values[0].value;
7271

7372
auto fromMarker = create(ctx, marker, fromShapeType, lineIndex);
7473

@@ -84,13 +83,25 @@ AbstractMarker AbstractMarker::createInterpolated(
8483
aMarker.labelEnabled =
8584
fromMarker.labelEnabled + toMarker.labelEnabled;
8685

87-
auto sum =
88-
static_cast<double>(fromMarker.enabled + toMarker.enabled);
86+
auto enableFactorBase = static_cast<double>(toMarker.enabled);
87+
auto labelEnableFactorBase =
88+
static_cast<double>(toMarker.labelEnabled);
89+
auto enableSum = static_cast<double>(aMarker.enabled);
90+
auto labelEnableSum = static_cast<double>(aMarker.labelEnabled);
91+
92+
if (marker.polarConnection.interpolates()) {
93+
auto firstWeight = options.geometry.values[0].weight;
94+
auto secondWeight = options.geometry.values[1].weight;
95+
enableSum = firstWeight + secondWeight;
96+
enableFactorBase = secondWeight;
97+
labelEnableSum = firstWeight + secondWeight;
98+
labelEnableFactorBase = secondWeight;
99+
}
89100

90101
using Math::interpolate;
91102
using Vizzu::Draw::interpolate;
92-
if (sum > 0.0) {
93-
auto factor = static_cast<double>(toMarker.enabled) / sum;
103+
if (!Math::Floating::is_zero(enableSum)) {
104+
auto factor = enableFactorBase / enableSum;
94105
aMarker.morphToCircle = interpolate(fromMarker.morphToCircle,
95106
toMarker.morphToCircle,
96107
factor);
@@ -109,11 +120,8 @@ AbstractMarker AbstractMarker::createInterpolated(
109120
aMarker.center =
110121
interpolate(fromMarker.center, toMarker.center, factor);
111122
}
112-
sum = static_cast<double>(
113-
fromMarker.labelEnabled + toMarker.labelEnabled);
114-
if (sum > 0.0) {
115-
auto factor =
116-
static_cast<double>(toMarker.labelEnabled) / sum;
123+
if (!Math::Floating::is_zero(labelEnableSum)) {
124+
auto factor = labelEnableFactorBase / labelEnableSum;
117125
aMarker.dataRect = interpolate(fromMarker.dataRect,
118126
toMarker.dataRect,
119127
factor);

src/chart/rendering/markers/connectingmarker.cpp

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,36 @@ ConnectingMarker::ConnectingMarker(const DrawingContext &ctx,
2929
auto isLine = type == Gen::ShapeType::line;
3030
auto isArea = type == Gen::ShapeType::area;
3131

32+
auto needConnection =
33+
!ctx.getOptions().geometry.interpolates()
34+
|| isConnecting(
35+
ctx.getOptions().geometry.get_or_first(lineIndex).value);
36+
37+
auto otherNeedConnection = isConnecting(
38+
ctx.getOptions()
39+
.geometry
40+
.get_or_first(lineIndex == ::Anim::first ? ::Anim::second
41+
: ::Anim::first)
42+
.value);
43+
3244
auto polar = ctx.getOptions().coordSystem.factor<Math::FuzzyBool>(
3345
Gen::CoordSystem::polar);
3446
auto horizontal =
3547
ctx.getOptions().orientation.factor<Math::FuzzyBool>(
3648
Gen::Orientation::horizontal);
3749

38-
linear = !polar || horizontal;
50+
auto &&isHorizontal =
51+
ctx.getOptions().orientation.get_or_first(lineIndex).value
52+
== Gen::Orientation::horizontal;
53+
54+
linear = !polar || horizontal
55+
|| Math::FuzzyBool::And(
56+
!isHorizontal
57+
&& ctx.plot->axises.at(Gen::Channel::Type::x)
58+
.dimension.enabled,
59+
ctx.plot->axises.at(Gen::Channel::Type::x)
60+
.measure.enabled.factor(false),
61+
!horizontal);
3962

4063
lineWidth[0] = lineWidth[1] = 0;
4164

@@ -49,7 +72,8 @@ ConnectingMarker::ConnectingMarker(const DrawingContext &ctx,
4972
if (prev) {
5073
enabled = labelEnabled && prev->enabled;
5174
connected = Math::FuzzyBool::And(enabled,
52-
marker.prevMainMarker.get_or_first(lineIndex).weight);
75+
marker.prevMainMarker.get_or_first(lineIndex).weight,
76+
needConnection);
5377
if (auto &&pc =
5478
marker.polarConnection.get_or_first(lineIndex);
5579
pc.value) {
@@ -59,6 +83,9 @@ ConnectingMarker::ConnectingMarker(const DrawingContext &ctx,
5983
|| Math::FuzzyBool::Or(polar, pc.weight).more();
6084
connected = connected && newPolar && horizontal;
6185
enabled = enabled && newPolar && horizontal;
86+
87+
if (polar != false && prev != &marker)
88+
linear = linear || Math::FuzzyBool{isHorizontal};
6289
}
6390
}
6491
else {
@@ -92,13 +119,13 @@ ConnectingMarker::ConnectingMarker(const DrawingContext &ctx,
92119
auto prevSpacing = prev->spacing * prev->size / 2;
93120
auto prevPos = prev->position;
94121

95-
if (polar != false
96-
&& ctx.getOptions()
97-
.orientation.get_or_first(lineIndex)
98-
.value
99-
== Gen::Orientation::horizontal
100-
&& prev != &marker && prevPos.x >= 1) {
101-
prevPos.x -= 1;
122+
if (polar != false && isHorizontal && prev != &marker) {
123+
if (!otherNeedConnection
124+
&& marker.polarConnection.get_or_first(lineIndex)
125+
.value)
126+
prevPos.x = 0;
127+
else if (prevPos.x >= 1)
128+
prevPos.x -= 1;
102129
}
103130

104131
points[3] = prevPos - prevSpacing;

0 commit comments

Comments
 (0)